LeetCode C++ 劍指 Offer 09. 用兩個棧實現隊列【棧】

用兩個棧實現一個隊列。隊列的聲明如下,請實現它的兩個函數 appendTaildeleteHead ,分別完成在隊列尾部插入整數和在隊列頭部刪除整數的功能。(若隊列中沒有元素,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 次調用

題意:使用棧實現隊列的隊尾插入和隊首刪除功能。

思路1:做過的題目;使用一個棧,插入時直接進入棧頂;刪除時需要把全部元素彈出並插入到臨時棧中,此時要刪除的元素在臨時棧棧頂,刪除即可;然後重新插入回原棧中。

代碼1:

class CQueue {
public:
    stack<int> st;
    CQueue() {}
    
    void appendTail(int value) {
        st.push(value);
    }
    
    int deleteHead() {
        if (st.empty()) return -1;
        stack<int> temp;
        while (!st.empty()) {
            temp.push(st.top());
            st.pop();
        } 
        int ans = temp.top(); temp.pop();
        while (!temp.empty()) {
            st.push(temp.top());
            temp.pop();
        }
        return ans;
    }
};
/**
 * Your CQueue object will be instantiated and called as such:
 * CQueue* obj = new CQueue();
 * obj->appendTail(value);
 * int param_2 = obj->deleteHead();
 */

效率:耗費空間少,但是時間慢,因爲在刪除元素時浪費了太多時間。

執行用時:1300 ms, 在所有 C++ 提交中擊敗了5.89% 的用戶
內存消耗:212 MB, 在所有 C++ 提交中擊敗了100.00% 的用戶

思路2:使用 inputoutput 兩個棧。刪除元素時僅需刪除 output 棧頂元素即可。

代碼2:

class CQueue {
public:
    stack<int> input, output;
    CQueue() {}
    
    void appendTail(int value) {
        input.push(value);
    }
    
    int deleteHead() {
        if (input.empty() && output.empty()) return -1;
        if (output.empty()) {
            while (!input.empty()) {
                output.push(input.top());
                input.pop();
            }
        }
        int ans = output.top(); output.pop();
        return ans;
    }
};

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

效率:

執行用時:728 ms, 在所有 C++ 提交中擊敗了55.06% 的用戶
內存消耗:103.6 MB, 在所有 C++ 提交中擊敗了100.00% 的用戶
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章