寫在前面的聲明:
1,棧是先入后出的數據結構(就像將書裝入箱子,壓箱底的書總是要最后才能取出來)
2,隊列是先入先出的數據結構(就像排隊買票,先排隊的先買票,后來的后買)
小白版
- 初始化兩個棧S1和S2。
- S1作為元素的存儲空間,S2作為數據的臨時緩沖區(qū)
-
入隊
的時候,將數據壓入棧S1中 -
出隊
的時候,將S1中的元素依次出棧,并且壓入棧S2中,然后將S2中的棧頂元素出棧。 -
出隊
之后,將S2中的數據元素倒回到棧S1中
Paste_Image.png
升級版
入隊
時,先判斷S1是否為空,如不為空,說明所有元素都在S1,此時將入隊元素直接壓入S1;如為空,要將S2的元素逐個“倒回”S1,再壓入入隊元素。出隊
時,先判斷S2是否為空,如不為空,直接彈出S2的頂元素并出隊;如為空,將S1的元素逐個“倒入”S2,把最后一個元素彈出并出隊。
這種升級版可以在每次出隊之后不用將棧S2中的元素倒回到棧S1中,對于頻繁的出隊操作效率更高。
大師版
-
入隊
時,將元素壓入s1。 -
出隊
時,判斷s2是否為空,如不為空,則直接彈出頂元素;如為空,則將s1的元素逐個“倒入”s2,把最后一個元素彈出并出隊。
這個大師版,避免了反復“倒”棧,僅在需要時才“倒”一次
java實現如下
import java.util.Stack;
public class StackToQueue {
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
//入對的時候將數據元素壓入棧S1中
stack1.push(node);
}
public int pop() {
//如果S1不為空,將S1出棧的元素一次入棧到S2中
while(!stack1.isEmpty()){
stack2.push(stack1.pop());
}
//將S2的棧頂元素出棧,即出隊。
int first=stack2.pop();
//如果S2不為空,將S2中的元素出棧,然后入棧到S1中
while(!stack2.isEmpty()){
stack1.push(stack2.pop());
}
return first;
}
}