目录
题目
一、分析题目的思路
创建一个队列数组: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];
}
}