使用兩個棧實現佇列,簡單例子
阿新 • • 發佈:2018-12-17
棧, 取值是先進後出 ,後進先出。
那麼怎麼能按照佇列方式(先進先出)存值後取值呢?
看以下程式碼:
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棧的。
好了,就到此。