1. 程式人生 > >計蒜客 程式設計:超級棧

計蒜客 程式設計:超級棧

蒜頭君學習完資料結構之後,發現這種普通的棧已經不能滿足自己的需求了。於是蒜頭君想自己手動寫一個超級棧。超級棧和普通棧不同的是,如果自己想往棧底新增資料的話,可以通過把棧翻轉,然後再往棧頂新增資料來完成。聽起來是不是覺得這個棧很厲害?

對於超級棧的操作有四種:

(1) 11 表示把棧反轉

(2) 22 表示把棧頂元素出棧

(3) 3 \ x3 x 表示把 xx 放到棧頂

(4) 44 表示把棧內所有的元素從棧底開始打印出來,如果棧內沒有元素,只需要列印空行。

既然你這麼厲害,那麼蒜頭君決定把這個偉大而又艱鉅的任務交給了你。

輸入格式

第一行輸入一個整數 nn (1 \le n \le 10000)(1n10000),表示操作次數。

之後 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;
}