力扣(用队列实现栈)

解析 LeetCode 225. 用队列实现栈:单队列的巧妙运用

一、题目分析

在这里插入图片描述

(一)功能需求

实现 MyStack 类,支持栈的四种操作:

  • push(int x):将元素压入栈顶。
  • pop():移除并返回栈顶元素。
  • top():返回栈顶元素。
  • empty():判断栈是否为空。
    需用队列(本题代码用单队列 )模拟栈的 LIFO 特性。

(二)核心挑战

队列是先进先出(FIFO )结构,而栈是后入先出(LIFO )结构,如何通过队列操作模拟栈的“栈顶操作”是关键。

二、算法思想:单队列的反转操作

(一)核心思路

利用单队列,在每次 push 操作时,通过“将新元素入队后,把队列中之前的所有元素依次出队再入队”,让新元素移动到队列头部,从而模拟栈的“栈顶”位置。这样,队列的头部始终对应栈的栈顶,后续 poptop 操作可直接操作队列头部。

(二)操作逻辑

  • push 操作
    1. 新元素入队。
    2. 将队列中除新元素外的所有元素依次出队并重新入队。这样,新元素会被“移到”队列头部,成为栈顶。
  • pop 操作:直接弹出队列头部元素(对应栈顶 )。
  • top 操作:返回队列头部元素(对应栈顶 )。
  • empty 操作:判断队列是否为空。

三、代码实现与详细解析

class MyStack {// 用于模拟栈的队列,选择 LinkedList 实现队列(支持高效的入队、出队)Queue<Integer> queue; public MyStack() {// 初始化队列queue = new LinkedList<>(); }public void push(int x) {// 新元素入队queue.offer(x); int size = 0;// 遍历队列中除新元素外的所有元素(新元素是最后入队的,所以循环 size < 队列长度 - 1 次)while (size < queue.size() - 1) { // 队首元素出队,重新入队到队尾queue.offer(queue.poll()); size++;}}public int pop() {// 队列头部是栈顶,直接弹出return queue.poll(); }public int top() {// 队列头部是栈顶,直接返回return queue.peek(); }public boolean empty() {// 判断队列是否为空return queue.isEmpty(); }
}

(一)代码流程拆解

  1. 初始化queueLinkedList 实现(因 LinkedListQueue 接口的常用实现,支持高效的 offerpollpeek 操作 )。
  2. push 操作
    • 新元素 x 入队(queue.offer(x) )。
    • 循环 size < queue.size() - 1 次(size 初始为 0 ):每次将队首元素出队(queue.poll() )并重新入队(queue.offer(...) )。此操作让新元素前的所有元素“绕到”队列尾部,新元素成为队首,模拟栈顶。
  3. pop 操作:调用 queue.poll() 弹出队首元素(即栈顶 )。
  4. top 操作:调用 queue.peek() 返回队首元素(即栈顶 )。
  5. empty 操作:调用 queue.isEmpty() 判断队列是否为空,即栈是否为空。

(二)关键逻辑解析

  • push 操作的反转技巧:通过将新元素入队后,把之前的元素循环“出队再入队”,让新元素移动到队首。例如,队列原是 [a, b, c],入队 d 后变为 [a, b, c, d],循环 3 次(size < 4 - 1 ):
    • 第一次:a 出队入队 → [b, c, d, a]
    • 第二次:b 出队入队 → [c, d, a, b]
    • 第三次:c 出队入队 → [d, a, b, c]
      最终新元素 d 成为队首,对应栈顶。
  • 单队列的优势:相比双队列实现(一个队列存元素,一个队列辅助 ),单队列通过反转操作,减少了队列数量,代码更简洁,利用队列自身操作完成模拟。
  • 时间复杂度分析push 操作的时间复杂度为 O(n)n 是当前队列长度,需循环 n - 1 次 );poptopempty 操作的时间复杂度为 O(1)

四、复杂度分析

(一)时间复杂度

  • pushO(n)O(n)O(n)n 是当前栈中元素个数(需移动 n - 1 个元素 )。
  • popO(1)O(1)O(1) ,直接弹出队首。
  • topO(1)O(1)O(1) ,直接访问队首。
  • emptyO(1)O(1)O(1) ,直接判断队列是否为空。

(二)空间复杂度

所有操作仅使用一个队列,空间复杂度为 O(n)O(n)O(n)n 是栈中元素最大数量 )。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/94580.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/94580.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器Docker 安装和常用命令总结

Docker 安装和常用命令总结Docker 是一种开源平台&#xff0c;用于自动化应用程序的部署、扩展和管理。通过将应用程序及其依赖打包到一个轻量级、可移植的容器中&#xff0c;Docker 能够在任何地方统一运行&#xff0c;解决了不同环境间的兼容性问题。本篇文章将介绍 Docker 的…

2025年广东省无线电管理普法宣传活动

一、无线电发射设备型号核准相关制度及要求1.型号核准设备类型&#xff1a;一、公众网移动通信设备二、专用通信设备三、无线接入设备四、广播发射设备五、雷达设备六、导航设备七、卫星通信设备(含终端地球站)无线电发射设备八、公众网移动通信模块九、无线接入模块十、其他设…

使用 Whisper 将南蒂罗尔方言语音转录为标准德语文本的研究

使用 Whisper 将南蒂罗尔方言语音转录为标准德语文本的研究 原文:Speech transcription from South Tyrolean Dialect to Standard German with Whisper 本研究展示了首个经过微调的Whisper模型,用于将南蒂罗尔方言语音自动翻译为标准德语文本。为了满足字幕和翻译方面尚未被…

Nexus管理maven仓库和jar包的配置和使用

登录nexus以后点击Settings-Repository-Repositories-Create repository 选择maven2(hosted)创建两个仓库一个是Release叫做monitor-releases&#xff1a;一个是Snapshot叫做monitor-snapshots&#xff1a;在创建一个maven2(group)叫做monitor将maven-central&#xff08;用于存…

疯狂星期四文案网第50天运营日记

网站运营第50天&#xff0c;点击观站&#xff1a; 疯狂星期四 crazy-thursday.com 全网最全的疯狂星期四文案网站 运营报告 今日访问量 今天流量减了一些&#xff0c;我发现我的疯狂星期四的词没有排名第一了&#xff0c;感觉应该是抽象文案这个导致的&#xff0c;因为我发了…

计算机视觉学习路线:从入门到进阶的完整指南

计算机视觉学习路线&#xff1a;从入门到进阶的完整指南 计算机视觉&#xff08;Computer Vision, CV&#xff09;是人工智能领域最热门和最具前景的方向之一&#xff0c;它赋予机器“看”和“理解”图像与视频的能力。无论你是学生、工程师还是对AI感兴趣的爱好者&#xff0c…

移动应用抓包与调试实战 Charles工具在iOS和Android中的应用

随着移动互联网的发展&#xff0c;几乎所有应用都依赖API接口进行数据交互。无论是登录注册、支付功能&#xff0c;还是新闻资讯加载&#xff0c;背后都需要与服务器频繁通信。如何快速定位问题、验证数据传输、模拟弱网环境&#xff0c;成为移动端开发者日常工作中的关键任务。…

【Python NTLK自然语言处理库】

安装流程 import nltk nltk.download()运行后出现一个界面&#xff0c;然后按DownloadTokenize ###分词 from nltk.tokenize import word_tokenize text "The vendor paid $20,000,000." tokens word_tokenize(text) print(tokens)输出 [The, vendor, paid, $, 20,…

GitHub 热榜项目 - 日榜(2025-08-25)

GitHub 热榜项目 - 日榜(2025-08-25) 生成于&#xff1a;2025-08-25 统计摘要 共发现热门项目&#xff1a;20 个 榜单类型&#xff1a;日榜 本期热点趋势总结 本期GitHub热榜呈现三大技术趋势&#xff1a;1&#xff09;AI代理开发成主流&#xff0c;如moeru-ai/airi的虚拟伴…

Mac相册重复照片终结指南:技术流清理方案

你的Mac相册是否变成了"重复照片博物馆"&#xff1f;同一场景的多个版本、连续拍摄的相似图片、不同设备导入的重复文件...这些数字冗余正在悄无声息地吞噬着宝贵的存储空间。本文将为你提供一套完整的技术解决方案。重复照片问题的技术分析重复类型分类从技术角度&a…

日语学习-日语知识点小记-构建基础-JLPT-N3阶段(19):文法复习+单词第7回1

日语学习-日语知识点小记-构建基础-JLPT-N3阶段&#xff08;19&#xff09;&#xff1a;文法单词第7回&#xff11; 1、前言&#xff08;1&#xff09;情况说明&#xff08;2&#xff09;工程师的信仰2、知识点&#xff11;ー 復習3、单词&#xff08;1&#xff09;日语单词  …

完美世界招数据仓库工程师咯

数据仓库工程师-偏BI方向 &#xff08;岗位信息经过jobleap.cn授权&#xff0c;可在CSDN发布&#xff09;完美世界 北京 职位描述 负责数据仓库架构设计、建模和ETL开发&#xff0c;构建可扩展的数据仓库和分析解决方案&#xff1b; 负责对数据仓库的性能和效率优化&#xff1…

RabbitMQ面试精讲 Day 26:RabbitMQ监控体系建设

【RabbitMQ面试精讲 Day 26】RabbitMQ监控体系建设 在“RabbitMQ面试精讲”系列的第26天&#xff0c;我们将聚焦于RabbitMQ监控体系建设这一关键运维主题。作为消息中间件的核心组件&#xff0c;RabbitMQ一旦出现消息积压、节点宕机或资源耗尽等问题&#xff0c;将直接影响系统…

把word按章节分为n份 一个文档拆分为多份格式不变

如果你有一个word文档&#xff0c;里面有很多章节&#xff0c;你想按照章节把它分为N份&#xff0c;每一份存放在一个独立的文档中&#xff0c;而且拆分之后的文档格式和图片都保持不变。那么你可以试一下这个工具。 #word拆分 #word按章节拆分 #word分为n份 #docx拆分章节 把w…

项目历程—缓存系统v1

实现目标1&#xff1a;输入key&#xff0c;value可以存储新建一个文件&#xff0c;并存储一个值 (√) 实现目标2&#xff1a;封装方法&#xff0c;循环创建1000个文件&#xff0c;分别存储一个值 (√) 实现目标3&#xff1a;通过输入一个key可以检测到文件里面的内容值 (√) 两…

最新刀客IP地址信息查询系统源码_含API接口_首发

目录 一、详细介绍 二、效果展示 1.部分代码 2.效果图展示 三、学习资料下载 一、详细介绍 最新刀客IP地址信息查询系统源码_含API接口_首发_自适应手机端 今天看到的这个接口&#xff0c;所以做了页面供大家方便使用 查询的IP信息包含&#xff1a; ASN编号 所属国家…

电商商品管理效率低?MuseDAM 系统如何破解库存混乱难题

核心要点 问题&#xff1a;电商企业在商品管理中面临商品信息分散、素材查找困难、上架周期长、多渠道同步难等核心痛点。 答案&#xff1a;DAM数字资产管理系统通过建立统一的商品素材库&#xff0c;实现智能分类标签、自动化工作流程、多渠道同步发布&#xff0c;帮助电商企…

C#/.NET/.NET Core技术前沿周刊 | 第 51 期(2025年8.18-8.24)

前言 C#/.NET/.NET Core技术前沿周刊&#xff0c;你的每周技术指南针&#xff01;记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿&#xff0c;助力技术成长与视野拓宽。 欢迎投稿、推荐…

[MH22D3开发笔记]2. SPI,QSPI速度究竟能跑多快,双屏系统的理想选择

MH22D3xx系列&#xff0c;是兆讯公司推出的第二代芯片&#xff0c;主频和第一代MH2103一样&#xff0c;保持216Mhz的高主频&#xff0c;RAM 64KB&#xff0c;FLASH可以到512KB。依然和stm32F103保持pin to pin的高度兼容&#xff0c;但是在局部功能和接口上已经是青出于蓝而胜于…