棧和隊列的“轉換”

今天在複習數據結構時候,看到棧和隊列這一章,有兩個很有意思的問題,
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 後進先出嘛!

發佈了30 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章