银行业务队列简单模拟
设某银行有A、B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 —— 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客。给定到达银行的顾客序列,请按业务完成的顺序输出顾客序列。假定不考虑顾客先后到达的时间间隔,并且当不同窗口同时处理完2个顾客时,A窗口顾客优先输出。
输入格式:
输入为一行正整数,其中第1个数字N(≤1000)为顾客总数,后面跟着N位顾客的编号。编号为奇数的顾客需要到A窗口办理业务,为偶数的顾客则去B窗口。数字间以空格分隔。
输出格式:
按业务处理完成的顺序输出顾客的编号。数字间以空格分隔,但最后一个编号后不能有多余的空格。
输入样例:
8 2 1 3 9 4 11 13 15
输出样例:
1 3 2 9 11 4 13 15
分析:此题应该建立两个队列,一个用来存储奇数,一个用来存储偶数。然后根据两个队列元素个数的关系,进行两种情况的输出。
时刻注意队列是否为空,这是代码运行较为关键的一点。
代码如下:
#include<iostream> using namespace std; struct queue //创建一个队列 { int data[1000]; //录入队列数据 int top; //记录队头,方便取值 int tail; //记录插入元素的个数 } ; void Init(queue *q) //初始化 { q->tail=-1; q->top=-1; } void Push(queue &q,int num) //队列输入 { q.tail++; q.data[q.tail]=num; } int Pop(queue &q) //队列输出 { q.top ++; return q.data [q.top]; //返回队列头元素 } int main() { queue a; //创建队列a,存入奇数 queue b; //创建队列b,存入偶数 Init(&a); //初始化a队列 Init(&b); //初始化b队列 int ca=0, cb=0; //ca,cb用来记录队列a,b的元素个数 int n,c; cin>>n; //输入数字的总个数 for(int i=0;i<n;i++) { cin>>c; //输入数据 if(c%2==0) //偶数存入b队列 { Push(b,c); cb++; //b队列个数加1 } else{ Push(a,c); //奇数存入队列a ca++; //a队列个数加1 } } if(ca>2*cb) //队列的输出(第一种可能) { while(ca!=0||cb!=0) { if(ca!=0) { cout<<Pop(a); ca--; if(ca!=0) { cout<<" "; cout<<Pop(a); ca--; } if(ca!=0) { cout<<" "; } if(cb!=0) { cout<<Pop(b); cb--; cout<<" "; } } } } if(ca<=cb*2) //队列的输出(第二种可能) { while(ca!=0||cb!=0) { if(ca!=0) { cout<<Pop(a)<<" "; ca--; cout<<Pop(a)<<" "; ca--; } if(cb!=0){ cout<<Pop(b); cb--; if(cb!=0) { cout<<" "; } } } } return 0; }