题目描述
组队列是队列结构中一种常见的队列结构,在很多地方有着广泛应用。组队列是是指队列内的元素分组聚集在一起。组队列包含两种命令:
1、 ENQUEUE,表示当有新的元素进入队列,首先会检索是否有同一组的元素已经存在,如果有,则新元素排在同组的最后,如果没有则插入队列末尾。
2、 DEQUEUE,表示队列头元素出队
3、 STOP,停止操作
建议使用C++自带的队列对象queue,编程更方便
输入
第1行输入一个t(t<=10),表示1个队列中有多少个组
第2行输入一个第1组的元素个数和数值
第3行输入一个第2组的元素个数和数值
以此类推输入完t组以定义同组元素之后,开始输入多个操作命令(<200),对空的组队列进行操作,例如输入ENQUEUE 100,表示把元素100插入队列
输出
DEQUEUE出队的元素
样例查看模式
正常显示查看格式
输入样例1 <-复制
输出样例1
提示
3 101 102 103
3 201 202 203
3 301 302 303
ENQUEUE 201 ==>>> | 201 |
ENQUEUE 301 ==>>> | 201 | 301 |
ENQUEUE 102 ==>>> | 201 | 301 | 102 |
ENQUEUE 101 ==>>> | 201 | 301 | 102 101 |
ENQUEUE 203 ==>>> | 201 203 | 301 | 102 101 |
ENQUEUE 302 ==>>> | 201 203 | 301 302 | 102 101 |
可以看到队列分组,先入队的组在队列中靠前,出队也靠前:
DEQUEUE
输出 201,队列变为 | 203 | 301 302 | 102 101 |
…
下面是我自己的做法:
#include <iostream>
#include <queue>
#include <unordered_map>
#include <string>
using namespace std;
int main() {
int t; // 组的数量
cin >> t;
unordered_map<int, queue<int>> groupQueues; // 存储每组的队列
queue<int> mainQueue; // 存储每组的入口顺序
unordered_map<int, int> groupMap; // 存储元素到组的映射
unordered_map<int, int> notInQueueID; //未进入队列的组编号映射为1,进入后映射为0
// 输入组的数据
for (int i = 0; i < t; ++i) {
int n;
cin >> n;
for (int j = 0; j < n; ++j) {
int value;
cin >> value;
groupMap[value] = i; // 记录元素到组的映射
}
}
for (int i = 0; i < t; i++) {
notInQueueID[i] = 1; ////未进入队列的组编号映射为1
}
string command;
while (cin >> command) {
if (command == "STOP") {
break;
}
else if (command == "DEQUEUE") {
// 先检查是否有组在队列中
if (!mainQueue.empty()) {
int frontGroup = mainQueue.front(); // 获取当前组
cout << groupQueues[frontGroup].front() << endl; // 输出组头元素
groupQueues[frontGroup].pop(); // 出队该元素
// 如果该组的队列空了,从主队列中移除该组
if (groupQueues[frontGroup].empty()) {
mainQueue.pop();
}
}
else {
cout << "Queue is empty!" << endl; // 如果队列空则输出提示
}
}
else if (command == "ENQUEUE") {
int value;
cin >> value;
int groupId = groupMap[value]; // 找到该元素对应的组
if (notInQueueID[groupId] == 1) {
notInQueueID[groupId] = 0;
mainQueue.push(groupId); // 如果组队列为空,加入主队列
}
groupQueues[groupId].push(value); // 将元素入队到该组
}
}
return 0;
}
用了unordered_map,十分优雅