题目连接:232. 用栈实现队列
题意
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列的支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:
void push(int x) 将元素 x 推到队列的末尾
int pop() 从队列的开头移除并返回元素
int peek() 返回队列开头的元素
boolean empty() 如果队列为空,返回 true ;否则,返回 false
class MyQueue {
/** Initialize your data structure here. */
public MyQueue() {
}
/** Push element x to the back of queue. */
public void push(int x) {
}
/** Removes the element from in front of queue and returns that element. */
public int pop() {
}
/** Get the front element. */
public int peek() {
}
/** Returns whether the queue is empty. */
public boolean empty() {
}
}
题解
使用两个栈实现一个队列,队列是先进先出,也就是尾进头出(见下图),而栈是先进后出,也就是尾进尾出,用一个栈已经可以满足进队的需求,而出队的元素却在栈底,无法直接出队,此时若想出队则势必需要对栈的元素进行反转,也就是从一个栈出元素装入另一个栈,此时就能完成反转操作,出队也就得以做到。
入队
出队
此时可以对元素进行出队
显然此时进队只需进入栈A,出队只需从栈B。
特殊情况
如果当出队队列为空时,此时仍要出队,则需要同上将左队列元素依次弹出,装入右队列,再进入出队。
具体实现
public class _232_用栈实现队列 {
//建立两个栈用于进队出队
private Stack<Integer> inStack,outStatk;
/** Initialize your data structure here. */
public _232_用栈实现队列() {
inStack=new Stack<>();
outStatk=new Stack<>();
}
/** Push element x to the back of queue. */
public void push(int x) {
inStack.push(x);
}
/** Removes the element from in front of queue and returns that element. */
public int pop() {
//先观察出队栈是否为空
checkOutStack();
//出队
return outStatk.pop();
}
/** Get the front element. */
public int peek() {
//先观察出队栈是否为空
checkOutStack();
//出队
return outStatk.peek();
}
/** Returns whether the queue is empty. */
public boolean empty() {
return inStack.isEmpty()&&outStatk.isEmpty();
}
private void checkOutStack(){
if(outStatk.isEmpty()){
//将进队栈全部反转转入出队栈
while(!inStack.isEmpty())
outStatk.push(inStack.pop());
}
}
}