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

【LeetCode刷题日记】225.用队列实现栈--三招实现栈操作(多种思维)

个人主页北极的代码欢迎来访作者简介java后端学习者❄️个人专栏苍穹外卖日记SSM框架深入JavaWeb✨命运的结局尽可永在不屈的挑战却不可须臾或缺摘要本文探讨了用队列实现栈操作的三种方法。重点分析了双队列实现方案通过que2作为辅助队列在push操作时将que1元素转移到que2后交换队列确保新元素始终位于队首栈顶实现先进后出特性。该方法push操作需O(n)时间pop/top操作仅需O(1)时间。文章还对比了单向队列与双端队列的实现差异指出双端队列可通过旋转操作更高效地实现栈功能。最后给出了Java实现的三种代码示例包括双队列、单队列和双端队列方案并比较了不同队列接口的操作特点及异常处理机制。题目背景用队列实现栈可直达使用队列实现栈的下列操作push(x) -- 元素 x 入栈pop() -- 移除栈顶元素top() -- 获取栈顶元素empty() -- 返回栈是否为空注意:你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。你所使用的语言也许不支持队列。 你可以使用 list 或者 deque双端队列来模拟一个队列 , 只要是标准的队列操作即可。你可以假设所有操作都是有效的例如, 对一个空的栈不会调用 pop 或者 top 操作。题目解析单向队列实现有的同学可能疑惑这种题目有什么实际工程意义其实很多算法题目主要是对知识点的考察和教学意义远大于其工程实践的意义所以面试题也是这样刚刚做过栈与队列我用栈来实现队列怎么样 (opens new window)的同学可能依然想着用一个输入队列一个输出队列就可以模拟栈的功能仔细想一下不行队列模拟栈其实一个队列就够了那么我们先说一说两个队列来实现栈的思路。队列是先进先出的规则把一个队列中的数据导入另一个队列中数据的顺序并没有变并没有变成先进后出的顺序。所以用栈实现队列 和用队列实现栈的思路还是不一样的这取决于这两个数据结构的性质。但是依然还是要用两个队列来模拟栈只不过没有输入和输出的关系而是另一个队列完全用来备份的如下面动画所示用两个队列que1和que2实现队列的功能que2其实完全就是一个备份的作用把que1最后面的元素以外的元素都备份到que2然后弹出最后面的元素再把其他元素从que2导回que1。如图所示我们利用了两个队列来实现栈的操作一个队列是与栈中保持相同元素的队列另一个是辅助队列。我们先把元素放到辅助队列的队尾中然后下面进行判断如果是第一个队列不是空的就把第一个队列的头部取出放到第二个队列的尾部这是个while循环不是仅仅处理一个元素可以说是把第一个队列的所有元素都放到第二个队列的尾部依次添加。之后进行交换把队列2的元素转移到队列1然后队列2 为空经过这种操作对于新添加的元素就自然而然地放在了队列1的队首了也就实现类栈的先进后出后进先出的逻辑了。流程解析假设当前queue1 [栈底 ... 栈顶] [a, b, c]队首 a队尾 c。queue2先放x进队尾 →queue2 [x]队首 x队尾 x。把queue1全部出队并入队到queue2出队 a入queue2→ [x, a]出队 b入queue2→ [x, a, b]出队 c入queue2→ [x, a, b, c]交换后queue1 [x, a, b, c]队首 x 是栈顶队尾 c 是栈底queue2变空。这样每次push后queue1的队首就是最新元素栈顶poll()就是栈的pop()。pop()queue1.poll()—— 队首出队即栈顶元素。top()queue1.peek()—— 查看队首元素但不删除。empty()queue1.isEmpty()—— 队列为空则栈为空。初始 queue1 []push(1): queue2[1], queue1 空 → 交换 → queue1[1], queue2[]push(2): queue2[2], 移 queue1 到 queue2 → queue2[2,1], 交换 → queue1[2,1]队首 2 是栈顶push(3): queue2[3], 移 queue1 → queue2[3,2,1], 交换 → queue1[3,2,1]pop(): 队首 3 出队 → queue1[2,1], 返回 3top(): peek → 2输出符合栈顺序。pushO(n)因为要把 queue1 中 n 个元素搬到 queue2。pop/topO(1)。emptyO(1)。✅ 优点只用标准队列操作offer/poll/peek逻辑清晰。❌ 缺点push消耗 O(n)不是最优实现可以用一个队列做到 O(1) push 和 O(n) pop。双端队列实现主要思想是就是把队尾的元素旋转到队尾que1.addLast(que1.peekFirst()); // 1. 把队首元素复制一份添加到队尾 que1.pollFirst(); // 2. 删除原来的队首元素具体执行过程队列 [1, 2, 3]操作队列状态说明初始[1, 2, 3]栈底→栈顶size3, size--2第1次循环[2, 3, 1]把 1 移到队尾第2次循环[3, 1, 2]把 2 移到队尾循环结束[3, 1, 2]队首 3 是栈顶pollFirst()[1, 2]返回 3 ✅pollFirst() 的特点方法作用队列空时pollFirst()删除并返回队首返回nullremoveFirst()删除并返回队首抛出异常peekFirst()只看不删返回nullgetFirst()只看不删抛出异常对比java QueueInteger queue1 new LinkedList(); QueueInteger queue2 new LinkedList();Queue接口只支持一端进、另一端出的单向操作从队尾添加offer()/add()从队首删除poll()/remove()查看队首peek()/element()没有直接操作队尾的方法如peekLast()或pollLast()java DequeInteger que1 new ArrayDeque();Deque接口支持双端操作Double-Ended Queue可以在队首/队尾两端进行添加、删除、查看方法如addFirst()、addLast()、pollFirst()、pollLast()、peekLast()等特性Queue单向队列Deque双端队列操作方向仅一端进、一端出两端都可进可出查看队尾❌ 不支持✅peekLast()从队尾删除❌ 不支持✅pollLast()从队首添加❌ 不支持✅addFirst()栈实现方式需要两个队列配合一个 Deque 就够了补充说明但是需要注意的是单向队列我们也可以仅仅通过一个队列来实现栈主要的逻辑就是通过循环把队列的队首依次拿出来放到队尾这样我们新添加的元素就到了队首也就是实现了栈。题目答案单向队列两个Queueclass MyStack { QueueInteger queue1; // 和栈中保持一样元素的队列 QueueInteger queue2; // 辅助队列 /** Initialize your data structure here. */ public MyStack() { queue1 new LinkedList(); queue2 new LinkedList(); } /** Push element x onto stack. */ public void push(int x) { queue2.offer(x); // 先放在辅助队列中 while (!queue1.isEmpty()){ queue2.offer(queue1.poll()); } QueueInteger queueTemp; queueTemp queue1; queue1 queue2; queue2 queueTemp; // 最后交换queue1和queue2将元素都放到queue1中 } /** Removes the element on top of the stack and returns that element. */ public int pop() { return queue1.poll(); // 因为queue1中的元素和栈中的保持一致所以这个和下面两个的操作只看queue1即可 } /** Get the top element. */ public int top() { return queue1.peek(); } /** Returns whether the stack is empty. */ public boolean empty() { return queue1.isEmpty(); } }双向队列一个Dequeclass MyStack { // Deque 接口继承了 Queue 接口 // 所以 Queue 中的 add、poll、peek等效于 Deque 中的 addLast、pollFirst、peekFirst DequeInteger que1; /** Initialize your data structure here. */ public MyStack() { que1 new ArrayDeque(); } /** Push element x onto stack. */ public void push(int x) { que1.addLast(x); } /** Removes the element on top of the stack and returns that element. */ public int pop() { int size que1.size(); size--; // 将 que1 导入 que2 但留下最后一个值 while (size-- 0) { que1.addLast(que1.peekFirst()); que1.pollFirst(); } int res que1.pollFirst(); return res; } /** Get the top element. */ public int top() { return que1.peekLast(); } /** Returns whether the stack is empty. */ public boolean empty() { return que1.isEmpty(); } }单向队列一个Queueclass MyStack { QueueInteger queue; public MyStack() { queue new LinkedList(); } //每 offer 一个数A进来都重新排列把这个数A放到队列的队首 public void push(int x) { queue.offer(x); int size queue.size(); //移动除了 A 的其它数 while (size-- 1) queue.offer(queue.poll()); } public int pop() { return queue.poll(); } public int top() { return queue.peek(); } public boolean empty() { return queue.isEmpty(); } }

相关文章:

【LeetCode刷题日记】225.用队列实现栈--三招实现栈操作(多种思维)

🔥个人主页:北极的代码(欢迎来访) 🎬作者简介:java后端学习者 ❄️个人专栏:苍穹外卖日记,SSM框架深入,JavaWeb ✨命运的结局尽可永在,不屈的挑战却不可须臾或…...

MobileAgent:基于多模态大模型的手机UI自动化操作实践

1. 项目概述:当你的手机学会“自己动手”最近在捣鼓一个挺有意思的开源项目,叫X-PLUG/MobileAgent。简单来说,它能让你的手机“长眼睛”和“会思考”,然后自己动手去完成你交代的任务。这听起来是不是有点像科幻电影里的场景&…...

从零开始开发Google Drive CLI Client自定义命令:完整实践指南

从零开始开发Google Drive CLI Client自定义命令:完整实践指南 【免费下载链接】gdrive Google Drive CLI Client 项目地址: https://gitcode.com/gh_mirrors/gd/gdrive Google Drive CLI Client(gd/gdrive)是一款功能强大的命令行工具…...

掌握Go策略模式:golang-design-pattern中的终极算法动态切换指南

掌握Go策略模式:golang-design-pattern中的终极算法动态切换指南 【免费下载链接】golang-design-pattern 设计模式 Golang实现-《研磨设计模式》读书笔记 项目地址: https://gitcode.com/gh_mirrors/go/golang-design-pattern 在软件开发中&…...

5分钟实现智慧树视频自动播放:学生党必备的刷课神器终极指南

5分钟实现智慧树视频自动播放:学生党必备的刷课神器终极指南 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台繁琐的视频学习而烦恼吗&…...

终极指南:Exposed连接参数调优从连接超时到查询超时的完整解决方案

终极指南:Exposed连接参数调优从连接超时到查询超时的完整解决方案 【免费下载链接】Exposed Kotlin SQL Framework 项目地址: https://gitcode.com/gh_mirrors/ex/Exposed Exposed作为一款强大的Kotlin SQL框架,其连接参数的优化直接影响应用性能…...

AI Agent开发核心技术解析:ReAct、CoT与Tool Use深度剖析

上一篇我们用Coze零代码搭了一个Agent。但如果你想真正理解AI Agent的工作原理,或者想用代码开发更强大的Agent,就必须掌握这三大核心技术:ReAct、Chain-of-Thought和Tool Use。今天,我们把黑盒打开。 一、为什么需要这些技术? 1.1 大模型的原生局限 大语言模型(LLM)很…...

3大智能突破:重新定义百度网盘下载体验

3大智能突破:重新定义百度网盘下载体验 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 你是否曾在深夜急需下载一份重要文件,却因百度网盘的限速而焦虑…...

Blender3mfFormat终极指南:在Blender中完美处理3D打印文件

Blender3mfFormat终极指南:在Blender中完美处理3D打印文件 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 还在为3D打印文件格式转换而烦恼吗?Ble…...

2024终极指南:如何选择开源疫情监测系统?10款顶尖工具深度对比

2024终极指南:如何选择开源疫情监测系统?10款顶尖工具深度对比 【免费下载链接】awesome-healthcare Curated list of awesome open source healthcare software, libraries, tools and resources. 项目地址: https://gitcode.com/GitHub_Trending/aw/…...

jless YAML文件支持的终极指南:自动检测与手动指定格式的完整教程

jless YAML文件支持的终极指南:自动检测与手动指定格式的完整教程 【免费下载链接】jless jless is a command-line JSON viewer designed for reading, exploring, and searching through JSON data. 项目地址: https://gitcode.com/gh_mirrors/jl/jless jl…...

C++ 位运算(Bitwise Operations)全解

C 位运算&#xff08;Bitwise Operations&#xff09;全解主题要点示例位运算符& ^ ~ << >>为什么要学位运算&#xff1f;速度快&#xff08;直接映射到 CPU 指令&#xff09;代码简洁&#xff08;掩码常常减少 loops&#xff09;低级硬件控制&#xff08;配合…...

VBA-JSON实战宝典:解锁Excel数据处理的无限可能

VBA-JSON实战宝典&#xff1a;解锁Excel数据处理的无限可能 【免费下载链接】VBA-JSON JSON conversion and parsing for VBA 项目地址: https://gitcode.com/gh_mirrors/vb/VBA-JSON VBA-JSON是一款强大的JSON转换与解析工具&#xff0c;专为VBA&#xff08;Windows和M…...

如何高效使用Python工具实现百度网盘真实下载地址解析

如何高效使用Python工具实现百度网盘真实下载地址解析 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 百度网盘解析工具是一款基于Python开发的实用工具&#xff0c;专门用于提…...

Python逆向工程实战:如何绕过百度网盘限制获取真实下载地址

Python逆向工程实战&#xff1a;如何绕过百度网盘限制获取真实下载地址 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 在当今数据驱动的时代&#xff0c;百度网盘作为国内最大…...

Spring AI MCP服务如何选择使用 WebMVC还是WebFlux

在 Spring AI MCP 服务中选择使用 WebMVC 还是 WebFlux&#xff0c;主要取决于你项目的技术栈和性能需求。 简单来说&#xff0c;如果你的项目是传统的 Spring MVC 应用&#xff0c;就选 WebMVC&#xff1b;如果是响应式编程项目或需要处理高并发&#xff0c;就选 WebFlux。 下…...

离线完成上下位机时间同步(硬PTP和软NTP)

一、需求为了满足业务软件正常运行&#xff0c;需要配置时间同步一般的场景分为以下几种1、无时同设备需要对Linux系统之间进行软同步2、有时同设备需要对Linux系统之间进行硬同步3、无时同设备需要对Windows和Linux系统之间进行软同步4、有时同设备需要对Windows和Linux系统之…...

神经网络学习率调优指南与实战技巧

1. 学习率对神经网络性能的影响概述在训练神经网络时&#xff0c;学习率(Learning Rate)可能是最关键的单一超参数。它决定了每次参数更新的步长大小&#xff0c;直接影响着模型收敛的速度和质量。想象一下你在下山&#xff1a;学习率就像你每一步迈出的距离 - 步子太大可能越过…...

Phi-4-mini-flash-reasoning部署指南:Web工作台一键启用长文本推理

Phi-4-mini-flash-reasoning部署指南&#xff1a;Web工作台一键启用长文本推理 1. 模型介绍 Phi-4-mini-flash-reasoning 是一款专为复杂推理任务优化的轻量级文本模型&#xff0c;特别适合需要多步思考和分析的场景。不同于常规的文本生成模型&#xff0c;它更擅长&#xff…...

Casdoor开源身份认证平台:基于OAuth 2.0/OIDC的统一登录解决方案

1. 项目概述&#xff1a;一个开源的统一身份认证与单点登录平台如果你正在为一个新项目搭建用户系统&#xff0c;或者正在为手头一堆各自为政的应用&#xff08;比如内部的OA、CRM、知识库&#xff09;如何统一登录而头疼&#xff0c;那么你很可能需要了解Casdoor。简单来说&am…...

FastAPI部署机器学习模型:实战指南与性能优化

1. 机器学习模型部署实战&#xff1a;基于FastAPI的完整指南作为一名长期奋战在机器学习一线的工程师&#xff0c;我深知模型部署是许多同行最头疼的环节。今天我将分享一个经过生产验证的解决方案——使用FastAPI构建轻量级预测API。这个方案已经支撑了我们团队80%的中小型模型…...

平板电脑Linux内核显示配置实战:绕过HDMI探测,手动指定DP-1接口与分辨率

平板电脑Linux内核显示配置实战&#xff1a;绕过HDMI探测&#xff0c;手动指定DP-1接口与分辨率 在嵌入式设备开发中&#xff0c;显示配置往往是工程师面临的第一个挑战。不同于标准PC环境&#xff0c;平板电脑、工控设备等定制化硬件通常采用固定连接的显示屏&#xff0c;缺乏…...

别再折腾VCS破解了!用Iverilog+GTKWave在Ubuntu 20.04上快速搭建数字电路仿真环境

开源数字电路仿真指南&#xff1a;Iverilog与GTKWave高效工作流搭建 在数字电路设计与验证领域&#xff0c;商业EDA工具虽然功能强大&#xff0c;但其复杂的安装流程、高昂的授权费用和苛刻的运行环境要求常常让初学者望而却步。对于高校学生、硬件爱好者和初创团队而言&#x…...

告别虚拟机!在Win10上原生运行ROS Melodic/Foxy的保姆级配置指南(含VS2022适配)

在Windows 10上原生运行ROS Melodic/Foxy的终极指南&#xff08;VS2022适配版&#xff09; 对于机器人开发者而言&#xff0c;长期依赖虚拟机运行ROS不仅消耗系统资源&#xff0c;还会导致开发效率低下。本文将彻底解决这一痛点&#xff0c;手把手教你如何在Windows 10上原生配…...

ToolEmu:用LLM模拟工具测试AI代理安全性的框架解析与实践

1. 项目概述&#xff1a;用大语言模型“模拟”工具&#xff0c;提前发现AI代理的风险如果你正在开发或者使用基于大语言模型的智能代理&#xff0c;比如让GPT-4去调用搜索引擎、操作数据库、发送邮件&#xff0c;那你一定思考过这个问题&#xff1a;我怎么知道它不会捅出大篓子…...

WeDLM-7B-Base开源大模型教程:Diffusion LM与AR模型本质差异

WeDLM-7B-Base开源大模型教程&#xff1a;Diffusion LM与AR模型本质差异 1. 认识WeDLM-7B-Base模型 WeDLM-7B-Base是一款基于扩散机制&#xff08;Diffusion&#xff09;的70亿参数高性能语言模型。与传统的自回归&#xff08;AR&#xff09;模型不同&#xff0c;它采用创新的…...

从‘相似用户挖掘’实战出发:手把手教你用Faiss构建你的第一个向量检索系统

从‘相似用户挖掘’实战出发&#xff1a;手把手教你用Faiss构建你的第一个向量检索系统 在推荐系统和精准营销领域&#xff0c;寻找相似用户&#xff08;Look-alike&#xff09;是一项基础但关键的任务。想象一下&#xff0c;你手头有一批高价值用户&#xff0c;如何快速找到与…...

WeDLM-7B-Base一文详解:32K上下文扩散语言模型的推理加速与精度平衡

WeDLM-7B-Base一文详解&#xff1a;32K上下文扩散语言模型的推理加速与精度平衡 1. 模型概述 WeDLM-7B-Base是一款基于扩散机制&#xff08;Diffusion&#xff09;的高性能基座语言模型&#xff0c;拥有70亿参数规模。作为新一代语言模型的代表&#xff0c;它采用了创新的并行…...

LeaguePrank完整教程:安全修改英雄联盟段位显示的终极指南

LeaguePrank完整教程&#xff1a;安全修改英雄联盟段位显示的终极指南 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 你是否厌倦了英雄联盟客户端一成不变的段位显示&#xff1f;想要在朋友面前展示独特的个人资料页面&#…...

LM多风格生成探索:写实/时尚/角色/服饰四大方向提示词模板库

LM多风格生成探索&#xff1a;写实/时尚/角色/服饰四大方向提示词模板库 1. 平台介绍与特点 LM是基于Tongyi-MAI / Z-Image底座的文生图镜像&#xff0c;专为高质量图像生成而设计。这个开箱即用的解决方案已经完成了模型预加载和Web页面封装&#xff0c;用户无需编写任何代码…...