雙棧模擬隊列

棧是先進後出,隊列是先進先出,因此若想用棧保存數據(stack1)獲得正確的順序,就要把棧的順序反過來。可以把stack1中的數據逐個彈出至另外一個棧(stack2),這樣就可以達到正確的隊列順序了

值得注意的是,似乎在出隊後需要將stack2的再逐個彈回stack1,實際上不用。在下一次出隊時若stack2非空,直接從stack2去彈出;否則,再將stack1的元素全部彈出至stack2,然後再彈出stack2的棧頂元素即可。這樣可以避免來回出入棧的時間消耗。

 

任務:雙棧模擬隊列

輸入:第1行是一個正整數n,表示n個隊列運算。接下來每一行一個運算。E x表示元素x入隊,D表示出隊,F表示輸出隊首元素

輸出:輸出F運算的元素,每行一個

#include <iostream>
#include <stack>
using namespace std;

int main()
{
	int n;
	
	while( cin >> n )
	{
		stack<int> stk1, stk2;
		char opt;
		int  x;
		while( n-- )
		{
			cin >> opt;
			if( opt == 'E' ){
				cin >> x;
				stk1.push(x);
			}else if( opt == 'F' ){
				if( !stk2.empty() )
					cout << stk2.top() << endl;
				else{
					while( !stk1.empty() ){
						stk2.push(stk1.top());
						stk1.pop();
					}
					if( !stk2.empty() )
						cout << stk2.top() << endl;
					else
						cerr << "Error! Stack Empty!" << endl;
				}
			}else if( opt == 'D' ){
				if( !stk2.empty() )
					stk2.pop();
				else{
					while( !stk1.empty() ){
						stk2.push(stk1.top());
						stk1.pop();
					}
					if( !stk2.empty() )
						stk2.pop();
					else
						cerr << "Error! Stack Empty!" << endl;
				}	
			}
		}
		cout << "-----END-----" << endl;		
	}
	
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章