成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

隊列實現(xiàn)棧的3種方法,全都擊敗了100%的用戶!

開發(fā) 前端
今天我們要講的是「用隊列實現(xiàn)棧」,它們都屬于常見的面試題,而我們今天要用多種方法來實現(xiàn)隊列到棧的“轉(zhuǎn)變”。

[[349753]]

本文轉(zhuǎn)載自微信公眾號「Java中文社群」,作者磊哥。轉(zhuǎn)載本文請聯(lián)系Java中文社群公眾號。   

今天我們要講的是「用隊列實現(xiàn)棧」,它們都屬于常見的面試題,而我們今天要用多種方法來實現(xiàn)隊列到棧的“轉(zhuǎn)變”。

老規(guī)矩,先來回顧一下棧(Stack)和隊列(Queue)的特性和常見方法。

棧是后進(jìn)先出(LIFO)的數(shù)據(jù)結(jié)構(gòu),常見方法如下:

  • push():入棧方法,向棧頂添加元素;
  • pop():出棧方法,將棧頂?shù)脑匾瞥⒎祷卦?
  • peek():查詢棧頂元素,并不會移除元素。

 

隊列是先進(jìn)先出(FIFO)的數(shù)據(jù)結(jié)構(gòu),常見方法如下:

  • offer():入隊方法,向隊尾添加元素;
  • poll():出隊方法,從隊頭移除并返回元素;
  • peek():查詢隊頭元素,并不會移除元素。

知道了這些基礎(chǔ)內(nèi)容之后,就來看今天的問題吧。

 

題目描述使用隊列實現(xiàn)棧的下列操作:

  • push(x) -- 元素 x 入棧
  • pop() -- 移除棧頂元素
  • top() -- 獲取棧頂元素
  • empty() -- 返回棧是否為空

注意:

  • 你只能使用隊列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 這些操作是合法的;
  • 你所使用的語言也許不支持隊列。你可以使用 list 或者 deque(雙端隊列)來模擬一個隊列 , 只要是標(biāo)準(zhǔn)的隊列操作即可;
  • 你可以假設(shè)所有操作都是有效的(例如, 對一個空的棧不會調(diào)用 pop 或者 top 操作)。

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

題目解析

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

實現(xiàn)方法 1:兩個隊列實現(xiàn)棧

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

步驟一

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

 

步驟二

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

 

步驟三

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

 

步驟四

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

 

步驟五

再將 queue1 和 queue2 進(jìn)行互換:

 

步驟六

執(zhí)行出隊操作:

 

最終效果

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

  1. import java.util.Queue; 
  2.  
  3. class MyStack { 
  4.  
  5.     Queue<Integer> queue1; 
  6.     Queue<Integer> queue2; 
  7.  
  8.     public MyStack() { 
  9.         queue1 = new LinkedBlockingQueue(); 
  10.         queue2 = new LinkedBlockingQueue(); 
  11.     } 
  12.  
  13.     /** 
  14.      * 入棧 
  15.      */ 
  16.     public void push(int x) { 
  17.         // 1.入列臨時隊列二 
  18.         queue2.offer(x); 
  19.         // 2.將隊列一的所有元素移動到隊列二 
  20.         while (!queue1.isEmpty()) { 
  21.             queue2.offer(queue1.poll()); 
  22.         } 
  23.         // 3.隊列一和隊列二互換 
  24.         Queue<Integertemp = queue1; 
  25.         queue1 = queue2; 
  26.         queue2 = temp
  27.     } 
  28.  
  29.     /** 
  30.      * 出棧并返回此元素 
  31.      */ 
  32.     public int pop() { 
  33.         return queue1.poll(); 
  34.     } 
  35.  
  36.     /** 
  37.      * 查詢棧頂元素 
  38.      */ 
  39.     public int top() { 
  40.         return queue1.peek(); 
  41.     } 
  42.  
  43.     /** 
  44.      * 判斷是否為空 
  45.      */ 
  46.     public boolean empty() { 
  47.         return queue1.isEmpty(); 
  48.     } 

我們在 LeetCode 中提交以上測試代碼,執(zhí)行結(jié)果如下:

 

此方法很穩(wěn),竟然擊敗了 100% 的用戶。

實現(xiàn)方法 2:一個隊列實現(xiàn)棧

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

我們只需要執(zhí)行以下兩個步驟就可以實現(xiàn)將隊列轉(zhuǎn)換為棧了,具體實現(xiàn)步驟如下:

將元素入列到隊尾;

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

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

步驟一

元素 1 入列:

 

步驟二

元素 2 入列:

 

步驟三

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

 

步驟四

執(zhí)行出隊操作:

 

最終效果

以上思路的實現(xiàn)代碼如下:

  1. import java.util.Queue; 
  2.  
  3. class MyStack { 
  4.     Queue<Integer> queue1; 
  5.  
  6.     public MyStack() { 
  7.         queue1 = new LinkedBlockingQueue(); 
  8.     } 
  9.  
  10.     /** 
  11.      * 入棧 
  12.      */ 
  13.     public void push(int x) { 
  14.         // 獲取原隊列長度(要移動的次數(shù)) 
  15.         int count = queue1.size(); 
  16.         // 將元素放入隊尾 
  17.         queue1.offer(x); 
  18.         // 將除最后一個元素外,其他的元素重新入隊 
  19.         for (int i = 0; i < count; i++) { 
  20.             System.out.println("for"); 
  21.             queue1.offer(queue1.poll()); 
  22.         } 
  23.     } 
  24.  
  25.     /** 
  26.      * 出棧并返回此元素 
  27.      */ 
  28.     public int pop() { 
  29.         return queue1.poll(); 
  30.     } 
  31.  
  32.     /** 
  33.      * 查詢棧頂元素 
  34.      */ 
  35.     public int top() { 
  36.         return queue1.peek(); 
  37.     } 
  38.  
  39.     /** 
  40.      * 判斷是否為空 
  41.      */ 
  42.     public boolean empty() { 
  43.         return queue1.isEmpty(); 
  44.     } 
  45. 我們把以上代碼在 LeetCode  

我們把以上代碼在 LeetCode 中提交,執(zhí)行結(jié)果如下:

 

此方法依舊很穩(wěn),也是同樣的擊敗了 100% 的用戶,只不過此方法在內(nèi)存方面有更好的表現(xiàn)。

實現(xiàn)方法 3:雙端隊列實現(xiàn)棧

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

雙端隊列結(jié)構(gòu)如下:

 

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

步驟一

元素 1 入隊:

 

步驟二

元素 2 入隊(隊尾):

 

步驟三

再從隊尾出隊:

 

最終效果

以上思路的實現(xiàn)代碼如下:

  1. import java.util.ArrayDeque; 
  2.  
  3. class MyStack { 
  4.     ArrayDeque<Integer> deque; 
  5.  
  6.     public MyStack() { 
  7.         deque = new ArrayDeque<>(); 
  8.     } 
  9.  
  10.     /** 
  11.      * 入棧 
  12.      */ 
  13.     public void push(int x) { 
  14.         deque.offer(x); 
  15.     } 
  16.  
  17.     /** 
  18.      * 出棧并返回此元素 
  19.      */ 
  20.     public int pop() { 
  21.         return deque.pollLast(); 
  22.     } 
  23.  
  24.     /** 
  25.      * 查詢棧頂元素 
  26.      */ 
  27.     public int top() { 
  28.         return empty() ? -1 : deque.peekLast(); 
  29.     } 
  30.  
  31.     /** 
  32.      * 判斷是否為空 
  33.      */ 
  34.     public boolean empty() { 
  35.         return deque.isEmpty(); 
  36.     } 

我們把以上代碼在 LeetCode 中提交,執(zhí)行結(jié)果如下:

 

 

總結(jié)

本文我們用 3 種方法實現(xiàn)了將隊列轉(zhuǎn)換為棧,其中最簡單的方法是用 Java 中自帶的雙端隊列 ArrayDeque 從隊尾入并從隊尾出就實現(xiàn)了棧 ,其他兩個方法使用的是普通隊列,通過入隊之后再移動元素到入隊元素之后的方法,從而實現(xiàn)了棧的功能。

 

責(zé)任編輯:武曉燕 來源: Java中文社群
相關(guān)推薦

2020-10-21 08:17:11

隊列數(shù)據(jù)

2018-08-02 09:50:47

Linux命令用戶信息

2021-03-01 23:31:48

隊列實現(xiàn)棧存儲

2020-04-02 10:45:48

多云云計算云平臺

2022-08-11 08:03:43

隊列

2010-05-27 18:18:14

MySQL修改root

2019-04-02 09:53:22

2009-10-29 16:32:24

查看Oracle用戶的

2021-03-21 22:23:38

云計算數(shù)據(jù)中心IT

2021-07-13 12:31:27

IT組織改進(jìn)首席技術(shù)官

2009-08-18 13:22:55

C#動態(tài)調(diào)用Web服務(wù)

2019-11-27 08:00:00

Linux系統(tǒng)用戶管理員

2020-06-09 10:09:38

IT預(yù)算首席財務(wù)官CIO

2018-12-19 19:30:46

JavaScript創(chuàng)建對象前端

2019-09-11 11:09:54

人工智能數(shù)據(jù)機(jī)器學(xué)習(xí)

2020-01-21 19:15:23

漏洞安全IT

2025-03-12 09:54:02

2024-02-02 08:25:34

隊列與棧Python數(shù)據(jù)結(jié)構(gòu)

2010-08-02 14:04:29

Flex4教程

2021-05-28 08:23:03

JavaScriptSet編程
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲 欧美 在线 一区 | 欧美综合国产精品久久丁香 | 亚洲欧美中文日韩在线v日本 | 国产1区2区3区 | 九九99九九精彩46 | 久草精品视频 | 国产精品视频 | 免费看a | 久久亚洲国产精品 | 国产精品免费av | 国产伦精品 | 成年人网站免费 | 精品亚洲视频在线 | 成人亚洲综合 | 91网站在线看 | 成人一级黄色毛片 | 精品视频免费 | 日本激情一区二区 | www.亚洲一区二区三区 | 99re视频在线观看 | 欧美中文在线 | 国产在线中文字幕 | 欧美日韩一区二区视频在线观看 | 久久久久久久久久久福利观看 | 久久久久亚洲国产| 欧洲精品久久久久毛片完整版 | 欧美成人一区二区 | 成人久久久 | 一级片av| 免费看a| 久久久久电影 | 成人午夜影院 | 国产免费一区二区三区 | 日韩精品国产精品 | 中文字幕一区二区三区在线乱码 | 欧美精品在线观看 | 亚洲一区二区三区四区五区午夜 | 国产精品日韩欧美一区二区三区 | 日韩视频一区二区 | 欧美精品在线一区二区三区 | a级在线观看 |