由兩個棧組成隊列
阿新 • • 發佈:2018-09-02
port except exception img png str auth 要求 else
【題目】
編寫一個類,用兩個棧實現隊列,支持隊列的基本操作(add、poll、peek)。
【解答】?
棧的特點是先進後出,而隊列的特點是先進先出。我們用兩個棧正好能把順序反過來實現類似隊列的操作。
具體實現上,是把一個棧作為壓入棧,在壓入數據時只往這個棧中壓入,記為stackPush;另一個棧只作為彈出棧,在彈出數據時只從這個棧中彈出,記為stackPop。
因為數據壓入棧的時候,順序是先進先出的。那麽只要把stackPush的數據再次壓入stackPop中,順序就變回來了。
將1-5依次壓入stackPush,那麽從stackPush的棧頂到棧底為5~1,此時依次再將5~1倒入stackPop,那麽從stackPop的棧頂到棧底就變成了1~5.再從stackPop中彈出,順序就和隊列一樣了。?
BUT,要做到以下兩點:
(1)如果stackPush要往stackPop中壓入數據,那麽必須一次性把stackPush中的數據全部壓入。
(2)如果stackPop不為空,stackPush絕對不能向stackPop中壓入數據。
違反以上兩點都會發生錯誤。
【代碼】
TwoStackQueue.java:
1 package cn.hl.p2; 2 3 import java.util.Stack; 4 /** 5 * 題目:由兩個棧組成的隊列 6 * 要求:用兩個棧實現隊列,支持隊列的基本操作(add、poll、peek)7 * @author 猩生柯北 8 * 9 */ 10 public class TwoStackQueue { 11 public Stack<Integer> stackPush; 12 public Stack<Integer> stackPop; 13 14 public TwoStackQueue(){ 15 stackPush = new Stack<Integer>(); 16 stackPop = new Stack<Integer>(); 17 }18 19 public void add(int pushInt){ 20 stackPush.push(pushInt); 21 } 22 23 public int poll(){ 24 if(stackPop.empty() && stackPush.empty()){ 25 throw new RuntimeException("Queue is empty!"); 26 }else if(stackPop.empty()){ 27 while(!stackPush.empty()){ 28 stackPop.push(stackPush.pop()); 29 } 30 } 31 return stackPop.pop(); 32 } 33 34 public int peek(){ 35 if(stackPop.empty() && stackPush.empty()){ 36 throw new RuntimeException("Queue is empty!"); 37 }else if(stackPop.empty()){ 38 while(!stackPush.empty()){ 39 stackPop.push(stackPush.pop()); 40 } 41 } 42 return stackPop.peek(); 43 } 44 }
Test.java:
1 package cn.hl.p2; 2 3 public class Test { 4 public static void main(String[] args) { 5 TwoStackQueue tsq = new TwoStackQueue(); 6 tsq.add(3); 7 tsq.add(8); 8 tsq.add(-5); 9 tsq.add(0); 10 tsq.add(8); 11 System.out.print("輸出隊列的head元素:"); 12 System.out.println(tsq.peek()); 13 System.out.println("==========="); 14 System.out.println(tsq.poll()); 15 } 16 17 }
【運行結果】
由兩個棧組成隊列