棧, 取值是先進後出 ,後進先出。
那麼怎麼能按照隊列方式(先進先出)存值後取值呢?
看以下代碼:
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棧的。
好了,就到此。