DS队列--组队列 C++ 数据结构

目录

题目描述

思路分析

AC代码


题目描述

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

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

思路分析

首先一开始它输入的组的元素只是告诉你这几个元素是一组的,并没有表明它们在队列中。

你需要实现的是这样的需求:

举个栗子:类似于插队,如果插队在这里是符合道德要求的话@_@……

一开始输入的几个组的元素就是告诉你这几个人是相互认识的,然后开始排队的时候,就要按照排队的规则来,先来的先排前面,之后如果新来的看到队伍里面有自己认识的(属于同一组元素)那么它就会跑到自己认识的人后面去排,当然是前提是这个认识的人还在队伍里面(它还没被弹走)。

所以要用队列实现的话,因为队列遍历和插入是不行的(当然不知道用vector算不算违规操作,用vector就没有这个问题了,来一个直接插,我们这里还是乖乖用队列实现),所以要用队列数组来存,但是因为涉及到先来的先走的问题,所以需要一个权重数组,谁先来的谁先走。

AC代码

#include <bits/stdc++.h>

using namespace std;

int main() {
    int n, one, pass;
    cin >> n;
    queue<int> test[n];
    vector<int> findout[n];
    queue<int> out;
    queue<int> power;
    bool flag[n];
    for (int i = 0; i < n; i++)flag[i] = false;
    for (int i = 0; i < n; i++) {
        cin >> pass;
        while (pass--) {
            cin >> one;
            findout[i].push_back(one);
        }
    }
    string todo;
    while (1) {
        cin >> todo;
        if (todo == "STOP")
            break;
        if (todo == "ENQUEUE") {
            cin >> one;
            bool haved = false;
            for (int i = 0; i < n; i++) {
                for (auto &it: findout[i]) {
                    if (it == one) {
                        if (!flag[i]) {
                            power.push(i);
                            flag[i] = true;
                        }
                        test[i].push(one);
                        haved = true;
                        break;
                    }
                }
                if (haved)break;
            }
            if (!haved) {
                test[n - 1].push(one);
                findout[n - 1].push_back(one);
            }

        } else {
            out.push(test[power.front()].front());
            test[power.front()].pop();
            if (test[power.front()].empty()) {
                flag[power.front()] = false;
                power.pop();
            }
        }
    }
    size_t num = out.size();
    for (size_t i = 0; i < num - 1; i++) {
        cout << out.front() << ' ';
        out.pop();
    }
    cout << out.front();
}

猜你喜欢

转载自blog.csdn.net/weixin_62264287/article/details/127269170