DS队列--组队列

题目描述

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

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

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

3、 STOP,停止操作

建议使用C++自带的队列对象queue,编程更方便

输入

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

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

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

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

输出

DEQUEUE出队的元素

#include<iostream>
#include<queue>
using namespace std;
queue<int>judpri;
queue<int>print;
class ds
{
public:
	queue<int>data;
	int data0[100];
	int size;
	int yuanzubie ;
	ds() 
	{ 
		size = 0;
		yuanzubie = 0;
	};
	void set()
	{
		int n;
		cin >> n;
		size = n;
		for(int i=0;i<n;++i)
		{
			cin >> data0[i];
			data.push(data0[i]);
		}
	}
	void seto(int x)
	{
		size++;
		data.push(x);

	}
	bool find(int x)
	{
		for (int i = 0; i < size; ++i)
		{
			if (data0[i] == x)
			{
				return 1;
			}
		}
		return 0;
	}
	bool delte()
	{
		if (size == 0)return 0;
		print.push(data.front());
		data.pop();
		size -= 1;
		return 1;
	}
};
queue<ds>initial[10];
queue<ds>end1[10];

bool findqueue(int ai)
{
	queue<int> ds = judpri;
	
	while (!ds.empty())
	{
		int x = ds.front();
		if (x == ai)
		{
			return 1;
		}
		ds.pop();
	}
	return 0;
}
int main()
{
	int t;
	cin >> t;
	
	for (int i = 1; i <= t; ++i)
	{
		ds dss;
		dss.set();
		initial[i].push(dss);
	}
	string node;
	ds dss;
	int loc = 1;
	while (cin >> node)
	{
		if (node == "ENQUEUE")
		{
			int x;
			cin >> x;
			for (int i = 1; i <= t; ++i)
			{
				if (initial[i].front().find(x))//如果是原来的数组中的数据
				{
					if (findqueue(i))//如果这个组已经有数据到了
					{
						for (int j = 1; j < loc; ++j)
						{
							if (end1[j].front().yuanzubie==i)
							{
								end1[j].front().seto(x);
							}
						}
					}
					else//如果这个组还没有数据到达
					{			
						ds ds1;
						ds1.seto(x);
						ds1.yuanzubie = i;
						end1[loc++].push(ds1);
						judpri.push(i);
					}
				}
				else
				{					
					dss.seto(x);
				}
			}
		}
		else if (node == "DEQUEUE")
		{
			for (int i = 1; i < loc; ++i)
			{
				if (end1[i].front().size != 0)
				{
					end1[i].front().delte();
					break;
				}
			}
		}
		else
		{
			break;
		}
	}
	cout  << print.front();
	print.pop();
	while (!print.empty())
	{
		cout << ' ' << print.front();
		print.pop();
	}
	cout << endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值