天天看點

使用兩個棧實作隊列,簡單例子

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

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

看以下代碼:

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棧的。

好了,就到此。