1. 程式人生 > >由兩個棧組成隊列

由兩個棧組成隊列

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 }

【運行結果】

技術分享圖片

由兩個棧組成隊列