- ##欄位介紹如何用兩個堆疊實作一個佇列。
# #佇列和堆疊是電腦中兩個非常重要的資料結構,經過前面的學習(《佇列》、《堆疊》)我們知道了它們各自的特點,佇列是先進先出(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 個堆疊只負責出棧(最終的佇列執行順序);- 每次堆疊2 出棧時都要把所有的元素都出完之後,才能從棧1 中追加(新增)新數據,當棧2 的數據沒有全部出棧完成時,不能將棧1 的元素入棧到棧2,這會導致元素的執行順序混亂。
- 總結
本文我們經過兩個先進後出的棧,透過「負負得正」的想法實現了隊列先進先出的特性,但需要特別注意的是當第2 個棧也就是出棧容器,在非空(棧)時不能將第1 個棧中的元素加入到第2 個棧中,以免造成程式執行順序混亂。
相關免費學習推薦:
以上是如何用兩個棧實作一個佇列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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

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

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

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

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


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

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

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

Atom編輯器mac版下載
最受歡迎的的開源編輯器

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

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