1. 程式人生 > >使用兩個棧實現佇列,簡單例子

使用兩個棧實現佇列,簡單例子

棧, 取值是先進後出 ,後進先出。

那麼怎麼能按照佇列方式(先進先出)存值後取值呢?

看以下程式碼:

import java.util.Stack;

/**
 * @Author : JCccc
 * @Description :
 * @Point: Keep a good mood
 **/
public class StackQueue {


    Stack<Integer> stackSave = new Stack<Integer>();
    Stack<Integer> stackRemove = new Stack<Integer>();

    @Override
    public String toString() {
        return "StackQueue{" +
                "stackSave=" + stackSave +
                ", stackRemove=" + stackRemove +
                '}';
    }

    public void push(int node) {

        stackSave.push(node);
    }

    public int pop() {

        if (stackRemove.empty()) {
            while (!stackSave.empty())
                stackRemove.push(stackSave.pop());
        }

        return stackRemove.pop();
    }


    public static void main(String[] args) {

        StackQueue stackQueue=new StackQueue();
        stackQueue.push(1);
        stackQueue.push(2);
        stackQueue.push(3);
        stackQueue.push(4);

        System.out.println(stackQueue.toString());
        stackQueue.pop();
        System.out.println(stackQueue.toString());
        stackQueue.pop();
        System.out.println(stackQueue.toString());
        stackQueue.pop();
        System.out.println(stackQueue.toString());

    }

}

執行結果為:

 

實現原理分析:

因為棧是先進後出,那麼意味著在一個棧一個值的時候是沒影響的,否則 就;

所以我們利用兩個棧實現佇列取值方式。

一個SAVE棧用於我們存入資料,

如程式碼,我連續先後存入1,2,3,4;

則SAVE棧此刻狀態應該是:

取值的時候,先判斷REMOVE棧是否是空的,空的就直接把SAVE棧資料的值全部一個個取出,全部存入REMOVE棧

,直到SAVE棧資料為空即停止。

這樣操作後,REMOVE棧此刻狀態應該是:

然後,從REMOVE棧一個個取值就是1,2,3,4這樣的順序了。

 

當然,如果你沒細想,可能會糾結那個判斷,當判斷REMOVE棧不為空的情況。

那麼,如果REMOVE棧不為空,證明SAVE之前就倒過一次資料了,REMOVE棧的資料肯定取出來也是正常的。

因為我們的程式碼裡,開始放資料都是放SAVE棧的。

 

好了,就到此。