要求:編寫一個類,用兩個棧實現佇列,支援佇列的基本操作(add、poll、peek)。
add 增加一個元索 如果佇列已滿,則丟擲一個IIIegaISlabEepeplian異常
remove 移除並返回佇列頭部的元素 如果佇列為空,則丟擲一個NoSuchElementException異常
element 返回佇列頭部的元素 如果佇列為空,則丟擲一個NoSuchElementException異常
offer 新增一個元素並返回true 如果佇列已滿,則返回false
poll 移除並返問佇列頭部的元素 如果佇列為空,則返回null
peek 返回佇列頭部的元素 如果佇列為空,則返回null
put 新增一個元素 如果佇列滿,則阻塞
take 移除並返回佇列頭部的元素 如果佇列為空,則阻塞
思路:棧的特點:先進先出; 佇列的特點:先進後出;用兩個棧正好順序反過來,可以實現佇列的操作;
方法: 一個壓入棧:只完成push操作,stackPush
一個彈出棧:只完成pop操作,stackPop
【重要】要完成如上操作,必須滿足:
stackPush 執行pop 操作至stackPop時,stackPush必須全部倒出 & stackPop必須為null
public class Problem02_TwoStacksImplementQueue { public static class TwoStacksQueue { public Stack<Integer> stackPush; public Stack<Integer> stackPop; public TwoStacksQueue() { stackPush = new Stack<Integer>(); stackPop = new Stack<Integer>(); } /* * add操作: stackPush中執行push操作 */ public void add(int pushInt) { stackPush.push(pushInt); } /* * poll操作: 移除並返問佇列頭部的元素【注意佇列為空的情況】 * 1.stackPush stackPop均為空時,佇列為空佇列,print 異常; * 2. 執行poll操作,即stackPush不為空時,將stackPush.pop的元素push進stackPop中【前提條件stackPop為空】 * * 執行完“倒”的操作後,返回stackPop.pop() */ public int poll() { if (stackPop.empty() && stackPush.empty()) { throw new RuntimeException("Queue is empty!"); } else if (stackPop.empty()) { while (!stackPush.empty()) { stackPop.push(stackPush.pop()); } } return stackPop.pop(); } /* * peek操作: 返回佇列頭部的元素 如果佇列為空,則返回null【注意佇列為空的情況】 * 1.stackPush stackPop均為空時,佇列為空佇列,print 異常; * 2. 執行peek操作,即stackPush不為空時,將stackPush.pop的元素push進stackPop中【前提條件stackPop為空】 * 執行完“倒”的操作後,返回stackPop.peek() */ public int peek() { if (stackPop.empty() && stackPush.empty()) { throw new RuntimeException("Queue is empty!"); } else if (stackPop.empty()) { while (!stackPush.empty()) { stackPop.push(stackPush.pop()); } } return stackPop.peek(); } } public static void main(String[] args) { TwoStacksQueue test = new TwoStacksQueue(); test.add(1); test.add(2); test.add(3); System.out.println(test.peek()); System.out.println(test.poll()); System.out.println(test.peek()); System.out.println(test.poll()); System.out.println(test.peek()); System.out.println(test.poll()); } }
執行結果:
1 1 2 2 3 3