zoukankan      html  css  js  c++  java
  • 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 ",++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 ",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(" ");
        }
        return 0;
    }

  • 相关阅读:
    SQL 多组数据中取每一组最新的数据
    HTML 滚动显示数据
    EasyUI datagrid-export 将datagrid的数据导出至Excel-解决科学计数法
    C#连接SAP并下载工单资料【生产系统与ERP对接】
    BAPI_TRANSACTION_COMMIT
    生产追溯系统-Raspberry Pi帮助我们节省大量硬件成本,助力信息化建设
    YII2 使用phpexcel(干货)
    ThinkPHP 文件上传到阿里云OSS上(干货)
    mysql与mycat搭建实现集群与读写分离
    mysql 表分区技术
  • 原文地址:https://www.cnblogs.com/qingtianBKY/p/6666398.html
Copyright © 2011-2022 走看看