【劍指offer】面試題9:用兩個棧實現佇列【C++版本】
阿新 • • 發佈:2018-12-08
題目:
用兩個棧實現佇列
用兩個棧實現一個佇列。佇列的宣告如下,請實現它的兩個成員函式,分別完成在佇列尾部插入節點和在佇列的頭部刪除節點
class solution
{
public:
void push(int node);
int pop();
private:
stack<int> stack1;
stack<int> stack2;
};
解題思路:
固定一個棧用於入隊操作,另一個棧用於出隊操作:
1.入佇列操作,不管stack1和stack2是什麼狀態,直接向stack1入棧即可。
2.出佇列操作,如果stack2為空,那麼把stack1的元素一個一個彈出並壓入到stack2中,完成之後,對stack2進行出棧操作,此元素就是最先入隊的元素。
3.出佇列操作,如果stack2不為空,那麼直接從stack2出棧,此元素是當前所有元素中最先入隊的那個。
可以AC的解法【C++版本】
class Solution
{
public:
//固定一個棧用於入隊操作
void push(int node) {
stack1.push(node);
}
int pop() {
/*if((stack1.empty())&&(stack2.empty()))
throw new std::exception("Empty queue.");*/
if(!stack2.empty()){
int tmp = stack2.top();
stack2.pop();
return tmp;
}
else{
while(!stack1.empty()){
int tmp = stack1.top();
stack2.push(tmp);
stack1.pop();
}
int tmp = stack2.top();
stack2.pop();
return tmp;
}
}
private:
stack<int> stack1;
stack<int> stack2;
};
//相關題目:兩個佇列實現一個棧
注意異同:
兩個棧實現一個佇列:使用棧1來入隊,棧2來出隊,角色是固定了的
兩個佇列實現一個棧:使用非空佇列來入棧,使用空佇列來出棧,角色會轉換:
1.入棧操作:哪個佇列非空,就把元素插入哪個佇列的隊尾,如果兩個佇列都為空,那麼就隨便使用一個佇列。
2.出棧操作:把非空佇列的元素出隊並且按順序一個一個壓入另一個佇列,直到剩下一個元素,這個元素就是要出棧的元素。輸出該元素即可