Java 棧和隊列的相互轉(zhuǎn)換詳解
棧和隊列的本質(zhì)是相同的,都只能在線性表的一端進(jìn)行插入和刪除。因此,棧和隊列可以相互轉(zhuǎn)換。
用棧實現(xiàn)隊列—力扣232題
題目要求:僅使用兩個棧實現(xiàn)先入先出隊列。隊列應(yīng)當(dāng)支持一般隊列支持的所有操作
使用雙棧來實現(xiàn)隊列,我們就可以讓一個棧儲存具體元素,另一個棧做輔助?
上圖可以看到,新元素進(jìn)棧時,要確保該棧為空。進(jìn)入棧的元素按順序存到輔助棧中,等新元素進(jìn)入棧之后,再將輔助棧中的元素按順序出到該棧中。這樣操作之后,棧中元素存放的順序就和隊列的一樣啦
代碼實現(xiàn):
//雙棧模擬隊列 public class MyQueue{ //實際存儲元素的棧 private Stack<Integer> s1 = new Stack<>(); //輔助棧 private Stack<Integer> s2 = new Stack<>(); public MyQueue() { } //將元素 x 推到隊列的末尾 public void push(int x) { if (s1.empty()){//棧為空,直接放入x s1.push(x); }else { //此時不為空 //先把s1所有元素彈出放入s2 while (!s1.empty()){ s2.push(s1.pop());//s2放入的值就是s2彈出的值 //以下兩句和上一句相同 // int val = s1.pop(); // s2.push(val); } //將新元素直接放入s1,此時新元素就處在s1的棧頂 s1.push(x); //再次將s2的所有值依次彈出放入s1 while (!s2.empty()){ s1.push(s2.pop()); } } } //從隊列的開頭移除并返回元素 public int pop() { return s1.pop(); } //返回隊列開頭的元素 public int peek() { return s1.peek(); } //判斷隊列是否為空 public boolean empty() { return s1.empty(); } }
用隊列實現(xiàn)?!?25題?
題目要求:僅使用兩個隊列實現(xiàn)一個后入先出(LIFO)的棧,并支持普通棧的全部四種操作
1. 雙隊列實現(xiàn)棧
使用雙隊列實現(xiàn)棧, q1是存儲元素的隊列,保證q2添加元素之后永遠(yuǎn)為空隊列(新元素直接入q2),保證新元素處在隊首。這樣的話,新元素入隊之后,另外一個隊列的元素依次出隊然后入隊,這樣就實現(xiàn)了一個棧。
代碼實現(xiàn):
public class MyStack { //q1是存儲元素的隊列 private Queue<Integer> q1 = new LinkedList<>(); //q2是輔助隊列 //添加元素后保證q2永遠(yuǎn)為空 private Queue<Integer> q2 = new LinkedList<>(); public MyStack () { } //將元素 x 壓入棧頂 public void push(int x) { //新入隊元素直接入q2,成為q2隊首 q2.offer(x); //將q1中的所有元素依次出隊,入q2 while (!q1.isEmpty()){ q2.offer(q1.poll()); } //q1為空,q2為存儲元素的隊列,互換引用指向 //互換之后,q1任然是存儲元素的隊列,q2為空 Queue<Integer> temp = q1; q1 = q2; q2 = temp; } // 移除并返回棧頂元素 public int pop() { return q1.poll(); } //返回棧頂元素 public int top() { return q1.peek(); } //判斷棧是否為空 public boolean empty() { return q1.isEmpty(); } }
2.一個隊列實現(xiàn)棧
先將元素入隊,再將之前的元素依次出隊再入隊即可!也就是說,保證新元素在隊首
代碼實現(xiàn):
public class MyStack { private Queue<Integer> queue = new LinkedList<>(); public MyStack() { } public void push(int x) { //記錄之前元素的個數(shù) int size = queue.size(); //將新元素入隊 queue.offer(x); //將之前的元素依次出隊再入隊,新元素就在隊首位置 for (int i = 0; i < size; i++) { queue.offer(queue.poll()); } } public int pop() { return queue.poll(); } public int top() { return queue.peek(); } public boolean empty() { return queue.isEmpty(); } }
這幾個例題實踐目的是更加熟悉的掌握和了解棧和隊列,實際應(yīng)用中是不推薦的哦。
到此這篇關(guān)于Java 棧和隊列的相互轉(zhuǎn)換詳解的文章就介紹到這了,更多相關(guān)Java 棧和隊列 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java 數(shù)據(jù)結(jié)構(gòu)之棧與隊列
- java 數(shù)據(jù)結(jié)構(gòu)中棧和隊列的實例詳解
- Java深入了解數(shù)據(jù)結(jié)構(gòu)之棧與隊列的詳解
- Java棧和基礎(chǔ)隊列的實現(xiàn)詳解
- 一起來學(xué)習(xí)Java的棧和隊列
- Java?棧與隊列實戰(zhàn)真題訓(xùn)練
- Java 棧與隊列超詳細(xì)分析講解
- Java使用跳轉(zhuǎn)結(jié)構(gòu)實現(xiàn)隊列和棧流程詳解
- Java線性結(jié)構(gòu)中棧、隊列和串的基本概念和特點詳解
- Java常見的數(shù)據(jù)結(jié)構(gòu)之棧和隊列詳解
- Java 棧和隊列的交互實現(xiàn)
相關(guān)文章
詳解Java8與Runtime.getRuntime().availableProcessors()
這篇文章主要介紹了詳解Java8與Runtime.getRuntime().availableProcessors(),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06mybatis 自定義實現(xiàn)攔截器插件Interceptor示例
這篇文章主要介紹了mybatis 自定義實現(xiàn)攔截器插件Interceptor,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10玩轉(zhuǎn)SpringBoot2快速整合攔截器的方法
這篇文章主要介紹了玩轉(zhuǎn)SpringBoot2快速整合攔截器的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09