今天在複習數據結構時候,看到棧和隊列這一章,有兩個很有意思的問題,
1 如何使用兩個棧來實現一個隊列
2 如何使用兩個隊列來實現一個棧
思想都比較簡單,簡而言之就是兩邊兒來回倒
附兩張圖即可說明
接下來 記錄一下這兩個功能的java代碼實現
首先是兩個棧 實現一個隊列
package learnstack;
import java.util.Stack;
/*
* 本程序計劃使用兩個棧來實現一個隊列 棧 先進後出 隊列先進先出 怎麼結合兩個棧呢? 壓進去彈到另一個棧中就好
*/
public class test {
Stack<Integer> stack1=new Stack <Integer>();
Stack<Integer> stack2=new Stack <Integer>();
public void push(int node){
stack1.push(node);
}
public int pop(){
if(stack2.size()<=0){
while(stack1.size()>0){
stack2.push(stack1.pop());
}
}
if(stack2.isEmpty()){
try{
throw new Exception("queue is empty");
}catch (Exception e){
}
}
int head =stack2.pop();
return head;
}
public static void main(String[] args){
test test1=new test();
test1.push(0);
test1.push(1);
test1.push(2);
System.out.println(test1.pop());
System.out.println(test1.pop());
System.out.println(test1.pop());
}
}
在程序中壓入0 1 2 輸出結果自然是0 1 2咯
接着來記錄一下兩個隊列實現一個棧
package learnstack;
import java.util.Queue;
import java.util.ArrayDeque;
/*
* 本程序使用兩個隊列實現一個棧 隊列先進先出 棧後進先出 左右隊列來回倒
*/
public class test2 {
Queue<Integer> queue1= new ArrayDeque<>();
Queue<Integer> queue2= new ArrayDeque<>();
public void push(int node){
if(queue1.isEmpty()&&queue2.isEmpty()){
queue1.add(node);
return;
}
if(queue1.isEmpty()){
queue2.add(node);
return;
}
if(queue2.isEmpty()){
queue1.add(node);
return;
}
}
public int pop(){
if (queue1.isEmpty()&&queue2.isEmpty()) {
try {
throw new Exception("stack is empty");
} catch (Exception e) {
}
}
if(queue1.isEmpty()){
while(queue2.size()>1){
queue1.add(queue2.poll());
}
return queue2.poll();
}
if(queue2.isEmpty()){
while(queue1.size()>1){
queue2.add(queue1.poll());
}
return queue1.poll();
}
return (Integer)null;
}
public static void main(String[] args){
test2 t2=new test2();
t2.push(1);
t2.push(2);
t2.push(3);
t2.push(4);
System.out.println(t2.pop());
System.out.println(t2.pop());
}
}
壓入的參數是1 2 3 4 顯示兩個結果 則 輸出結果爲 4 3 後進先出嘛!