# #佇列和堆疊是電腦中兩個非常重要的資料結構,經過前面的學習(《佇列》、《堆疊》)我們知道了它們各自的特點,佇列是先進先出(FIFO)的,而堆疊是先進後面出(FILO)的,那如何用堆疊來實作佇列呢?這不過是一個經典的面試題,所以本文我們就來實作一下。
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…解解題思路這題目的意思其實很好理解,就是要將先進後出的棧改為先進先出的隊列,其實問題中也給了一些提示,「用兩個棧來實作一個隊列」。
這題實現的核心思想就是「負負得正」,我們先用一個棧來存入元素(這時最先進入的元素在棧底),然後再將第一個棧中的元素移動到新棧中,此時最先進入的元素就在棧頂了,然後在用第二個棧出棧時,整個執行的順序就變成了先進先出。
接下來,我們用圖解的方式來實現整個流程。 步驟一先將元素入堆疊到第一個堆疊中,如下圖所示:步驟二步驟三
小結
實作程式碼
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 中提交以上測試程式碼,執行結果如下:
注意事項
相關免費學習推薦:
以上是如何用兩個棧實作一個佇列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!