用兩個(gè)棧實(shí)現(xiàn)隊(duì)列

用兩個(gè)棧實(shí)現(xiàn)隊(duì)列

題目描述:

用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列。隊(duì)列的聲明如下,請實(shí)現(xiàn)它的兩個(gè)函數(shù) appendTail 和 deleteHead ,分別完成在隊(duì)列尾部插入整數(shù)和在隊(duì)列頭部刪除整數(shù)的功能。(若隊(duì)列中沒有元素,deleteHead 操作返回 -1 )

解題思路

  • 一個(gè)棧用于保存輸入元素,并一個(gè)元素用于保存輸出元素。隊(duì)列末尾添加元素時(shí),即向 in 棧中添加元素,當(dāng)從隊(duì)頭刪除元素時(shí),將 in 棧中的元素出棧,每次先出棧元素 pushout 棧中,這樣起到反轉(zhuǎn)元素順序的作用,此時(shí)對 out 棧進(jìn)行 pop ,就相當(dāng)于從對頭刪除元素

由于問題特殊,以下分析僅滿足添加 N 個(gè)元素并刪除 N 個(gè)元素,即棧初始和結(jié)束狀態(tài)下都為空的情況

  • 時(shí)間復(fù)雜度:appendTail()函數(shù)為 O(1);deleteHead() 函數(shù)在 N 次隊(duì)首元素刪除操作中總共需完成 N 個(gè)元素的倒序。
  • 空間復(fù)雜度:O(N)
class CQueue {
    Deque<Integer> in;
    Deque<Integer> out;
    public CQueue() {
        in = new ArrayDeque<>();
        out = new ArrayDeque<>();
    }
    
    public void appendTail(int value) {
        in.push(value);
    }
    
    public int deleteHead() {
        if (in.isEmpty() && out.isEmpty())
            return -1 ;

        if (out.isEmpty()) {
            while(!in.isEmpty()) {
                out.push(in.pop());
            }
        }

        return out.pop();
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容