232. 用栈实现队列-day09https://chuna2.787528.xyz/whq2001
题目:232. 用栈实现队列
题目链接:https://leetcode.cn/problems/implement-queue-using-stacks/description/
思路:定义两个栈,一个作为出栈,一个作为入栈。
代码:
点击查看代码
class MyQueue {
Deque<Integer> inStack;
Deque<Integer> outStack;
public MyQueue() {
inStack=new ArrayDeque<Integer>();
outStack=new ArrayDeque<Integer>();
}
public void push(int x) {
inStack.push(x);
}
public int pop() {
if(outStack.isEmpty()){
in2out();
}
return outStack.pop();
}
public int peek() {
if (outStack.isEmpty()) {
in2out();
}
return outStack.peek();
}
public boolean empty() {
return inStack.isEmpty() && outStack.isEmpty();
}
private void in2out() {
while (!inStack.isEmpty()) {
outStack.push(inStack.pop());
}
}
}
题目:225. 用队列实现栈
题目链接:https://leetcode.cn/problems/implement-stack-using-queues/description/
思路:队列(Queue):先进先出,只能从「队尾添加」、「队头删除」;
栈(Stack):先进后出,只能从「栈顶添加 / 删除」;
核心思路:每次新增元素时,利用辅助队列 queue2 「反转元素顺序」,让新添加的元素始终在 queue1 的队头(对应栈顶),从而实现栈的「先进后出」
代码:
点击查看代码
class MyStack {
Queue<Integer> queue1;
Queue<Integer> queue2;
public MyStack() {
queue1 = new LinkedList<Integer>();
queue2 = new LinkedList<Integer>();
}
public void push(int x) {
// 步骤1:先把新元素x添加到辅助队列queue2的队尾
queue2.offer(x);
// 步骤2:把主队列queue1的所有元素「转移」到queue2的队尾
while (!queue1.isEmpty()) {
queue2.offer(queue1.poll());
}
// 步骤3:交换queue1和queue2的引用,让queue2变回空队列,queue1存储反转后的元素
Queue<Integer> temp = queue1;
queue1 = queue2;
queue2 = temp;
}
public int pop() {
return queue1.poll();
}
public int top() {
return queue1.peek();
}
public boolean empty() {
// 栈为空的条件:主队列queue1为空(辅助队列queue2始终为空,无需判断)
return queue1.isEmpty();
}
}
/**
* Your MyStack object will be instantiated and called as such:
* MyStack obj = new MyStack();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.top();
* boolean param_4 = obj.empty();
*/

浙公网安备 33010602011771号