小明今天课上刚学习了队列数据结构,你看这个队列他又长又宽,就像这个碗他又大又圆。
不过小明觉得队列只能从队尾插入,队首弹出太无聊了,于是他就想重新设计以下,以使队列能够翻转。
翻转:队首变为队尾,队尾变为队首。
那么现在队列变成了有以下三个操作的队列:
队尾插入
队首弹出
翻转队列
初始时,这里有一个空队列,我们对他进行以上三个操作。
输入格式:
第一行一个正整数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容器详解
坑:第一遍一直用的cin>>输入一直超时 后来换成了printf scanf 才完事儿hhh
#include <iostream>
#include <deque>
#include <algorithm>
#include <cstdio>
using namespace std;
deque<int> que;
bool flag = true;
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int i;
scanf("%d",&i);
switch(i)
{
case 1:
int x;
scanf("%d",&x);
if(flag) que.push_back(x);
else que.push_front(x);
break;
case 2:
if(!que.empty())
{
if(flag) que.pop_front();
else que.pop_back();
}
else break;
break; //不要因为上边的break就丢掉下边的
case 3:
flag = !flag;
break;
default:
break;
}
if(!que.empty()) printf("%d\n",que.front()^que.back());
else printf("-1\n");
}
return 0;
}