棧是先進後出,隊列是先進先出,因此若想用棧保存數據(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;
}