DS队列 组队列

题目描述
组队列是队列结构中一种常见的队列结构,在很多地方有着广泛应用。组队列是是指队列内的元素分组聚集在一起。组队列包含两种命令:
1、 ENQUEUE,表示当有新的元素进入队列,首先会检索是否有同一组的元素已经存在,如果有,则新元素排在同组的最后,如果没有则插入队列末尾。
2、 DEQUEUE,表示队列头元素出队
3、 STOP,停止操作
建议使用C++自带的队列对象queue,编程更方便
输入
第1行输入一个t(t<=10),表示1个队列中有多少个组
第2行输入一个第1组的元素个数和数值
第3行输入一个第2组的元素个数和数值
以此类推输入完t组之后,开始输入多个操作命令(<200),例如输入ENQUEUE 100,表示把元素100插入队列
最后输入STOP,表示输入命令结束
输出
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

思路

这里的组并不是存在队列里的,真正的存在队列里的数据是ENQUEUE后的内容

#include<iostream>
#include<queue>
#include<vector>
#include<stack>
#include<iomanip>
#include<map>
using namespace std;
const int maxx= 100+20;
int shu[maxx]; 
int sh= 0;
 
int getsh(int a){//判断该组的数据是否已经输入过了,如果没有则记录顺序
    for(int i= 0; i< sh; i++)
     if(shu[i]== a)
       return 1;
        
       return 0;
}
int main(){
     
    int t;
    int n;
    cin>>t;
    int o= t;
    map<string, int> ma;
    queue<string> que[maxx];
 
    for(int i= 0; i< maxx; i++)//初始数组
     shu[i]= -1;
      
    int i= 0;
    while(t--){
        cin>>n;
        while(n--){
            string s;
            cin>>s;
             
            ma[s]= i;
        }
        i++;
          
    }
     
    int flag= 0;
     
    while(1){
        string str;
        string in;
        cin>>str;
         
        if(str== "STOP")
         break;
          
        if(str== "ENQUEUE"){
            map<string, int>::iterator it;
            cin>>in;
            it= ma.find(in);//查找组队列中是否有该数据,如果没有则输出最后位置的地址
             
            if(it!= ma.end()){//找到数据则进入
                ma.insert(pair<string, int>(in, it->second));
                que[it->second].push(in);
                 
                if(!getsh(it->second)){
                    shu[sh++]= it->second;
                }
                  
            }
            else{
                ma.insert(pair<string, int>(in, o- 1));
                que[o- 1].push(in);
                 
                if(!getsh(o- 1)){
                    shu[sh++]= o- 1;
                }
            }
        }
         
        if(str== "DEQUEUE"){
            int i =0;
            int j= 0;
            while(true){
                if(que[shu[j]].empty())
                 j++;
                else{
                    if(!flag){
                        cout<<que[shu[j]].front();
                        flag++;
                    }
                    else
                     cout<<' '<<que[shu[j]].front();
                    que[shu[j]].pop();
                    break;
                }
            }
        }
    }
    cout<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_41879093/article/details/82843876
今日推荐