题:
编写一个类,用两个栈实现队列,支持队列的基本操作(add、poll、peek)。
解析:
我们知道栈是先进后出的,而队列是先进先出。所以我们用两个栈正好能把顺序反过来实现类似队列的操作。
具体实现时是一个栈作为压入栈,在压入数据时只往这个栈中压入,记为stackPush;另一个栈只作为弹出栈,在弹出数据时只从这个栈弹出,记为stackPop。
因为数据压入栈的时候,顺序是先进后出的。那么只要把stackPush的数据再压入stackPop中,顺序就变回来了。
听起来虽然简单,实际上必须做到以下两点。
- 如果stackPush要往stackPop中压入数据,那么必须一次性把stackPush中的数据全部压入。
- 如果stackPop不为空,stackPush绝对不能向stackPop中压入数据。违反了以上两点都会发生错误。
具体代码如何实现呢?
public class TwoStacksQueue {
public Stack<Integer>stackPush;
public Stack<Integer>stackPop;
public TwoStacksQueue(){
stackPush=new Stack<>();
stackPop=new Stack<>();
}
//push 栈pop栈倒入数据
private void pushToPop(){
//如果负责出队的栈为空才可以将stackPush倒入
if (stackPop.isEmpty()){
while (!stackPush.isEmpty()){
stackPop.push(stackPush.pop());
}
}
}
public void add(int pushInt){
stackPush.push(pushInt);
}
public int poll(){
if (stackPop.isEmpty()&&stackPush.isEmpty()){
throw new RuntimeException("Queue is empty!");
}
pushToPop();
return stackPop.pop();
}
public int peek(){
if (stackPop.isEmpty()&&stackPush.isEmpty()){
throw new RuntimeException("Queue is empty!");
}
pushToPop();
return stackPop.peek();
}
public static void main(String[] args) {
TwoStacksQueue twoStacksQueue = new TwoStacksQueue();
twoStacksQueue.add(5);
twoStacksQueue.add(4);
twoStacksQueue.add(3);
System.out.println(twoStacksQueue.poll());
twoStacksQueue.add(7);
twoStacksQueue.add(8);
twoStacksQueue.add(2);
twoStacksQueue.add(1);
}
}
执行结果: