利用队列仿真一个银行叫号系统,定义开户、取款、存款、销户四种业务,每个业务时长不同,大家可以提前定义好(比如开户20分钟,取款15分钟,存款10分钟,销户25分钟),定义m个服务窗口,随机生成n个业务(放在队列中存储),编写程序仿真出这m个窗口具体办理的客户的顺序。
叫号系统的的输出类似这样:比如10个人,他们办理的业务类型是随机的,有3个服务窗口,输出的是:
客户1,1号窗口,
客户2,2号窗口,
客户3,3号窗口;
客户4,3号窗口;
…….
#include<iostream>
using namespace std;
typedef struct User
{
int id;
int val;
}User;
User stu[7] = { {1,1},{2,2},{3,3},{4,3},{5,1},{6,4},{7,3} };//客户数组
int timenum[5] = {0,20,15,10,25 };//操作时间数组,多设一个便于检索
int account[3] = { 0 };//三个窗口时间变化数组
//char string[4][12] = {"开户","取款","存款","销户"};
class Queue
{
public:
int maxsize;
int front;
int rear;
struct User* stx;
Queue(int size)//初始化
{
maxsize = size;
stx = new User[size];
front = rear = 0;
}
~Queue()
{
delete[]stx;
}
bool EnQueue(User x)//入栈
{
if ((rear + 1) % maxsize == front)
{
cout << "栈满,溢出" << endl;
return false;
}
stx[rear] = x;
rear = (rear + 1) % maxsize;
return true;
}
bool DeQueue(User &x)//出栈
{
if (front == rear)
{
cout << "队列为空" << endl;
return false;
}
x = stx[front];
front = (front + 1) % maxsize;
return true;
}
};
int main()
{
Queue queue(8);
for (int i = 0;i < 7;i++)//初始化
{
queue.EnQueue(stu[i]);
}
User w[3],cru;
for (int i = 0;i < 3;i++)//初始化窗口
{
queue.DeQueue(cru);
w[i] = cru;
account[i] = timenum[w[i].val];
cout << "客户" << w[i].id << " 窗口" << i+ 1 << endl;
}
while (queue.front != queue.rear)//循环
{
int j = 0;
while (j< 3)
{
if (account[j] == 0)//如果有窗口结束,则换人
{
queue.DeQueue(cru);
w[j] = cru;
account[j] = timenum[w[j].val];
cout << "客户" << w[j].id << " 窗口" << j + 1 << endl;//一旦交替,就输出
}
j++;
}
for (int i = 0;i < 3;i++)//表示时间的流逝
{
account[i]--;
}
}
return 0;
}