亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

隊列實現棧的方法有哪些

發布時間:2021-10-25 16:12:29 來源:億速云 閱讀:112 作者:iii 欄目:web開發

本篇內容介紹了“隊列實現棧的方法有哪些”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

先來回顧一下棧(Stack)和隊列(Queue)的特性和常見方法。

棧是后進先出(LIFO)的數據結構,常見方法如下:

  • push():入棧方法,向棧頂添加元素;

  • pop():出棧方法,將棧頂的元素移除并返回元素;

  • peek():查詢棧頂元素,并不會移除元素。

隊列實現棧的方法有哪些

隊列是先進先出(FIFO)的數據結構,常見方法如下:

  • offer():入隊方法,向隊尾添加元素;

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

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

隊列實現棧的方法有哪些

知道了這些基礎內容之后,就來看今天的問題吧。

題目描述使用隊列實現棧的下列操作:

  • push(x) -- 元素 x 入棧

  • pop() -- 移除棧頂元素

  • top() -- 獲取棧頂元素

  • empty() -- 返回棧是否為空

注意:

  • 你只能使用隊列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty  這些操作是合法的;

  • 你所使用的語言也許不支持隊列。你可以使用 list 或者 deque(雙端隊列)來模擬一個隊列 , 只要是標準的隊列操作即可;

  • 你可以假設所有操作都是有效的(例如, 對一個空的棧不會調用 pop 或者 top 操作)。

LeetCode  225:https://leetcode-cn.com/problems/implement-stack-using-queues/

題目解析

這道題的題目很好理解:只需要將先進先出的隊列,轉換為后進先出的“棧”就可以了,我們可以從多個方向入手來實現此功能,比如使用兩個隊列插入并交換的方式,或者是一個隊列插入再交換的方式,或雙端隊列的方式來實現此功能,具體實現方法和代碼如下。

實現方法 1:兩個隊列實現棧

之前我們用兩個棧實現了一個隊列的文章中,主要使用的是「負負得正」的思想,那么當看到此道題時,首先應該想到的是用兩個隊列來實現一個棧,但這里的實現思路和用棧實現隊列的思路又略有不同,因為隊列都是先進先出的,我們可以把它理解為「正數」,那么也就不能用「負負得正」的思想了,我們這里使用兩個隊列來實現棧,主要的操作思路是先將元素插入一個臨時隊列中,然后再將另一個隊列的所有元素插入到臨時隊列的尾部,從而實現后進先出功能的,具體的實現步驟如下。

步驟一

添加首個元素,入列到臨時隊列 queue2:

隊列實現棧的方法有哪些

步驟二

因為正式隊列中無元素,因此無需將 queue1 中的元素移動到臨時隊列 queue2 的尾部,直接將臨時隊列和正式隊列互換即可:

隊列實現棧的方法有哪些

步驟三

添加第二個元素,先入列到臨時隊列 queue2:

隊列實現棧的方法有哪些

步驟四

再將 queue1 中的元素移動到 queue2 的尾部,如下所示:

隊列實現棧的方法有哪些

步驟五

再將 queue1 和 queue2 進行互換:

隊列實現棧的方法有哪些

步驟六

執行出隊操作:

隊列實現棧的方法有哪些

隊列實現棧的方法有哪些

最終效果

隊列實現棧的方法有哪些

從最終的效果圖我們可以看出,通過兩個隊列已經實現了后進先出的特性,也就是完成了從隊列到棧的轉換,實現代碼如下:

import java.util.Queue;  class MyStack {      Queue<Integer> queue1;     Queue<Integer> queue2;      public MyStack() {         queue1 = new LinkedBlockingQueue();         queue2 = new LinkedBlockingQueue();     }      /**      * 入棧      */     public void push(int x) {         // 1.入列臨時隊列二         queue2.offer(x);         // 2.將隊列一的所有元素移動到隊列二         while (!queue1.isEmpty()) {             queue2.offer(queue1.poll());         }         // 3.隊列一和隊列二互換         Queue<Integer> temp = queue1;         queue1 = queue2;         queue2 = temp;     }      /**      * 出棧并返回此元素      */     public int pop() {         return queue1.poll();     }      /**      * 查詢棧頂元素      */     public int top() {         return queue1.peek();     }      /**      * 判斷是否為空      */     public boolean empty() {         return queue1.isEmpty();     } }

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

隊列實現棧的方法有哪些

此方法很穩,竟然擊敗了 100% 的用戶。

實現方法 2:一個隊列實現棧

那我們可以不可以用一個隊列來實現棧呢?答案是肯定的。

我們只需要執行以下兩個步驟就可以實現將隊列轉換為棧了,具體實現步驟如下:

將元素入列到隊尾;

再將除隊尾之外的所有元素移除并重寫入列。

這樣操作之后,最后進入的隊尾元素反而變成了隊頭元素,也就實現了后進先出的功能了,如下圖所示。

步驟一

元素 1 入列:

隊列實現棧的方法有哪些

步驟二

元素 2 入列:

隊列實現棧的方法有哪些

步驟三

將最后一個元素之前的所有元素,也就是元素 1,出列重新入列:

隊列實現棧的方法有哪些

隊列實現棧的方法有哪些

步驟四

執行出隊操作:

隊列實現棧的方法有哪些

最終效果

隊列實現棧的方法有哪些

以上思路的實現代碼如下:

import java.util.Queue;  class MyStack {     Queue<Integer> queue1;      public MyStack() {         queue1 = new LinkedBlockingQueue();     }      /**      * 入棧      */     public void push(int x) {         // 獲取原隊列長度(要移動的次數)         int count = queue1.size();         // 將元素放入隊尾         queue1.offer(x);         // 將除最后一個元素外,其他的元素重新入隊         for (int i = 0; i < count; i++) {             System.out.println("for");             queue1.offer(queue1.poll());         }     }      /**      * 出棧并返回此元素      */     public int pop() {         return queue1.poll();     }      /**      * 查詢棧頂元素      */     public int top() {         return queue1.peek();     }      /**      * 判斷是否為空      */     public boolean empty() {         return queue1.isEmpty();     } } 我們把以上代碼在 LeetCode

我們把以上代碼在 LeetCode 中提交,執行結果如下:

隊列實現棧的方法有哪些

此方法依舊很穩,也是同樣的擊敗了 100% 的用戶,只不過此方法在內存方面有更好的表現。

實現方法 3:雙端隊列實現棧

如果覺得以上方法比較難的話,最后我們還有一個更簡單的實現方法,我們可以使用 Java 中的雙端隊列 ArrayDeque  來實現將元素可以插入隊頭或隊尾,同樣移除也是,那么這樣我們就可以從隊尾入再從隊尾出,從而就實現了棧的功能了。

雙端隊列結構如下:

隊列實現棧的方法有哪些

我們來演示一下用雙端隊列實現棧的具體步驟。

步驟一

元素 1 入隊:

隊列實現棧的方法有哪些

步驟二

元素 2 入隊(隊尾):

隊列實現棧的方法有哪些

步驟三

再從隊尾出隊:

隊列實現棧的方法有哪些

隊列實現棧的方法有哪些

最終效果

隊列實現棧的方法有哪些

以上思路的實現代碼如下:

import java.util.ArrayDeque;  class MyStack {     ArrayDeque<Integer> deque;      public MyStack() {         deque = new ArrayDeque<>();     }      /**      * 入棧      */     public void push(int x) {         deque.offer(x);     }      /**      * 出棧并返回此元素      */     public int pop() {         return deque.pollLast();     }      /**      * 查詢棧頂元素      */     public int top() {         return empty() ? -1 : deque.peekLast();     }      /**      * 判斷是否為空      */     public boolean empty() {         return deque.isEmpty();     } }

我們把以上代碼在 LeetCode 中提交,執行結果如下:

隊列實現棧的方法有哪些

“隊列實現棧的方法有哪些”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鄂尔多斯市| 嘉义县| 丽江市| 兴安县| 定日县| 乐昌市| 安吉县| 香河县| 甘孜县| 无锡市| 哈巴河县| 车致| 苏尼特左旗| 定边县| 宿州市| 毕节市| 张家口市| 封丘县| 彭阳县| 克什克腾旗| 广安市| 静安区| 金门县| 汉寿县| 西乡县| 自贡市| 汉中市| 喜德县| 雷波县| 南丰县| 会昌县| 锡林郭勒盟| 樟树市| 莫力| 永胜县| 萍乡市| 阜阳市| 乌兰浩特市| 汾西县| 改则县| 句容市|