【id:45】【20分】C. DS队列--组队列

题目描述

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

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,十分优雅

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值