LeetCode232. 用栈实现队列图解(多图!!超详细的解法!!!!)

本文详细阐述如何使用两个栈(Stack)实现Java中的队列(Queue),包括push、pop、peek和empty操作的原理及代码实现。重点讲解了栈与队列的转换策略,以及在特殊情况下如何处理队列空的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目连接: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());
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值