DS队列--组队列

目录

题目描述

思路分析

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

思路分析

 这道题稍微复杂一点点。

就是有一个队列数组q,里面放了t个队列。在ENQUEUE时,先判断它是第几个组中的元素。记录为第r组。

b[i]记录队列数组中有没有第i组的元素,如果有为1,没有为0;

c[i]记录第i组是第几个队列。

AC代码 

#include <iostream>
#include <iomanip>
#include <queue>
#include <stack>
using namespace std;

int main() {
	int t, n, x;
	int j = 0, p= 0;
	string op;
	cin >> t;
	queue <int > q[t];
	int a[t][10] = {0};
	for (int k = 0; k < t; k++) {
		cin >> n;
		for (int i = 0; i < n; i++)
			cin >> a[k][i];

	}
	int b[t] = {0};
	int c[t] = {0};

	while (1) {
		cin >> op;
		if (op == "ENQUEUE")	{
			cin >> x;
			int tag = 1, r;
			for (int i = 0; i < t; i++) {
				for (int k = 0; k < 10; k++) {
				if(x==a[i][k]){
					r=i;
					if(b[i]==0) {
						b[i]=1; 
						c[i]=p;
						p++;
					}
					tag=0;
					break;
				}
				}
				if (tag == 0) break;
			}
		q[c[r]].push(x);
		}
		if (op == "DEQUEUE")	{
			int i = 0;
			while (1) {
				if (q[i].empty()) {
					i++;
				} else break;
			}
			cout << q[i].front() << " ";
			q[i].pop();
		}
		if (op == "STOP")	{
			break;
		}
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值