c++ queue

/*
queue 的基本操作有:
入队,如例:q.push(x); 将x 接到队列的末端。
出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
访问队首元素,如例:q.front(),即最早被压入队列的元素。
访问队尾元素,如例:q.back(),即最后被压入队列的元素。
判断队列空,如例:q.empty(),当队列空时,返回true。
访问队列中的元素个数,如例:q.size()


问题:有t个团队的人正在排一个长队.每次新来一个人时,如果他有队友在排队,那么这个新人会插队到最后一个队友的身后.如果没有任何一个队友排队,则他
    会排到长队的队尾.输入每个团队中所有队员的编号,要求支持如下3种指令
    ENQUEUE:x编号为x的人进入长队
    DEQUEUE:长队的队首出队
    STOP:停止模拟

解题思路: 可以理解成一个队列中有许多小的队列组成
样例:
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
*/
#include<cstdio>
#include<queue>
#include<map>
using namespace std;
const int maxt=1010;
int main(){
    int t,kase=0;
    while(scanf("%d",&t)==1&&t){
        printf("Scenario #%d\n",++kase);
        //记录所有认的团队编号
        map<int,int> team;//team[x] 表示编号为x的人所在的团队编号
        for(int i=0;i<t;i++){
            int n,x;
            scanf("%d",&n);
            while(n--){
                scanf("%d",&x);//每个小队列的元素
                team[x]=i;
            }
        }
        queue<int>q,q2[maxt];//q是团队的队列(长队),而q2[i]是团队i成员的队列
        for(;;){
            int x;
            char cmd[10];
            scanf("%s",cmd);
            if(cmd[0]=='S')break;
            else if(cmd[0]=='D'){
                int t=q.front();//找到长队的队首(就是小队列的整体组成的一个元素)
                printf("%d\n",q2[t].front());
                q2[t].pop();//弹出大队列中小队列的队首
                if(q2[t].empty())q.pop();
            }
            else if(cmd[0]=='E'){
                scanf("%d",&x);//输入x
                int t=team[x];//找到x所在团队编号
                if(q2[t].empty())q.push(t);//团队t进入队列
                q2[t].push(x);
            }
        }
        printf("\n");
    }
    return 0;
}

posted @ 2017-04-04 20:48  qingtianBKY  阅读(520)  评论(0编辑  收藏  举报