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

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 
#include
#include 
#include 

using namespace std;

int main() {
    int n;
    cin >> n;
    queue<int> *q = new queue<int>[n];
    unordered_map<int, int> um;
    deque<int> v;
    for (int i = 0; i < n; i++) {
        int m;
        cin >> m;
        for (int j = 0; j < m; j++) {
            int x;
            cin >> x;
            um[x] = i;
        }
    }
    int cnt = 0;
    while (true) {
        string op;
        cin >> op;
        if (op == "STOP") {
            break;
        } else if (op == "ENQUEUE") {
            int x;
            cin >> x;
            int cur = um[x];
            auto it = v.begin();
            for (; it != v.end(); it++) if (*it == cur) break;
            if (it == v.end()) v.push_back(cur);
            q[cur].push(x);
        } else if (op == "DEQUEUE") {
            if (cnt) cout << " ";
            cout << q[v.front()].front();
            cnt++, q[v.front()].pop();
            if (q[v.front()].empty()) v.pop_front();
        }
    }
    cout << endl;
    return 0;
}

你可能感兴趣的:(数据结构,c++,算法,开发语言,蓝桥杯,数据结构)