用两个栈实现队列
要求:编写一个类,用两个栈实现队列,支持队列的基本操作(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
日行一善, 日写一撰