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 无聊的队列(附分析)的主要内容,如果未能解决你的问题,请参考以下文章