F. DS队列--组队列(不使用STL队列)

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

1、 ENQUEUE,表示当有新的元素进入队列,首先会检索是否有同一组的元素已经存在,如果有,则新元素排在同组的最后,如果没有则插入队列末尾。

2、 DEQUEUE,表示队列头元素出队

3、 STOP,停止操作

注意:不要使用C++自带的队列对象queue。

输入

第1行输入一个t(t<=10),表示1个队列中有多少个组

第2行输入一个第1组的元素个数和数值

第3行输入一个第2组的元素个数和数值

以此类推输入完t组以定义同组元素之后,开始输入多个操作命令(<200),对空的组队列进行操作,例如输入ENQUEUE 100,表示把元素100插入队列

输出

DEQUEUE出队的元素

提示

 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 |

看了网上的很多解答,都是用了STL库的,这里写一个不用STL库的,供大家参考,如有错误请在下面提出。


//
// Created by 86159 on 2022/10/16.
//
#include "iostream"

using namespace std;
class Node{
public:
    int data;
    Node* next;
};
class Myqueue{
private:
    Node** front;
    Node** rear;
    int *size;
    int **array;
    int groups;
public:
    explicit Myqueue(int n);
    void Enqueue(int x);
    int Dequeue(int &x);
    void set(int x,int Line);
    bool isEmpty(int n);
};
Myqueue::Myqueue(int n) {//n==groups
    front= new Node * [n];
    rear= new Node * [n];
    size=new int [n];
    groups=n;
    array=new int*[groups];
}
void Myqueue::set(int x,int Line) {

    front[Line]= rear[Line]= nullptr;
    size[Line]=0;
    array[Line]=new int[x];

    for (int i = 0; i < x; ++i) {
        cin>>array[Line][i];
    }
}

bool Myqueue::isEmpty(int n) {
    return size[n] == 0;
}
void Myqueue::Enqueue(int x) {
    int flag=(x-x%100)/100;
    int index = 0;
    for (int i = 0; i < groups; ++i) {
        if (isEmpty(i)){//为空->the first
            index=i;
            break;
        }else{
            int k=front[i][0].data;
            k=(k-k%100)/100;
            if (k != flag)continue;
            index=i;//标记是哪一组的
            break;//
        }
    }
    Node* newNode=new Node();
    newNode->data=x;
    newNode->next= nullptr;
    {
        (isEmpty(index) ? front[index] : rear[index]->next) = newNode;
        rear[index] = newNode;
    }
    size[index]++;
}

int Myqueue::Dequeue(int &x) {
    for (int i = 0; i < groups; ++i)
        if (!isEmpty(i)) {
            x = front[i]->data;
            Node *nextNode = front[i]->next;
            delete front[i];
            front[i] = nextNode;
            size[i]--;
            return x;
        }else
            continue;
    return 0;
}
int main(){
    int Lines;
    int n;
    cin>>Lines;
    Myqueue q(Lines);
    for (int i = 0; i < Lines; ++i) {
        cin>>n;
        q.set(n,i);
    }
    string order;
    int x;
    cin>>order;
    while (true){
        int flag=0;
        if (order=="DEQUEUE"){
          int r=q.Dequeue(r);
          flag=1;
          cout<>x;
          q.Enqueue(x);
          flag=-1;
        }
        cin>>order;
        if (order!="STOP"&&flag==1)
            cout<<" ";
        else {
            if (!(order == "STOP"))
                continue;
            cout << endl;
            break;
        }
    }

return 0;
}

你可能感兴趣的:(OJ,c++)