题目描述
组队列是队列结构中一种常见的队列结构,在很多地方有着广泛应用。组队列是是指队列内的元素分组聚集在一起。组队列包含两种命令:
1、 ENQUEUE,表示当有新的元素进入队列,首先会检索是否有同一组的元素已经存在,如果有,则新元素排在同组的最后,如果没有则插入队列末尾。
2、 DEQUEUE,表示队列头元素出队
3、 STOP,停止操作
建议使用C++自带的队列对象queue,编程更方便
输入
第1行输入一个t(t<=10),表示1个队列中有多少个组
第2行输入一个第1组的元素个数和数值
第3行输入一个第2组的元素个数和数值
以此类推输入完t组以定义同组元素之后,开始输入多个操作命令(<200),对空的组队列进行操作,例如输入ENQUEUE 100,表示把元素100插入队列
输出
DEQUEUE出队的元素
输入样例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
输出样例1
101 102 103
输入样例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
输出样例2
201 301 102 101 203 302
#include <iostream>
#include <queue>
using namespace std;
bool IsSameType(int data, queue<int> q, int** sort, int* num, int t)
{
if (q.empty())
return false;
int qnum, datanum;
for (int i = 0; i < t; i++)
{
for (int j = 0; j < num[i]; j++)
{
if (q.front() == sort[i][j])
qnum = i;
if (data == sort[i][j])
datanum = i;
}
}
if (qnum == datanum)
return true;
else
return false;
}
int main()
{
int t;
cin >> t;
int** sort = new int* [t];//分组信息
int* num = new int[t];//各组有多少个元素
for (int i = 0; i < t; i++)
{
cin >> num[i];
sort[i] = new int[num[i]];
for (int j = 0; j < num[i]; j++)
cin >> sort[i][j];
}
queue<int> qq[100];//组队列
int rear = 0;//组队列队尾指针
int result[100];
int len = 0;
string str;
cin >> str;
while (str != "STOP")
{
if (str == "ENQUEUE")
{
int data;
cin >> data;
int i;
for (i = 0; i < 100; i++)
{
if (IsSameType(data, qq[i], sort, num, t))
{
qq[i].push(data);
break;
}
}
if (i == 100)
{
qq[rear++].push(data);
}
}
else
{
for (int i = 0; i < 100; i++)
{
if (!qq[i].empty())
{
result[len++] = qq[i].front();
qq[i].pop();
break;
}
}
}
cin >> str;
}
for (int i = 0; i < len; i++)
{
cout << result[i];
if (i == len - 1)
cout << endl;
else
cout << " ";
}
return 0;
}