天天看點

【劍指offer】劍指 Offer 09. 用兩個棧實作隊列(C++ 模拟 棧 隊列)

​​題目連結​​

題意:

用兩個棧模拟隊列,要求實作插入和删除操作。

思路:

  • 棧的特點:先進後出

    隊列的特點:先進先出

  • 是以用一個棧維護插入操作,一個棧維護删除操作。
  • 插入的時候,插入到棧裡。
  • 删除的時候,彈出棧的元素。如果為空的話,将裡的所有元素彈入裡,這樣的元素順序就是隊列删除元素的順序,符合隊列先進先出的特性。
  • 還有幾個小細節:

    構造函數裡要将兩個棧清空;

    删除的時候,如果stk1也為空的話,則傳回-1

class CQueue {
public:
    stack<int>stk1,stk2;
    CQueue() {
        while(!stk1.empty()) stk1.pop();
        while(!stk2.empty()) stk2.pop();
    }
    
    void appendTail(int value) {
        stk1.push(value);
    }
    
    int deleteHead() {
        if(stk2.empty()){
            while(!stk1.empty()){
                stk2.push(stk1.top());
                stk1.pop();
            }
        }
        if(stk2.empty()) return -1;
        else{
            int now=stk2.top();
            stk2.pop();
            return now;
        }
    }
};

/**
 * Your CQueue object will be instantiated and called as such:
 * CQueue* obj = new CQueue();
 * obj->appendTail(value);
 * int param_2 = obj->deleteHead();
 */