题目
使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部。 pop() -- 从队列首部移除元素。 peek() -- 返回队列首部的元素。 empty() -- 返回队列是否为空。
思路
要想让栈操作实现队列的效果,只靠一个栈肯定不行,毕竟栈是“后入先出”的原则,我们可以用两个开口相反的栈来达到队列的效果。一个输入栈,一个输出栈,如下图: 这样输入栈输出的元素,可以变成输出栈输入的元素,再输出就可以达到队列的效果。但前提是,必须要让输入栈为空才可以。
class MyQueue {
Stack<Integer> stackIn;
Stack<Integer> stackOut;
public MyQueue() {
stackIn = new Stack<>();
stackOut = new Stack<>();
}
public void push(int x) {
stackIn.push(x);
}
public int pop() {
dumpstackIn();
return stackOut.pop();
}
public int peek() {
dumpstackIn();
return stackOut.peek();
}
public boolean empty() {
return stackOut.isEmpty() && stackIn.isEmpty();
}
//如果stackOut为空,将stackIn中的元素全部放到stackOut中
private void dumpstackIn(){
if(!stackOut.isEmpty()) return;
while(!stackIn.isEmpty()){
stackOut.push(stackIn.pop());
}
}
}