1. 程式人生 > >【死磕演算法·棧與佇列】如何用雙棧實現佇列操作?

【死磕演算法·棧與佇列】如何用雙棧實現佇列操作?

題目要求:

編寫一個類,只能用兩個棧結構實現佇列,支援佇列的基本操作add(),poll(),peek()

題目思路:

棧是先進後出,佇列是先進先出。用兩個棧可以將順序反過來,實現佇列操作

設定兩個棧stackPush(壓入棧)和stackPop(彈出棧),一個只進行push操作,一個只進行pop操作。

將stackPush中的值都倒入到stackPop中,再從stackPop中彈出就是佇列的操作了。

兩個注意點:

1、從stackPush向stackPop中倒入資料時,必須將stackPush中的資料一次性全部倒完。(不然在stackPush棧底的元素(最先入棧的元素)到不了stackPop的棧頂,發生一次pop操作就會出錯)

2、stackPop不為空時,不能往裡面倒入數。(不然先入棧的數會在棧的底端不能按照佇列性質儘快彈出)

從stackPush倒入stackPop中這個操作可以加入在add()或者poll()或者peek()中,只要不違反兩個注意點即可。

程式碼實現:

class TwoStack {
public:
   stack<int>stackPush;stack<int>stackPop;//兩個棧
   vector<int>result;
    void push(int value){
        stackPush.push(value);
    }
    void pop(){
             result.push_back(stackPop.top());
             stackPop.pop();
    }
    void trans(){
        while(!stackPush.empty()){
            stackPop.push(stackPush.top());
            stackPush.pop();
        }
    }
    vector<int> twoStack(vector<int> ope, int n) {
        // write code here
        for(int i = 0;i<n;i++){
            if(ope[i]!=0)
                push(ope[i]);
            if(ope[i]==0)//在pop之前,如果stackPop為空,把stackPush中的元素倒入stackPop中
            {
                if(stackPop.empty())
                    trans();
                pop();
            }
        }
        return result;
    }
};