《劍指offer》 面試題09. 用兩個棧實現隊列

題目描述

用兩個棧實現一個隊列。隊列的聲明如下,請實現它的兩個函數 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 次調用

思路一

用棧s1作爲主棧,棧s2爲輔助棧。每次隊列增加元素,將s1每個元素壓棧到s2,再將新增元素壓入s1棧底,最後將s2元素全部壓回s1
該方法不是最優解,時間複雜度較高

class CQueue {
private:
    stack<int> s1;
    stack<int> s2; 
public:
    CQueue() {

    }
    
    void appendTail(int value) {
        while(!s1.empty())
        {
            s2.push(s1.top());
            s1.pop();
        }
        s1.push(value);
        while(!s2.empty())
        {
            s1.push(s2.top());
            s2.pop();
        }
    }
    
    int deleteHead() {
        if(s1.empty()) return -1;
        int x = s1.top();
        s1.pop();
        return x;
    }
};

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

思路二(最優解)

棧s1、s2各司其職,s1用來隊列頭部增加元素,s2用來隊列尾部刪減元素。只需當s2爲空時,將s1的所有元素壓入s2即可.

class CQueue {
    stack<int>s1;
    stack<int>s2;
public:
    CQueue() {

    }
    
    void appendTail(int value) {
        s1.push(value);
    }
    
    int deleteHead() {
        if(s2.empty()){
            if(s1.empty()){
                return -1;
            }
            else{
                while(!s1.empty()){
                    s2.push(s1.top());
                    s1.pop();
                }               
            }
        }
        int head=s2.top();
        s2.pop();
        return head;
    }
};

/**
 * Your CQueue object will be instantiated and called as such:
 * CQueue* obj = new CQueue();
 * obj->appendTail(value);
 * int param_2 = obj->deleteHead();
 */
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章