劍指offer | 09. 用兩個棧實現佇列

Leonadoice發表於2020-11-17

題目內容

用兩個棧實現一個佇列。佇列的宣告如下,請實現它的兩個函式 appendTail 和 deleteHead
,分別完成在佇列尾部插入整數和在佇列頭部刪除整數的功能。(若佇列中沒有元素,deleteHead 操作返回 -1 )

示例 1:

輸入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
輸出:[null,null,3,-1]

示例 2:

輸入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
輸出:[null,-1,null,null,5,2]

提示:

1 <= values <= 10000
最多會對 appendTail、deleteHead 進行 10000 次呼叫

思路:

  • 維護兩個棧,第一個棧支援插入操作,第二個棧支援刪除操作。
  • 插入操作時都將元素插入到第一個棧中;
  • 當要進行刪除操作時,若第二個棧為空,將第一個棧的元素pop後依次加入到第二棧裡面,全部匯入後,第二個棧的順序就是刪除的順序。
    在這裡插入圖片描述

時間複雜度: 每個元素至多被插入和刪除1次,所以時間複雜度為O(1).
空間複雜度: 需要兩個棧儲存已有的元素,所以是O(n)。

完整程式碼

class CQueue {
stack<int> stack1,stack2;
public:
    CQueue() {
        while(!stack1.empty()){
            stack1.pop();
        }

        while(!stack2.empty()){
            stack2.pop();
        }
    }
    
    void appendTail(int value) {
        stack1.push(value);
    }
    
    int deleteHead() {
        //如果第二個棧為空
        if(stack2.empty()){
            while(!stack1.empty()){
                stack2.push(stack1.top());
                stack1.pop();
            }
        }
        if(stack2.empty()){
            return -1;
        }else{
            int deleteItem=stack2.top();
            stack2.pop();
            return deleteItem;
        }
    }
};

相關文章