【力扣晒题练习】232. 用栈实现队列

题目描述:

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

实现 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(双端队列)来模拟一个栈,只要是标准的栈操作即可。

题目解答:

class MyQueue {
public:stack<int> s_input,s_output;MyQueue() {}void push(int x) {s_input.push(x);}int pop() {if(s_output.empty()){while(!s_input.empty()){s_output.push(s_input.top());s_input.pop();}}int res=s_output.top();s_output.pop();return res;}int peek() {int res=this->pop();s_output.push(res);return res;}bool empty() {return s_input.empty() && s_output.empty();}
};/*** Your MyQueue object will be instantiated and called as such:* MyQueue* obj = new MyQueue();* obj->push(x);* int param_2 = obj->pop();* int param_3 = obj->peek();* bool param_4 = obj->empty();*/

题目思路:

优化后的代码思路主要集中在减少不必要的元素移动操作,特别是在poppeek方法中。这里我们详细分析优化后的代码思路:

成员变量

代码中有两个栈:s_inputs_outputs_input用于接收所有入队的元素,而s_output用于辅助实现队列的先进先出特性。

方法

1. push(int x)

当元素入队时,直接将其压入s_input栈。这是队列的基本入队操作,没有变化。

2. pop()

在出队操作时,首先检查s_output栈是否为空。如果为空,意味着所有入队的元素都还在s_input中,且尚未以队列的顺序排列。此时,需要将s_input中的所有元素逐一弹出并压入s_output,这样s_output的栈顶元素就是队列的队首元素。完成这个步骤后,s_output的栈顶元素就可以安全地弹出并返回。

优化点:通过确保在每次pop之前s_output中都有元素(除非队列本身为空),我们可以避免在每次pop时都检查并移动元素。这提高了效率,因为一旦s_output被填充,后续的pop操作就可以直接从s_output中执行,而无需再次移动元素。

3. peek()

peek方法用于查看队列的队首元素但不移除它。其逻辑与pop方法类似,首先检查s_output是否为空。如果为空,则将s_input中的元素移动到s_output。然后,返回s_output的栈顶元素,但不弹出它。

优化点:与pop方法共享相同的逻辑来确保s_output中有元素,避免了重复的检查和移动操作。这提高了peek方法的效率。

4. empty()

这个方法检查队列是否为空。它通过检查s_inputs_output两个栈是否都为空来实现。如果两个栈都为空,则队列为空。

总结

主要是利用两个栈来实现队列的功能,并通过确保s_output栈在poppeek操作前总是包含队列的元素(除非队列为空),来减少不必要的元素移动。这种优化减少了重复操作,提高了队列操作的效率。

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

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

相关文章

基于SpringBoot的招聘网站

基于jspmysqlSpring的SpringBoot招聘网站项目&#xff08;完整源码sql&#xff09; 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》…

Elastic Stack--03--索引操作、文档操作、_cat

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1._cat/_cat/indices?v 查看所有的索引信息 2.索引操作索引就相当于我们讲的关系型数据库MySQL中的 database 2.1 创建索引PUT /索引名 2.2 查看索引信息GET /索引…

Java 容器启动执行指定任务

1、实现CommandLineRunner接口 实现CommandLineRunner接口&#xff0c;注意做初始化任务的类需要放在扫描路径下&#xff0c;使用Component注入到spring容器中。 import com.zw.service.StudentService; import org.springframework.beans.factory.annotation.Autowired; impo…

系统学习c++类和对象——深度理解默认成员函数

前言&#xff1a;类和对象是面向对象语言的重要概念。 c身为一门既面向过程&#xff0c;又面向对象的语言。 想要学习c&#xff0c; 首先同样要先了解类和对象。 本节就类和对象的几种构造函数相关内容进行深入的讲解。 目录 类和对象的基本概念 封装 类域和类体 访问限定符…

【Java设计模式】九、桥接模式

文章目录 0、背景1、模式2、案例3、使用场景 0、背景 现要创建不同的图形&#xff0c;图形的形状有圆、长方形、正方形&#xff0c;且它们有不同的颜色 两个维度在变&#xff0c;使用类的继承可以实现&#xff0c;也符合开闭原则&#xff0c;但会类爆炸。 1、模式 将抽象与…

BUG:Enigma Virtual Box打包.net独立程序不正常

专栏介绍与文章目录-CSDN博客 尝试了使用Enigma Virtual Box打包.net8的winform程序&#xff0c;程序发布为不依赖框架的单一文件&#xff08;设置了压缩&#xff09;&#xff0c;再和另外几个文件打包成一个exe&#xff08;另外的文件不影响.net程序打开&#xff09;。 但是打…

Vue中的组件:构建现代Web应用的基石

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

动态规划:Leetcode 91.解码方法

题目 一条包含字母 A-Z 的消息通过以下映射进行了 编码 &#xff1a; A -> "1" B -> "2" ... Z -> "26" 要 解码 已编码的消息&#xff0c;所有数字必须基于上述映射的方法&#xff0c;反向映射回字母&#xff08;可能有多种方法&am…

GNN-Transformer新突破!全局与局部的完美融合

图神经网络&#xff08;GNN&#xff09;和Transformer的结合是近年来的研究热点。这类结合不仅能够让两者发挥各自的优势&#xff0c;还能推动模型的创新&#xff0c;提高处理图数据的效率和性能。 具体点讲&#xff0c;通过利用Transformer&#xff0c;我们可以扩展GNN的感受…

Python办公自动化之PDF(二)

Python操作PDF二 1、PyMuPDF简介2、 1、PyMuPDF简介 PyMuPDF&#xff08;也称Fitz&#xff09;开源&#xff0c;提供了一整套用于处理PDF文件的综合工具。使用PyMuPDF&#xff0c;用户可以高效地执行打开PDF、提取文本、图像和表格、操作旋转和裁剪等页面属性、创建新PDF文档以…

Koltin 语言与Java语言有哪些差异?

目录 1. 变量声明方式不同 2. 方法(函数)定义略有不同 3. 逻辑控制关键字 if 的使用区别 4. 继承的区别 5. 接口和实现的区别 6. Koltin 的数据类有什么用&#xff1f; 1. 变量声明方式不同 Koltin声明变量的方式与Java类似&#xff0c;但是顺序不太一样。 举例如下 J…

Mapbox添加model图层

贴个群号 WebGIS学习交流群461555818&#xff0c;欢迎大家 效果图 源码 经常关注mapbox的朋友会发现&#xff0c;3.0版本之后&#xff0c;mapbox的api里更新了一个model图层 但是呢&#xff0c;却没有提供model有关的api&#xff0c;让我们摸不着头脑&#xff0c;到底该如…

20个常用的Python脚本

以下是20个常用的Python脚本示例&#xff1a; 计算阶乘 def factorial(n):if n 0:return 1else:return n * factorial(n-1)print(factorial(5))斐波那契数列 def fibonacci(n):if n < 1:return nelse:return fibonacci(n-1) fibonacci(n-2)print(fibonacci(10))判断素数…

最新基于R语言lavaan结构方程模型(SEM)技术

原文链接&#xff1a;最新基于R语言lavaan结构方程模型&#xff08;SEM&#xff09;技术https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247596681&idx4&sn08753dd4d3e7bc492d750c0f06bba1b2&chksmfa823b6ecdf5b278ca0b94213391b5a222d1776743609cd3d14…

【C++庖丁解牛】模拟实现STL的string容器(最后附源码)

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1.vs和g下string结构…

librtmp交叉编译

目录 软件包下载 libopenssl编译 libz编译 librtmp编译 软件包下载 librtmp依赖openssl库和zlib库&#xff0c;注意openssl库版本需要为1.0&#xff0c;三个库下载地址如下&#xff1a; openssl:https://www.openssl.org/source/old/1.0.0/openssl-1.0.0s.tar.gz zlib:h…

LeetCode_Hot100_栈_155最小栈_Python

题目 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。i…

mysql笔记:3. 表数据更新

文章目录 插入数据插入单条数据插入多条数据复制表插入数据 更新数据删除数据截断表 存储在系统中的数据是数据库管理系统&#xff08;DBMS&#xff09;的核心&#xff0c;数据库被设计用来管理数据的存储、访问和维护数据的完整性。那么&#xff0c;数据库和表创建完成后&…

创造一款安卓自定义控件(4)——使用Matrix的setPolyToPoly方法实现图像纠正

接上文&#xff1a; 创造一款安卓自定义控件_任意4顶点裁剪框http://t.csdnimg.cn/vu1r5 创造一款安卓自定义控件_任意4顶点裁剪框2_为裁剪框添加放大镜功能http://t.csdnimg.cn/qkngh 创造一款安卓自定义控件_裁剪原理介绍http://t.csdnimg.cn/ORRRL 需求 随着需求修改&#x…

Stable Diffusion 详解

整体目标 文本生成图片&#xff1b;文本图片生成图片 网络结构 CLIP的文本编码器和图片生成器组成图像生成器&#xff0c;输入是噪声经过UNet得到图像特征&#xff0c;最后解码得到图像 前向扩散 模型直接预测图片难度比较大&#xff0c;所有让模型预测噪音然后输入-噪音…