銀行業務隊列簡單模擬
設某銀行有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; }
---恢復內容結束---