1. 程式人生 > >【劍指offer】面試題9:用兩個棧實現佇列【C++版本】

【劍指offer】面試題9:用兩個棧實現佇列【C++版本】

題目:

用兩個棧實現佇列

用兩個棧實現一個佇列。佇列的宣告如下,請實現它的兩個成員函式,分別完成在佇列尾部插入節點和在佇列的頭部刪除節點

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.出棧操作:把非空佇列的元素出隊並且按順序一個一個壓入另一個佇列,直到剩下一個元素,這個元素就是要出棧的元素。輸出該元素即可