银行排队模拟(队列)

银行排队模拟程序

队列类Queue

#ifndef QUEUE_H
#define QUEUE_H
struct Record                                            //顾客结构体
{
    int ArrivedTime;                                     //顾客到达时间
    int CostTime;                                        //顾客办理时间
    int Num;                                             //顾客编号
};
const int QueueSize=10;
class Queue
{
    public:
        Queue();                                          //构造函数
        virtual ~Queue();                                 //析构函数
        void addFirst(int x,int y,int z);                 //入队
        int popLast();                                    //出队
        int Getqueue1();                                  //获取队头元素的到达时间
        int Getqueue2();                                  //获取队头元素的办理时间
        int Getqueue3();                                  //获取队头元素的编号
        bool Empty(){
            if(front==rear) return true;
            else return false;
        }
        Record data[QueueSize];
        int front,rear;
};
#endif
#include "Queue.h"
#include<stdio.h>
#include<stdlib.h>
Queue::Queue()
{
    //ctor
    int data=(int)malloc(2*sizeof(QueueSize));
    front=rear=QueueSize-1;
}
Queue::~Queue()
{
    //dtor
    delete []data;
}
void Queue::addFirst(int x,int y,int z)
{
    if((rear+1)%QueueSize==front) throw"иорГ";
    rear=(rear+1)%QueueSize;
    data[rear].ArrivedTime=x;
    data[rear].CostTime=y;
    data[rear].Num=z;
}
int Queue::popLast()
{
    if(rear==front) throw"обрГ";
    front=(front+1)%QueueSize;
    return 0;
}
int Queue::Getqueue1()
{
    if(rear==front) throw"обрГ";
    int i=(front+1)%QueueSize;
    return data[i].ArrivedTime;
}
int Queue::Getqueue2()
{
    if(rear==front) throw"обрГ";
    int i=(front+1)%QueueSize;
    return data[i].CostTime;
}
int Queue::Getqueue3()
{
    if(rear==front) throw"обрГ";
    int i=(front+1)%QueueSize;
    return data[i].Num;
}
#ifndef MODELQUEUE_H
#define MODELQUEUE_H
#include <Queue.h>
struct bankWindow                                  //银行窗口结构体
{
    int Runningtime;                               //银行窗口的已办公时间
    int number;                                    //银行窗口号
    int needtime;                                  //银行窗口顾客所需办理时间
    bool V;                                        //银行窗口顾客类型(普通和VIP)
};
class Modelqueue : public Queue
{
    public:
        Modelqueue();                              //构造函数
        virtual ~Modelqueue();                     //析构函数
        void Modelbank();                          //模拟函数
};
#endif // MODELQUEUE_H

模拟排队类Modelqueue

#include "Modelqueue.h"
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<bits/stdc++.h>
#include<time.h>
using namespace std;
Modelqueue::Modelqueue()
{
    //ctor
}
Modelqueue::~Modelqueue()
{
    //dtor
}
void Modelqueue::Modelbank()
{
    int time=0,f=0,r=30;
    //int Window[4];
    Queue Vipc;
    Queue comc;
    int flag;//1为VIP,0为普通
    Record customer;
    int winnum;
    cout <<"窗口数量:";
    cin>>winnum;
    struct bankWindow b[winnum];
    int n;
    cout<<"顾客数量:";
    cin>>n;
    cout << "------模拟开始------" << endl<<"初始化用户:"<<endl<<"是否VIP | 到达时间 | 办公时间 | 编号"<<endl;
    //cout<<n<<endl;
    while(n--)
    {
        scanf("%d %d %d %d",&flag,&customer.ArrivedTime,&customer.CostTime,&customer.Num);
        if(flag==1) Vipc.addFirst(customer.ArrivedTime,customer.CostTime,customer.Num);
        else comc.addFirst(customer.ArrivedTime,customer.CostTime,customer.Num);
    }
    Sleep(1000);
    system("cls");
    cout<<endl<<endl;
    for(int win=0;win<winnum;win++)
    {
        if(Vipc.Getqueue1()==time)
        {
            cout<<"   VIP客户,    编号为:"<<Vipc.Getqueue3()<<"   请进入   "<<win<<"号窗口服务"<<endl<<endl;
            b[win].number = Vipc.Getqueue3();
            b[win].needtime = Vipc.Getqueue2();
            b[win].Runningtime = 1;
            b[win].V=true;
            Vipc.popLast();
        }
        else if(comc.Getqueue1()==time)
        {
            cout<<"   普通客户,   编号为:"<<comc.Getqueue3()<<"   请进入   "<<win<<"号窗口服务"<<endl<<endl;
            b[win].number = comc.Getqueue3();
            b[win].needtime = comc.Getqueue2();
            b[win].Runningtime = 1;
            b[win].V=false;
            comc.popLast();
        }
        else b[win].Runningtime=0;
    }
    while(1)
    {
        Sleep(2000);
        system("cls");
        cout<<endl<<endl<<"-当前模拟时间:"<<time<<"-分钟-"<<endl<<endl;
        cout<<"窗口    "<<"   窗口状态   "<<"     客户类型    "<<" 客户编号   "<<endl<<"------------------------------------------------"<<endl<<endl;
        for(int i=0;i<winnum;i++)
        {
            if(time==0)
            {
                cout<<"窗口"<<i<<":    -等待服务-    "<<endl<<endl;
            }
            else if(time!=0&&b[i].Runningtime!=0)
            {
                cout<<"窗口"<<i<<":    -正在服务-    ";
                if(b[i].V==true) cout<<"    VIP        "<<b[i].number<< endl<<endl;
                else cout<<"   普通        "<<b[i].number<<endl<<endl;
            }
            else cout<<"窗口"<<i<<":    -等待服务-   "<<endl<<endl;
            if(b[i].Runningtime==b[i].needtime+1)
            {
                b[i].Runningtime=0;
            }
            else if(b[i].Runningtime==0)
            {
                if(Vipc.Empty()==false&&Vipc.Getqueue1()<time+1)
                {
                    b[i].number = Vipc.Getqueue3();
                    b[i].needtime = Vipc.Getqueue2();
                    b[i].Runningtime +=1;
                    b[i].V=true;
                    Vipc.popLast();
                }
                else if(comc.Empty()==false&&comc.Getqueue1()<time+1)
                {
                    b[i].number = comc.Getqueue3();
                    b[i].needtime = comc.Getqueue2();
                    b[i].Runningtime += 1;
                    b[i].V=false;
                    comc.popLast();
                }//if(time==6) cout<<Vipc.Empty()<<endl;
                //else time=19;
            }
            else
            {
                b[i].Runningtime++;
            }
        }
        time++;
        if(Vipc.Empty()==true&&comc.Empty()==true&&f==0)
        {
            r=time+7;
            f=1;
        }
        if(time==r) break;
    }
    Sleep(3000);
    system("cls");
    int g=10;
    while(g--)
    {
        if(g==9) cout<<endl<<endl<<"哈哈,服务结束啦,银行下班啦"<<endl;
        for(int i=0;i<100-g*10;i++)
        {
            cout<<" ";
        }
        cout<<"谢谢观看"<<endl;
    }
}

主函数

#include <iostream>
#include<stdio.h>
#include<queue>
#include<stdlib.h>
#include<time.h>
#include "Modelqueue.h"
using namespace std;
/*
样例
4
10
0 0 5 1001
0 0 4 1002
1 0 5 1003
0 1 4 1004
1 1 6 1005
0 1 7 1006
0 2 4 1007
1 4 5 1008
0 5 5 1009
1 5 4 1010
*/
int main()
{
    Modelqueue bank;
    bank.Modelbank();
    return 0;
}

以下是运行窗口图:

银行排队模拟(队列)
银行排队模拟(队列)

银行排队模拟(队列)

银行排队模拟(队列)
银行排队模拟(队列)

银行排队模拟(队列)