【简单】力扣算法题解析LeetCode225:用队列实现栈

关注文末推广名片,即可免费获得本题测试源码

题目来源:LeetCode225:用队列实现栈

问题抽象: 仅使用标准队列操作(先进先出)实现一个栈数据结构(后进先出),需支持栈的全部核心操作,满足以下需求:

  1. 栈功能定义

    • push(x):将元素 x 压入栈顶;
    • pop():移除并返回栈顶元素;
    • top():返回栈顶元素(不移除);
    • empty():检查栈是否为空。
  2. 底层约束

    • 仅用队列作为底层容器:可使用多个队列,但操作必须基于队列的标准接口(入队出队查看队首判空);
    • 禁止直接使用栈库(如 Stack 类)。
  3. 操作要求

    • 所有操作需 正确模拟栈行为(后进先出);
    • 时间复杂度要求:
      • push(x) 可为 O(n)(需调整元素顺序);
      • pop()top() 应为 O(1)(理想情况);
    • 空间复杂度 O(n)(存储所有元素)。
  4. 边界处理

    • 空栈调用 pop()top() 时按未定义行为处理(通常抛异常);
    • 初始栈为空(empty() 返回 true)。

输入:通过方法调用序列操作栈(如 push(1), pop(), top()
输出pop()top() 返回栈顶元素;empty() 返回布尔值。


解题思路

使用两个队列 q1q2 实现栈:

  1. 核心思想:在每次 push 操作时,确保新元素始终位于队列前端(即栈顶位置)。
  2. push 操作
    • 将新元素加入辅助队列 q2
    • 将主队列 q1 中的所有元素依次出队并入队到 q2(此时 q2 的前端是新元素,后端是旧元素)。
    • 交换 q1q2 的引用(确保 q1 始终是主队列,q2 为空以便复用)。
  3. pop 操作:直接从 q1 出队(前端元素即为栈顶)。
  4. top 操作:返回 q1 的前端元素(不移除)。
  5. empty 操作:检查 q1 是否为空。

时间复杂度分析push:O(n),需要移动 n 个元素。pop/top/empty:O(1),直接访问队列前端。空间复杂度:O(n),使用两个队列存储元素。


代码实现(Java版)🔥点击下载源码

class MyStack {
    private Queue<Integer> q1; // 主队列,存储栈内元素
    private Queue<Integer> q2; // 辅助队列,用于调整元素顺序

    public MyStack() {
        q1 = new LinkedList<>();
        q2 = new LinkedList<>();
    }
    
    public void push(int x) {
        // 1. 新元素加入辅助队列
        q2.offer(x);
        // 2. 将主队列元素全部移入辅助队列
        while (!q1.isEmpty()) {
            q2.offer(q1.poll());
        }
        // 3. 交换主辅队列引用
        Queue<Integer> temp = q1;
        q1 = q2;
        q2 = temp;
    }
    
    public int pop() {
        // 直接弹出主队列前端元素(栈顶)
        return q1.poll();
    }
    
    public int top() {
        // 返回主队列前端元素(不移除)
        return q1.peek();
    }
    
    public boolean empty() {
        // 检查主队列是否为空
        return q1.isEmpty();
    }
}

代码说明

  1. 队列初始化
    • q1 作为主队列,存储栈内元素。
    • q2 作为辅助队列,仅在 push 操作时暂存数据。
  2. push 方法
    • 新元素加入 q2
    • q1 中所有元素依次移入 q2(确保新元素位于队列前端)。
    • 交换 q1q2 引用,使 q1 始终指向主队列。
  3. pop 方法:直接弹出 q1 前端元素(即栈顶)。
  4. top 方法:返回 q1 前端元素(不删除)。
  5. empty 方法:检查 q1 是否为空。

提交详情(执行用时、内存消耗)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

达文汐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值