搜尋
首頁JavaJava基礎如何用兩個棧實作一個佇列?

如何用兩個棧實作一個佇列?

Oct 26, 2020 pm 05:54 PM
java堆疊佇列

Java基礎教學

如何用兩個棧實作一個佇列?

  • ##欄位介紹如何用兩個堆疊實作一個佇列。

如何用兩個棧實作一個佇列?

# #佇列和堆疊是電腦中兩個非常重要的資料結構,經過前面的學習(《佇列》、《堆疊》)我們知道了它們各自的特點,佇列是先進先出(FIFO)的,而堆疊是先進後面出(FILO)的,那如何用堆疊來實作佇列呢?這不過是一個經典的面試題,所以本文我們就來實作一下。

    在正式開始之前,我們先來回顧一下堆疊和佇列的常用方法。
  • 堆疊(Stack)的常用方法包含以下內容:
  • ##push():入堆疊方法,在堆疊頂部新增元素;
  • pop():出棧方法,將棧頂的元素移除並傳回元素;

peek():查詢棧頂元素,不會移除元素。如何用兩個棧實作一個佇列?

##佇列(Queue)的常用方法包含以下內容:

##offer():入隊方法,將元素加入隊尾;

poll():出隊方法,從隊頭移除並返回元素;

peek():查詢隊頭元素,並不會移除元素。

有了這些前置知識,接下來我們看今天的問題。

問題描述

用兩個堆疊實作一個佇列。佇列的語句如下,請實作它的兩個函數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 最多會對 appendTail、deleteHead 進行 10000 次呼叫

leetcode:leetcode-cn.com/problems/yo…

解解題思路

這題目的意思其實很好理解,就是要將先進後出的棧改為先進先出的隊列,其實問題中也給了一些提示,「用兩個棧來實作一個隊列」。

這題實現的核心思想就是「負負得正」,我們先用一個棧來存入元素(這時最先進入的元素在棧底),然後再將第一個棧中的元素移動到新棧中,此時最先進入的元素就在棧頂了,然後在用第二個棧出棧時,整個執行的順序就變成了先進先出。

接下來,我們用圖解的方式來實現整個流程。

步驟一

先將元素入堆疊到第一個堆疊中,如下圖所示:

如何用兩個棧實作一個佇列?

步驟二

##將第一個堆疊中的元素都會移動到第二個堆疊中,如下圖所示:

如何用兩個棧實作一個佇列?步驟三

所有元素從第二個堆疊中出棧,如下圖所示:

如何用兩個棧實作一個佇列?小結

從上述圖片可以看出,元素新增順序是1、2、3,最後經過兩個堆疊之後的出棧順序也是1、2 、3,這樣我們就透過兩個棧實現了佇列(先進先出)。

如何用兩個棧實作一個佇列?實作程式碼

接下來我們就用程式碼來實作以上思路:

class CQueue {
    Stack<integer> inputStack; // 入栈的容器(添加时操作)
    Stack<integer> outputStack; // 出栈和查询的栈容器

    public CQueue() {
        inputStack = new Stack();
        outputStack = new Stack();
    }    // 添加操作
    public void appendTail(int value) {
        inputStack.push(value);
    }    // 删除操作
    public int deleteHead() {        if (!outputStack.isEmpty()) {            // 出栈容器不为空
            return outputStack.pop();
        } else if (!inputStack.isEmpty()) {            // 入栈 stack 全部转移到出栈 stack
            while (!inputStack.isEmpty()) {
                outputStack.push(inputStack.pop());
            }
        }        return outputStack.isEmpty() ? -1 : outputStack.pop();
    }
}复制代码</integer></integer>

我們在LeetCode 中提交以上測試程式碼,執行結果如下:

如何用兩個棧實作一個佇列?注意事項

在整個實作過程中有兩個小細節需要特別注意一下:

第1 個堆疊只負責入堆疊(暫存資料),第2 個堆疊只負責出棧(最終的佇列執行順序);
  1. 每次堆疊2 出棧時都要把所有的元素都出完之後,才能從棧1 中追加(新增)新數據,當棧2 的數據沒有全部出棧完成​​時,不能將棧1 的元素入棧到棧2,這會導致元素的執行順序混亂。
  2. 總結

本文我們經過兩個先進後出的棧,透過「負負得正」的想法實現了隊列先進先出的特性,但需要特別注意的是當第2 個棧也就是出棧容器,在非空(棧)時不能將第1 個棧中的元素加入到第2 個棧中,以免造成程式執行順序混亂。

相關免費學習推薦:

java基礎教學

以上是如何用兩個棧實作一個佇列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:juejin。如有侵權,請聯絡admin@php.cn刪除
Java中有哪些不同的垃圾收集算法(串行,並行,CMS,G1,ZGC)?Java中有哪些不同的垃圾收集算法(串行,並行,CMS,G1,ZGC)?Mar 14, 2025 pm 05:06 PM

本文討論了各種Java垃圾收集算法(串行,並行,CMS,G1,ZGC),它們的性能影響和適合大量堆的應用。

什麼是Java虛擬機(JVM),它在內部如何工作?什麼是Java虛擬機(JVM),它在內部如何工作?Mar 14, 2025 pm 05:05 PM

本文討論了Java虛擬機(JVM),詳細介紹了其在不同平台運行Java程序中的作用。它說明了JVM的內部流程,密鑰組件,內存管理,垃圾收集和性能Optimizatio

如何使用Java的Nashorn Engine用JavaScript腳本?如何使用Java的Nashorn Engine用JavaScript腳本?Mar 14, 2025 pm 05:00 PM

Java的Nashorn Engine可以在Java應用程序中啟用JavaScript腳本。關鍵步驟包括設置Nashorn,管理腳本和優化性能。主要問題涉及安全性,內存管理和未來兼容性

如何使用Java的Try-with-Resources語句進行自動資源管理?如何使用Java的Try-with-Resources語句進行自動資源管理?Mar 14, 2025 pm 04:59 PM

Java的Try-with-Resources通過自動關閉文件流或數據庫連接等資源來簡化資源管理,從而提高代碼可讀性和可維護性。

如何使用Java的枚舉來表示固定的值集?如何使用Java的枚舉來表示固定的值集?Mar 14, 2025 pm 04:57 PM

Java枚舉代表固定的值集,通過自定義方法和構造函數提供類型安全性,可讀性和其他功能。它們增強了代碼組織,可用於開關語句中以進行有效的價值處理。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)