c++STL 資料結構之queue佇列應用
規則: 先進先出!!!
1.queue 的基本操作有:
入隊,如例:q.push(x); 將x 接到佇列的末端。
出隊,如例:q.pop(); 彈出佇列的第一個元素,注意,並不會返回被彈出元素的值。
訪問隊首元素,如例:q.front(),即最早被壓入佇列的元素。
訪問隊尾元素,如例:q.back(),即最後被壓入佇列的元素。
判斷佇列空,如例:q.empty(),當佇列空時,返回true。
訪問佇列中的元素個數,如例:q.size()
注: queue不支援下表操作和迭代器訪問!
2.題目背景
佇列和優先順序佇列是大多數電腦科學家都知道的資料結構
。但是團隊佇列卻不被人熟知,儘管在生活中經常出現。比如,午餐時間的食堂門口的佇列就是一個團隊佇列。在一個團隊佇列中,每個元素屬於一個團隊。如果一個元素進入一個佇列,它首先從頭到尾地搜尋這個佇列——檢查是否它的隊友(在同一個團隊稱之為隊友)也在這個佇列裡。如果有,它就排在它隊友的後面(:-D就是插隊咯~~)。如果沒有,它就排在整個佇列的最後,成為新的最後一名(/(ㄒoㄒ)/~真是不幸)。在普通佇列中出隊是這樣的:元素從頭到尾的被處理,按他們出現在團隊佇列裡的順序。你的任務是寫一個程式模擬這樣一個團隊佇列。
輸入
輸入檔案會包含一個或多個測試樣例。每一個測試樣例由代表團隊數量的t(1<=t<=1000)開始。然後t只團隊描述如下,每一個團隊由一個表示元素個數的數字,以及每個元素組成。元素屬於整型,並且範圍在0到999999(一百萬減一)之間。一個團隊可能有多達1000個元素。最後,指令列表如下。有三種不同的指令:ENQUEUE x——x進入團隊佇列。DEQUEUE x——處理第一個元素並將其移除STOP——結束一個測試樣例。當t是0時,輸入終止。警告:一個測試樣例可能多達200000(/(ㄒoㄒ)/~~二十萬)條指令,所以團隊佇列的實現應該是有效率的:入隊和出隊都應該花費常數時間。
輸出
對應每個測試樣例,首先輸出一行“Scenario #k”,其中k表示第幾次測試。然後,每一個“DEQUEUE”指令列印包含出隊的元素(單獨佔一行)。列印一空行在每一個測試樣例之後,即使是最後一個測試樣例。
例如:Sample Input
2
3 101 102 103
3 201 202 203
ENQUEUE 101
ENQUEUE 201
ENQUEUE
102
ENQUEUE 202
ENQUEUE 103
ENQUEUE
203
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
STOP
2
5
259001 259002 259003 259004 259005
6 260001 260002 260003 260004 260005
260006
ENQUEUE 259001
ENQUEUE 260001
ENQUEUE 259002
ENQUEUE
259003
ENQUEUE 259004
ENQUEUE 259005
DEQUEUE
DEQUEUE
ENQUEUE
260002
ENQUEUE
260003
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
STOP
0
Sample Output
Scenario
#1
101
102
103
201
202
203
Scenario
#2
259001
259002
259003
259004
259005
260001
————————————————————————————————————————————————————
思路:排兩個佇列,主佇列排隊伍編號,副佇列有n個,是每一個隊伍內的佇列,通過主佇列首元素和副佇列對應隊伍首元素來出人!!注意空佇列的處理!!!
程式碼:
#include <iostream>
#include<map>
#include<queue>
const int maxn=1100;
using namespace std;
int main()
{
int n;
int k=0;
while(cin>>n&&n)
{
k++;
cout<<"Scenario #"<< k<<endl;
map<int,int> team;
int N;
for(int i=0;i<n;i++)
{
cin>>N;
for(int j=1;j<=N;j++)//隊伍編號
{
int person;
cin>>person;//輸入個人號碼
team[person]=i;//在對映裡將個人號碼對應隊伍編號儲存(因為下面輸入的是個人編號,方便直接找到隊伍)
}
}
queue<int> q,q2[maxn];//q是主佇列,q2是副佇列對應每一隊
string operate;
while(1)
{
cin>>operate;//指令
if(operate[0]=='S')break;
if(operate[0]=='E')//入隊
{
int x;
cin>>x;
if(q2[team[x]].empty())q.push(team[x]);//尋找是否有隊友,有就插隊,沒有建立隊伍
q2[team[x]].push(x);
}
else if(operate[0]=='D')//出隊
{
int t=q.front();
cout<<q2[t].front()<<endl;//出最前面隊伍編號的第一個人
q2[t].pop();//彈出
if(q2[t].empty())//判斷隊伍是否為空
q.pop();
}
}
cout<<endl;
}
return 0;
}
思路