Java 棧和隊(duì)列的相互轉(zhuǎn)換詳解
棧和隊(duì)列的本質(zhì)是相同的,都只能在線性表的一端進(jìn)行插入和刪除。因此,棧和隊(duì)列可以相互轉(zhuǎn)換。
用棧實(shí)現(xiàn)隊(duì)列—力扣232題
題目要求:僅使用兩個(gè)棧實(shí)現(xiàn)先入先出隊(duì)列。隊(duì)列應(yīng)當(dāng)支持一般隊(duì)列支持的所有操作
使用雙棧來(lái)實(shí)現(xiàn)隊(duì)列,我們就可以讓一個(gè)棧儲(chǔ)存具體元素,另一個(gè)棧做輔助?

上圖可以看到,新元素進(jìn)棧時(shí),要確保該棧為空。進(jìn)入棧的元素按順序存到輔助棧中,等新元素進(jìn)入棧之后,再將輔助棧中的元素按順序出到該棧中。這樣操作之后,棧中元素存放的順序就和隊(duì)列的一樣啦
代碼實(shí)現(xiàn):
//雙棧模擬隊(duì)列
public class MyQueue{
//實(shí)際存儲(chǔ)元素的棧
private Stack<Integer> s1 = new Stack<>();
//輔助棧
private Stack<Integer> s2 = new Stack<>();
public MyQueue() {
}
//將元素 x 推到隊(duì)列的末尾
public void push(int x) {
if (s1.empty()){//棧為空,直接放入x
s1.push(x);
}else {
//此時(shí)不為空
//先把s1所有元素彈出放入s2
while (!s1.empty()){
s2.push(s1.pop());//s2放入的值就是s2彈出的值
//以下兩句和上一句相同
// int val = s1.pop();
// s2.push(val);
}
//將新元素直接放入s1,此時(shí)新元素就處在s1的棧頂
s1.push(x);
//再次將s2的所有值依次彈出放入s1
while (!s2.empty()){
s1.push(s2.pop());
}
}
}
//從隊(duì)列的開(kāi)頭移除并返回元素
public int pop() {
return s1.pop();
}
//返回隊(duì)列開(kāi)頭的元素
public int peek() {
return s1.peek();
}
//判斷隊(duì)列是否為空
public boolean empty() {
return s1.empty();
}
}

用隊(duì)列實(shí)現(xiàn)?!?25題?
題目要求:僅使用兩個(gè)隊(duì)列實(shí)現(xiàn)一個(gè)后入先出(LIFO)的棧,并支持普通棧的全部四種操作
1. 雙隊(duì)列實(shí)現(xiàn)棧

使用雙隊(duì)列實(shí)現(xiàn)棧, q1是存儲(chǔ)元素的隊(duì)列,保證q2添加元素之后永遠(yuǎn)為空隊(duì)列(新元素直接入q2),保證新元素處在隊(duì)首。這樣的話,新元素入隊(duì)之后,另外一個(gè)隊(duì)列的元素依次出隊(duì)然后入隊(duì),這樣就實(shí)現(xiàn)了一個(gè)棧。
代碼實(shí)現(xiàn):
public class MyStack {
//q1是存儲(chǔ)元素的隊(duì)列
private Queue<Integer> q1 = new LinkedList<>();
//q2是輔助隊(duì)列
//添加元素后保證q2永遠(yuǎn)為空
private Queue<Integer> q2 = new LinkedList<>();
public MyStack () {
}
//將元素 x 壓入棧頂
public void push(int x) {
//新入隊(duì)元素直接入q2,成為q2隊(duì)首
q2.offer(x);
//將q1中的所有元素依次出隊(duì),入q2
while (!q1.isEmpty()){
q2.offer(q1.poll());
}
//q1為空,q2為存儲(chǔ)元素的隊(duì)列,互換引用指向
//互換之后,q1任然是存儲(chǔ)元素的隊(duì)列,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.一個(gè)隊(duì)列實(shí)現(xiàn)棧
先將元素入隊(duì),再將之前的元素依次出隊(duì)再入隊(duì)即可!也就是說(shuō),保證新元素在隊(duì)首
代碼實(shí)現(xiàn):
public class MyStack {
private Queue<Integer> queue = new LinkedList<>();
public MyStack() {
}
public void push(int x) {
//記錄之前元素的個(gè)數(shù)
int size = queue.size();
//將新元素入隊(duì)
queue.offer(x);
//將之前的元素依次出隊(duì)再入隊(duì),新元素就在隊(duì)首位置
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();
}
}

這幾個(gè)例題實(shí)踐目的是更加熟悉的掌握和了解棧和隊(duì)列,實(shí)際應(yīng)用中是不推薦的哦。
到此這篇關(guān)于Java 棧和隊(duì)列的相互轉(zhuǎn)換詳解的文章就介紹到這了,更多相關(guān)Java 棧和隊(duì)列 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java 數(shù)據(jù)結(jié)構(gòu)之棧與隊(duì)列
- java 數(shù)據(jù)結(jié)構(gòu)中棧和隊(duì)列的實(shí)例詳解
- Java深入了解數(shù)據(jù)結(jié)構(gòu)之棧與隊(duì)列的詳解
- Java棧和基礎(chǔ)隊(duì)列的實(shí)現(xiàn)詳解
- 一起來(lái)學(xué)習(xí)Java的棧和隊(duì)列
- Java?棧與隊(duì)列實(shí)戰(zhàn)真題訓(xùn)練
- Java 棧與隊(duì)列超詳細(xì)分析講解
- Java使用跳轉(zhuǎn)結(jié)構(gòu)實(shí)現(xiàn)隊(duì)列和棧流程詳解
- Java線性結(jié)構(gòu)中棧、隊(duì)列和串的基本概念和特點(diǎn)詳解
- Java常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)之棧和隊(duì)列詳解
- Java 棧和隊(duì)列的交互實(shí)現(xiàn)
相關(guān)文章
Java調(diào)用Python腳本傳遞數(shù)據(jù)并返回計(jì)算結(jié)果
實(shí)際工程項(xiàng)目中可能會(huì)用到Java和python兩種語(yǔ)言結(jié)合進(jìn)行,這樣就會(huì)涉及到一個(gè)問(wèn)題,Java如何調(diào)用Python腳本,感興趣的可以了解一下2021-05-05
java?poi導(dǎo)入純數(shù)字等格式問(wèn)題及解決
這篇文章主要介紹了java?poi導(dǎo)入純數(shù)字等格式問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
Java swing實(shí)現(xiàn)的計(jì)算器功能完整實(shí)例
這篇文章主要介紹了Java swing實(shí)現(xiàn)的計(jì)算器功能,結(jié)合完整實(shí)例形式分析了java基于swing組件實(shí)現(xiàn)計(jì)算器布局與運(yùn)算功能的具體操作技巧,需要的朋友可以參考下2017-12-12
java web項(xiàng)目里ehcache.xml介紹
java web項(xiàng)目里ehcache.xml介紹,需要的朋友可以參考一下2013-03-03
Java日期時(shí)間與正則表達(dá)式超詳細(xì)整理(適合新手入門)
如果使用得當(dāng),正則表達(dá)式是匹配各種模式的強(qiáng)大工具,下面這篇文章主要給大家介紹了關(guān)于Java日期時(shí)間與正則表達(dá)式超詳細(xì)整理的相關(guān)資料,本文非常適合新手入門,需要的朋友可以參考下2023-04-04

