题目:
编写 一个类,用两个栈实现队列,支持队列的基本操作(add, pol,peek)。
解答:
栈的特点是先进后出,而队列的特点是先进先出。
我们用两个栈正好能把顺序反过来实现类似队列的操作。
具体的做法是一个栈作为压入栈,在压入数据的时候只往这个栈压入,记为 stackPush;
另一个栈只作为弹出栈,在弹出数据时候只从这个栈弹出,记为stackPop。
因为数据压入栈的时候, 顺序是先进后出的。那么只要把stackPush的数据再压入到stackPop中,
顺序就变回来了。
例如:将1~5压入到stackPush,那么从stackPush的栈顶到栈底的数字为5~1,此时依次将5~1倒入到stackPop中,那么从stackPop的栈顶到栈底变成了1~5。再从stackPop弹出时候顺序就和队列一样了。
注意两点:
1.如果stackPush要往stackPop中压入数据,那么必须一次性把stackPush中的数据全部压入。
2.如果stackPop不为空,stackPush决不能向stackPop中压入数据。
public class TwoStackQueue {
public Stack<Integer> stackPush;
public Stack<Integer> stackPop;
public TwoStackQueue(){
stackPush = new Stack<Integer>();
stackPop = new Stack<Integer>();
}
public void add(int pushInt){
stackPush.push(pushInt);
}
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();
}
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();
}
}
参考资料:《程序员代码面试指南》左程云 著