题目连接: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());
}
}
}
本文详细阐述如何使用两个栈(Stack)实现Java中的队列(Queue),包括push、pop、peek和empty操作的原理及代码实现。重点讲解了栈与队列的转换策略,以及在特殊情况下如何处理队列空的情况。
1146

被折叠的 条评论
为什么被折叠?



