HBU训练营—— 队列 queue 无聊的队列(附分析)

Posted Fmm-PMO

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HBU训练营—— 队列 queue 无聊的队列(附分析)相关的知识,希望对你有一定的参考价值。

HBU程序设计训练营

小明今天课上刚学习了队列数据结构,你看这个队列他又长又宽,就像这个碗他又大又圆。

不过小明觉得队列只能从队尾插入,队首弹出太无聊了,于是他就想重新设计以下,以使队列能够翻转。

翻转:队首变为队尾,队尾变为队首。

那么现在队列变成了有以下三个操作的队列:

队尾插入

队首弹出

翻转队列

初始时,这里有一个空队列,我们对他进行以上三个操作。

输入格式:
第一行一个正整数q(1<=q<=400000),表示对队列的操作次数,初始时,队列为空。

接下来q行,

若是 1 x,则将x插入当前队列(1<=x<=1000000)。

若是 2,则从队列中弹出队首元素(若当前队列为空,则忽略此操作)

若是 3,则翻转当前队列

输出格式:
对于每个输入输出一行一个整数,为当前队列队首和队尾的异或值(这里的异或是按位异或,运算符为 ‘^’)。

若当前队列为空,则输出-1

输入样例1:

5
1 2
1 3
3
2
2

输出样例1:

0
1
1
0
-1

输入样例2:

4
1 2
3
1 3
3

输出样例2:

0
0
1
1

分析:这道题关键是理解翻转的含义,题目中明确说明:翻转:队首变为队尾,队尾变为队首。如果真的把队列翻转过来显然是不好操作且误解了本题意思的(虽然我刚开始就是这么想的,然后想了半天,然后对,没做出来。。。),翻转变化的只是队首和队尾,翻就翻,反正也没让输出所有元素,涉及的只是队首和队尾元素。插入操作时在队尾操作,出队操作时在队首操作,但翻转了呢,这就反了啊,这怎么搞,使用双端数组deque或者list,总之选择既可以头部插入,尾部插入,头部取出,尾部取出的容器,这就简单了很多。。。,比如初始是在队尾添加,翻转之后,直接在队头添加就可以了,这一点想到,就成功一半了。注意,取出的时候也要判断是否翻转过,修改标志变量的时候,不要写死,变为!flag,我之前就是直接改了false。。。一定要判断是否为空!!!
#include <iostream>
#include <algorithm>
#include <deque>
using namespace std;

int main() 
	int q;//对队列的操作次数
	int num;//要插入的数据
	int index;//操作代号
	bool flag = true;
	deque<int> d;//双端数组

	cin >> q;
	for(int i = 0; i<q; i++) 
		scanf("%d",&index);
		switch(index) 

			case 1:
				scanf("%d",&num);
				if(flag) 
					d.push_back(num);
				 else 
					d.push_front(num);
				
				break;
			case 2:
				if(!d.empty()) 
					if(flag) 
						d.pop_front();
					 else 
						d.pop_back();
					
				 else 
					break;
				
				break;
			case 3:
				flag = !flag;//不能直接写false,,,可能翻了又翻了。。
				break;
			default:
				break;
		
		if(d.empty()) 
			printf("-1\\n");
		 else 
			printf("%d\\n",d.front()^d.back());
		
	
	return 0;

以上是关于HBU训练营—— 队列 queue 无聊的队列(附分析)的主要内容,如果未能解决你的问题,请参考以下文章

队列+BFS(附vector初试)

Python 队列(Queue)作用和用法

[ACM训练] 算法初级 之 数据结构 之 栈stack+队列queue (基础+进阶+POJ 2442+1442)

ACM士兵队列训练问题

hdu 1276士兵队列问题queue

将队列拆分为训练/测试集