使用顺序(循环、非循环均可)队列模拟业务员到银行排队办理业务的情况,在这个过程中,主要重复两件事:(1)取号排队:业务员到达银行网点,在取号机上选择办理业务排队,加入排队队列,并打印显示自己的编号和排第几;(2)办理业务:银行柜员从队列中取出排在最前面的人的编号,为之服务。要求能够随时取号排队,办理业务和查看等待办理业务的序号,以及下班时,没有办理业务的编号。
要求:设置一个菜单,完成(1)取号:编号增1,加入到排队的队列中;判断队列是否满;并打印显示自己的编号和排第几。 (2)办理;取出排在最前面的编号,让其办理业务,并将其从队列中删除。(3)查看;列出从队头到队尾的所有编号(4)下班:退出运行,输出队列中剩下的编号和已经办理完成的编号数量。
typedef struct {
int items[100];
int front, rear;
}SqQueue;
int EnQueue(SqQueue* Q, int e) //入队列
{
if ((Q->rear + 1) % 100 == Q->front) {
printf("队列已满,无法办理业务!\n");
return 0;
}
Q->items[Q->rear] = e;
Q->rear = (Q->rear + 1) % 100;
return 0;
}
int DeQueue(SqQueue* Q, int &e) //出队列
{
if (Q->front == Q->rear) {
printf("无人等待办理业务!\n");
return 0;
}
e = Q->items[Q->front];
Q->front = (Q->front + 1) % 100;
return 0;
}
int TraverseQueue(SqQueue Q) //遍历队列
{
int pos;
pos = Q.front;
while ((pos + 1) % 100 <= Q.rear) {
cout<<Q.items[pos]<<" ";
pos++;
}
return 0;
}
int main()
{
SqQueue A;
SqQueue* Q = &A;
Q->front = 0; //初始化
Q->rear = 0;
int e=1,num=0;
int order=0;
while (order!=4)
{
cout << "请输入指令(1:取号 2:办理 3:查看 4:下班)" << endl;
cin >> order;
switch (order)
{
case 1:
EnQueue(Q, e); //取号即为入队列
cout << "编号:" << e << " 在您前面有"<<Q->rear-1<<"人等待" << endl;
e++;
break;
case 2:
DeQueue(Q, e); //办理即为出队列,先入先出
cout << "办理编号为:" << e << endl;
num++; //办理一次,num+1
break;
case 3:
cout << "等待办理的编号为:" ;
TraverseQueue(A); //遍历队列输出
cout << endl;
break;
case 4:
cout << "还未办理的编号为:" ;
TraverseQueue(A);
cout << " ";
cout <<"已办理完成:"<< num; //num为办理操作次数
break;
}
}
return 0;
}
运行结果: