您好,登錄后才能下訂單哦!
小編給大家分享一下java中用兩個棧實現一個隊列的案例,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
Java基礎教程欄目介紹如何用兩個棧實現一個隊列。
隊列和棧是計算機中兩個非常重要的數據結構,經過前面的學習(《隊列》、《棧》)我們知道了它們各自的特點,隊列是先進先出(FIFO)的,而棧是先進后出(FILO)的,那如何用棧來實現隊列呢?這可是一道經典的面試題,所以本文我們就來實現一下。
在正式開始之前,我們先來回顧一下棧和隊列的常用方法。
棧(Stack)的常用方法包含以下這些:
隊列(Queue)的常用方法包含以下這些:
有了這些前置知識,接下來我們來看今天的題目。
用兩個棧實現一個隊列。隊列的聲明如下,請實現它的兩個函數 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 次調用
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(); } }復制代碼
我們在 LeetCode 中提交以上測試代碼,執行結果如下:
在整個實現過程中有兩個小細節需要特別注意一下:
以上是java中用兩個棧實現一個隊列的案例的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。