這篇文章將為大家詳細講解有關Java中棧和隊列如何相互轉換,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
棧和隊列的本質是相同的,都只能在線性表的一端進行插入和刪除。因此,棧和隊列可以相互轉換。
題目要求:僅使用兩個棧實現先入先出隊列。隊列應當支持一般隊列支持的所有操作
使用雙棧來實現隊列,我們就可以讓一個棧儲存具體元素,另一個棧做輔助

上圖可以看到,新元素進棧時,要確保該棧為空。進入棧的元素按順序存到輔助棧中,等新元素進入棧之后,再將輔助棧中的元素按順序出到該棧中。這樣操作之后,棧中元素存放的順序就和隊列的一樣啦
代碼實現:
//雙棧模擬隊列
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();
}
}
題目要求:僅使用兩個隊列實現一個后入先出(LIFO)的棧,并支持普通棧的全部四種操作

使用雙隊列實現棧, q1是存儲元素的隊列,保證q2添加元素之后永遠為空隊列(新元素直接入q2),保證新元素處在隊首。這樣的話,新元素入隊之后,另外一個隊列的元素依次出隊然后入隊,這樣就實現了一個棧。
代碼實現:
public class MyStack {
//q1是存儲元素的隊列
private Queue<Integer> q1 = new LinkedList<>();
//q2是輔助隊列
//添加元素后保證q2永遠為空
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();
}
}先將元素入隊,再將之前的元素依次出隊再入隊即可!也就是說,保證新元素在隊首
代碼實現:
public class MyStack {
private Queue<Integer> queue = new LinkedList<>();
public MyStack() {
}
public void push(int x) {
//記錄之前元素的個數
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();
}
}
這幾個例題實踐目的是更加熟悉的掌握和了解棧和隊列,實際應用中是不推薦的哦。
關于“Java中棧和隊列如何相互轉換”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。