DS队列--组队列

题目描述

组队列是队列结构中一种常见的队列结构,在很多地方有着广泛应用。组队列是是指队列内的元素分组聚集在一起。组队列包含两种命令:

1、 ENQUEUE,表示当有新的元素进入队列,首先会检索是否有同一组的元素已经存在,如果有,则新元素排在同组的最后,如果没有则插入队列末尾。

2、 DEQUEUE,表示队列头元素出队

3、 STOP,停止操作

建议使用C++自带的队列对象queue,编程更方便

 

 

输入

第1行输入一个t(t<=10),表示1个队列中有多少个组

第2行输入一个第1组的元素个数和数值

第3行输入一个第2组的元素个数和数值

以此类推输入完t组以定义同组元素之后,开始输入多个操作命令(<200),对空的组队列进行操作,例如输入ENQUEUE 100,表示把元素100插入队列

 

 

 

输出

DEQUEUE出队的元素

样例输入

2 3 101 102 103 3 201 202 203 ENQUEUE 101 ENQUEUE 201 ENQUEUE 102 ENQUEUE 202 ENQUEUE 103 ENQUEUE 203 DEQUEUE DEQUEUE DEQUEUE STOP

样例输出

101 102 103

提示

#include<iostream>
#include<queue>
#include<map>
using namespace std;
int main()
{
    int T;
    cin>>T;
    int value;
    map<int,int>mem;///map提供key--value映射,此处每个key(101、102、103)的value都是1,(201、202、203)的value都是2
    int flag=1;
    int number;
    queue<int>que[T];
    queue<int>output;
    for(int i=0;i<T;i++)
    {
        cin>>number;
        while(number--)
        {
            cin>>value;
            mem[value]=i;
        }
    }
    string oper;
    while(cin>>oper&&oper!="STOP")
    {
        if(oper=="ENQUEUE")
        {
            cin>>value;
            for(int i=0;i<T;i++)
            {
                if(que[i].empty()||mem[que[i].front()]==mem[value])///如果队列空或该key所对应的value值与某个队列队首相同则入该队
                {
                    que[i].push(value);
                    break;
                }
            }
        }
        else if(oper=="DEQUEUE")
        {
            for(int i=0;i<T;i++)
            {
                if(!que[i].empty())
                {
                    output.push(que[i].front());
                    que[i].pop();
                    break;
                }
            }
        }
    }///存起来用output队列输出
    while(!output.empty())
    {
        if(flag==1)
        {
            flag=0;
            cout<<output.front();
        }
        else
            cout<<" "<<output.front();
        output.pop();
    }
    cout<<endl;
    return 0;
}
上一篇:两种方法将oracle数据库中的一张表的数据导入到另外一个oracle数据库中


下一篇:队列