题目描述
组队列是队列结构中一种常见的队列结构,在很多地方有着广泛应用。组队列是是指队列内的元素分组聚集在一起。组队列包含两种命令:
1、 ENQUEUE,表示当有新的元素进入队列,首先会检索是否有同一组的元素已经存在,如果有,则新元素排在同组的最后,如果没有则插入队列末尾。
2、 DEQUEUE,表示队列头元素出队
3、 STOP,停止操作
输入
第1行输入一个t(t<=10),表示1个队列中有多少个组
第2行输入一个第1组的元素个数和数值
第3行输入一个第2组的元素个数和数值
以此类推输入完t组以定义同组元素之后,开始输入多个操作命令(<200),对空的组队列进行操作,例如输入ENQUEUE 100,表示把元素100插入队列
输入样例1:
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
输入样例2:3
3 101 102 103
3 201 202 203
3 301 302 303
ENQUEUE 201
ENQUEUE 301
ENQUEUE 102
DEQUEUE
DEQUEUE
DEQUEUE
ENQUEUE 101
ENQUEUE 203
ENQUEUE 302
ENQUEUE 301
DEQUEUE
DEQUEUE
DEQUEUE
STOP
输出
DEQUEUE出队的元素
输出样例1:
101 102 103
输出样例2:
201 301 102 101 203 302
代码
#include <iostream>
#include <stack>
#include <queue>
using namespace std;
int toFind(int num, int **key, int t){ //查找该数所在的组序号
for(int i = 0; i < t; i++){
int a = sizeof(key[i])/sizeof(key[i][0]);
for(int j = 0; j <= a; j++){
if(num == key[i][j]){
return i;
}
}
}
}
int main()
{
int t,k,flag=0;
cin >> t;
int **key = new int*[t];
for(int i = 0; i < t; i++){
cin >> k;
key[i] = new int[k];
for(int j = 0; j < k; j++){
cin >> key[i][j];
}
}
queue<int> que[t];
string s;
int data,index;
while(1){
cin >> s;
if(s == "STOP"){
cout << endl; //题目给出的两个案例格式不一样,要不要这行具体看提交代码的结果
break;
} else if(s == "ENQUEUE"){
cin >> data;
index = toFind(data, key, t);
for(int i = 0; i < t; i++){
if(!que[i].empty()){
if(index == toFind(que[i].front(), key, t)){
que[i].push(data);
break;
}
}else{
que[i].push(data);
break;
}
}
}else{
if(flag == 1){
cout << " ";
}
for(int i = 0; i < t; i++){
if(!que[i].empty()){
cout << que[i].front();
que[i].pop();
flag = 1;
break;
}
}
}
}
return 0;
}