Bootstrap

DS队列--组队列(数据结构)

目录

题目

一、分析题目的思路

二、完整代码


题目

 

 

一、分析题目的思路

        创建一个队列数组:queue <int>a[10];

        创建一个二维数组:int* c[10];

        创建一个用于存放二维数组行标的一维数组:int b[10];

        创建一个一维数组用于存放输出的值:d[100](为了满足输出格式,最后一个输出的数后面没有空格)

        创建一个用于记录队列组的顺序的一维数组:int e[10];

        第1行输入一个t(t<=10),表示1个队列中有多少个组。第2行输入一个第1组的元素个数和数值,第3行输入一个第2组的元素个数和数值,以此类推输入完t组。元素的个数存在b[i]中,输入的t组的值存在一个二维数组c[i][j]中,用于判断之后输入数据插入队列哪一组。

for (i = 0; i < t; i++)
    {
        cin >> b[i];
        c[i] = new int[b[i]];
        for (j = 0; j < b[i]; j++)
        {
            int num;
            cin >> num;

            c[i][j] = num;
        }
    }

        在输入完二维数组后,建立一个死循环,输入字符串p。

        当输入的字符串为“STOP”时,跳出循环。

        当输入字符串为“ENQUEUE”时,获取要插入队列的数值num。遍历二维数组,如果找到与num相等的数值,则记下二维数组的行标i(即num该插入队列的组)。将num值push进队列:a[i].push(num);,并将i组的顺序记录在e[count]中:e[count] = i; count++;(count的初始值为0,如果之后输入的i组在之前已经输入过了,那么则不用再存在数组e中)。

if (p == "ENQUEUE") {
            int z;
            int num;
            cin >> num;
            for (i = 0; i < t; i++)
            {
                for (j = 0; j < b[i]; j++)
                {
                    if (c[i][j] == num) {
                        for (z = 0; z < t; z++)//如果之后输入的i组在之前已经输入过了,那么则不用再存在数组e中
                        {
                            if (e[z] == i)
                                break;
                        }
                        if (z == t) {//如果之后输入的i组在之前没有输入过了,则存在数组e中
                            e[count] = i;
                            count++;
                            //cout << i << endl;
                        }

                        flag = 1;//在二维数组中查到
                        break;
                    }
                }
                if (flag == 1)
                    break;
            }

            if (flag == 1)
                a[i].push(num);//插入i组队列后面
            else
                a[count - 1].push(num);//插入最后一组队列的后面


        }

        当输入的字符串为“DEQUEUE”时,从数组e中取出排在队列数组最前面的那一组:e[0]组,从e[0]组队列中取出队头元素放到d[m]中(m的初始值为0),并将a[e[0]]弹出队列:d[m ] = a[e[0]].top(); m++; a[e[0]].pop()。之后,判断a[e[0]]是否为空,如果为空,则将e[1]移到e[0],......,直到的e[count - 1]移到e[count - 2](e数组最后一个数的下标是count-1),count--;。

else if (p == "DEQUEUE") {

            d[m] = a[e[0]].front();
            m++;
            a[e[0]].pop();


            if (a[e[0]].empty() == true) {
                for (int h = 1; h < count; h++)
                {
                    e[h - 1] = e[h];
                }
                count--;
            }

        }

        按照格式要求输出:

    for (i = 0; i < m; i++)
    {
        cout << d[i];
        if (i != m - 1)
            cout << ' ';
        else
            cout << endl;
    }

        最后,记得释放c[i] new出来的空间。

        

    for (int i = 0; i < t; i++)
    {
        delete[]c[i];
    }

 

二、完整代码

#include <iostream>
#include <queue>
#include <string>
using namespace std;
int main()
{
    int t, i, j, count = 0;
    cin >> t;

    queue <int>a[10];
    int b[10];
    int* c[10];
    int d[100];
    int e[10];

    for (i = 0; i < 10; i++)
    {
        e[i] = -1;
    }

    for (i = 0; i < t; i++)
    {
        cin >> b[i];
        c[i] = new int[b[i]];
        for (j = 0; j < b[i]; j++)
        {
            int num;
            cin >> num;

            c[i][j] = num;
        }
    }

    string p;
    int flag = 0;
    int m = 0;
    while (true) {
        flag = 0;
        cin >> p;
        if (p == "STOP")
            break;
        if (p == "ENQUEUE") {
            int z;
            int num;
            cin >> num;
            for (i = 0; i < t; i++)
            {
                for (j = 0; j < b[i]; j++)
                {
                    if (c[i][j] == num) {
                        for (z = 0; z < t; z++)
                        {
                            if (e[z] == i)
                                break;
                        }
                        if (z == t) {
                            e[count] = i;
                            count++;
                            //cout << i << endl;
                        }

                        flag = 1;
                        break;
                    }
                }
                if (flag == 1)
                    break;
            }

            if (flag == 1)
                a[i].push(num);
            else
                a[count - 1].push(num);


        }
        else if (p == "DEQUEUE") {


            d[m] = a[e[0]].front();
            m++;
            a[e[0]].pop();



            if (a[e[0]].empty() == true) {
                for (int h = 1; h < count; h++)
                {
                    e[h - 1] = e[h];
                }
                count--;
            }

        }
    }

    for (i = 0; i < m; i++)
    {
        cout << d[i];
        if (i != m - 1)
            cout << ' ';
        else
            cout << endl;
    }

    for (int i = 0; i < t; i++)
    {
        delete[]c[i];
    }
}




悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;