您的位置:首页 > 其它

双端队列的使用

2018-03-28 10:14 106 查看
蒜头君学习完数据结构之后,发现这种普通的栈已经不能满足自己的需求了。于是蒜头君想自己手动写一个超级栈。超级栈和普通栈不同的是,如果自己想往栈底添加数据的话,可以通过把栈翻转,然后再往栈顶添加数据来完成。听起来是不是觉得这个栈很厉害?对于超级栈的操作有四种:
(1) 11 表示把栈反转
(2) 22 表示把栈顶元素出栈
(3) 3 \ x3 x 表示把 xx 放到栈顶
(4) 44 表示把栈内所有的元素从栈底开始打印出来,如果栈内没有元素,只需要打印空行。
既然你这么厉害,那么蒜头君决定把这个伟大而又艰巨的任务交给了你。

输入格式

第一行输入一个整数 nn (1 \le n \le 10000)(1≤n≤10000),表示操作次数。
之后 nn 行输入这四种操作。

输出格式

完成上述的操作(题目保证所有的数据都是合法的,不会出现空栈
pop
)。

样例输入

7
3 2
3 1
1
3 3
4
2
4

样例输出

1 2 3
1 2
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
deque<int>q;
bool flag=true;
int main()
{
int n,op;
cin>>n;
while(n--)
{
cin>>op;
if(op==1)
{
flag^=1;
}
else if(op==2)
{
if(flag)
q.pop_back();
else
q.pop_front();
}
else if(op==3)
{
int x;
cin>>x;
if(flag)
q.push_back(x);
else
q.push_front(x);
}
else if(op==4)
{
if(flag)
{
if(q.size())
{
cout<<q[0];
for(int i=1;i<q.size();++i)
cout<<' '<<q[i];
}
cout<<endl;
}
else
{
if(q.size())
{
int sz=q.size();
cout<<q[sz-1];
for(int i=sz-2;i>=0;i--)
cout<<' '<<q[i];
}
cout<<endl;
}

}
}
return 0;
}
#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
deque<int>q;
int flag=1;
int main()
{
int n,op;
cin>>n;
while(n--)
{
cin>>op;
if(op==1)
{
flag++;
}
else if(op==2)
{
if(flag%2==0)
q.pop_back();
else
q.pop_front();
}
else if(op==3)
{
int x;
cin>>x;
if(flag%2==0)
q.push_back(x);
else
q.push_front(x);
}
else if(op==4)
{
if(flag%2==0)
{
if(q.size())
{
cout<<q[0];
for(int i=1;i<q.size();++i)
cout<<' '<<q[i];
}
cout<<endl;
}
else
{
if(q.size())
{
int sz=q.size();
cout<<q[sz-1];
for(int i=sz-2;i>=0;i--)
cout<<' '<<q[i];
}
cout<<endl;
}

}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: