当前位置: 首页 > news >正文

LeetCode 232. Implement Queue using Stacks 题解

LeetCode 232. Implement Queue using Stacks 题解

题目描述

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty):

实现MyQueue类:

  • void push(int x)将元素 x 推到队列的末尾
  • int pop()从队列的开头移除并返回元素
  • int peek()返回队列开头的元素
  • boolean empty()如果队列为空,返回true;否则,返回false

说明:

  • 只能使用标准的栈操作 —— 也就是只有push to top,peek/pop from top,size, 和is empty操作是合法的。
  • 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

示例 1:

输入: ["MyQueue","push","push","peek","pop","empty"] [[],[1],[2],[],[],[]] 输出: [null,null,null,1,1,false] 解释: MyQueue myQueue = new MyQueue(); myQueue.push(1); // queue is: [1] myQueue.push(2); // queue is: [1, 2] myQueue.peek(); // return 1 myQueue.pop(); // return 1, queue is [2] myQueue.empty(); // return false

解题思路

方法:双栈

思路

  • 使用两个栈,一个输入栈用于存储新元素,一个输出栈用于存储待出队的元素
  • 当需要出队或查看队首元素时,如果输出栈为空,将输入栈的所有元素转移到输出栈
  • 这样,输出栈的栈顶元素就是队首元素

复杂度分析

  • 时间复杂度:
    • push操作:O(1),直接压入输入栈
    • poppeek操作:均摊 O(1),每个元素最多被转移一次
    • empty操作:O(1),检查两个栈是否都为空
  • 空间复杂度:O(n),需要使用两个栈来存储元素

代码实现

方法:双栈

class MyQueue: def __init__(self): # 初始化输入栈和输出栈 self.input_stack = [] self.output_stack = [] def push(self, x: int) -> None: # 将元素压入输入栈 self.input_stack.append(x) def pop(self) -> int: # 如果输出栈为空,将输入栈的所有元素转移到输出栈 if not self.output_stack: while self.input_stack: self.output_stack.append(self.input_stack.pop()) # 弹出输出栈的栈顶元素 return self.output_stack.pop() def peek(self) -> int: # 如果输出栈为空,将输入栈的所有元素转移到输出栈 if not self.output_stack: while self.input_stack: self.output_stack.append(self.input_stack.pop()) # 返回输出栈的栈顶元素 return self.output_stack[-1] def empty(self) -> bool: # 检查两个栈是否都为空 return not self.input_stack and not self.output_stack

测试用例

测试用例 1:

输入:

["MyQueue","push","push","peek","pop","empty"] [[],[1],[2],[],[],[]]

输出:

[null,null,null,1,1,false]

总结

本题是栈和队列的经典应用问题,主要考察对栈和队列数据结构的理解和使用。通过使用两个栈,我们可以高效地实现队列的所有操作。

双栈的核心思想是:使用两个栈,一个输入栈用于存储新元素,一个输出栈用于存储待出队的元素,当需要出队或查看队首元素时,如果输出栈为空,将输入栈的所有元素转移到输出栈。

这种方法不仅适用于用栈实现队列问题,还可以应用于许多其他需要栈和队列转换的问题。掌握双栈的使用,对于解决这类问题非常重要。

http://www.cnnetsun.cn/news/1931727.html

相关文章:

  • 三菱FX3U与多台力士乐VFC-x610变频器通讯实现案例详解:频率设定、启停及读取功能附程序...
  • 最小二乘法的5种变体:从加权到自适应,选对方法让模型精度翻倍
  • 科研党必备:scihub-cn命令行工具5分钟搞定文献批量下载(附常见报错解决方案)
  • 三大权威MEG公开数据集深度解析与应用指南
  • 从卫星原始数据到地表真实信息:一份给Python+GDAL用户的辐射校正全流程脚本指南
  • 缓存命中率暴跌?生成式AI应用缓存策略全解析,从Token级语义缓存到动态TTL自适应调优
  • 开关电源功率因数与效率测试实战指南
  • 爆肝整理,智能体发展万字综述!!!
  • c++学习笔记——堆
  • 没做这4类边界测试就部署AI服务?:金融/医疗/客服场景下 hallucination 爆发的3小时应急响应流程
  • AI服务注册延迟超800ms?2024年最严苛生产环境实测:3种服务发现方案TPS对比(含Latency P999数据)
  • 机器学习之预测概率问题
  • 朱雀AI检测率高怎么降?嘎嘎降AI使用教程:3步降到5%以下
  • Harness Engineering 入门指南:从提示词到AI系统设计的完整跃迁
  • Java开发者面对大模型,到底在焦虑什么?
  • 毕业论文降AI免费检测全攻略:SpeedAI科研小助手实测指南
  • PyTorch实战:5种模型剪枝方法对比与避坑指南(附代码)
  • PX4+Gazebo+MAVROS仿真环境搭建保姆级教程:从环境变量到模型文件,一次搞定所有坑
  • Anthropic Mythos 模型:CTF 测试创新高,“最后一步”凸显网络攻击潜力
  • EXCEL跨工作簿高效搜索:一键定位多表数据并提取目标单元格
  • 电力系统优化调度:MATLAB代码实现机组组合问题的混合整数线性模型
  • SQL嵌套查询如何避免全表扫描_合理使用索引辅助子查询
  • 如何实现容器滚动到底部后无缝切换至页面滚动
  • STM32 Bootloader内存规划避坑指南:H7双Bank Flash与分散加载文件(.sct)详解
  • 避坑指南:在Vue2 + docx-preview中实现文本高亮搜索,你可能遇到的3个DOM陷阱与解决方案
  • hermes安装篇
  • 360°全景拼接相机开发避坑指南:海思3403平台4目方案常见问题解析
  • 5个关键步骤掌握Postman便携版:零安装API测试神器
  • ngx_signal_handler
  • Java 8升级Java 17实战:用AWS Transform Custom自动化迁移Spring Boot项目完整教程