LeetCode255.用队列实现栈

 题目传送门:Leetcode255.用队列实现栈

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(pushtoppop 和 empty)。

实现 MyStack 类:

  • void push(int x) 将元素 x 压入栈顶。
  • int pop() 移除并返回栈顶元素。
  • int top() 返回栈顶元素。
  • boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

注意:

  • 你只能使用队列的基本操作 —— 也就是 push to backpeek/pop from frontsize 和 is empty 这些操作。
  • 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。

示例:

输入:
["MyStack", "push", "push", "top", "pop", "empty"]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 2, 2, false]解释:
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False

提示:

  • 1 <= x <= 9
  • 最多调用100 次 pushpoptop 和 empty
  • 每次调用 pop 和 top 都保证栈不为空

进阶:你能否仅用一个队列来实现栈。

 试题解析:

已知队列是先进先出,栈是先进后出。
当我们寻找栈顶元素时,实际上是要将当前队列的尾元素输出,但队列的pop()函数只能弹出队首,这时便可以使用第二个辅助队列。
具体方案:

定义两个队列q1,q2,q1为存放数据的队列,q2是辅助队列,每一步操作之后都要将数据存回q1

进行push操作时,在q1中插入元素
进行pop操作时:

1、将q1中的除了队尾之外的元素,全部插入到q2队列中

2、在q1中删除剩下的元素,即队尾元素

3、将q2队列中的元素再插回到q1中

class MyStack {
public:queue<int> q1;queue<int> q2;MyStack() {}void push(int x) {q1.push(x);}int pop() {int n = 0;while(n < q1.size() - 1){//循环到q1只剩一个元素q2.push(q1.front());q1.pop();}int num = q1.front();q1.pop();//将数据存回q1while(!q2.empty()){q1.push(q2.front());q2.pop();}return num;}int top() {return q1.back();}bool empty() {if(q1.empty()){return true;}return false;}
};
 更好方案

从以上方法我们可以观察到,q1是存放数据的队列,q2为辅助队列,每一次执行删除之后都要将q2的数据存回q1,接下来的push,pop操作都是从q1开始

那么我们可不可以在每一次pop中都少一次存回q1的操作,而将之后的push,pop操作开始于q2呢?

已知我们每一次转移元素操作后,都会有一个队列为空,那么pop操作时,我们只需要从不为空的队列开始操作即可

至于push操作,在最开始时,q1,q2都为空时,我们将元素添加到q1,对于之后的操作,我们还是只需要从不为空的队列开始插入元素即可。

class MyStack {
public:queue<int> q1;queue<int> q2;MyStack() {}void push(int x) {//若q1,q2都不为空,则插入到q1后if(q1.empty()&&q2.empty()){q1.push(x);}else{//选择不空的队列插入元素if(!q1.empty()) q1.push(x);else if(!q2.empty()) q2.push(x);}}int pop() {int n = 0;int num;//选择不空的队列操作if(!q1.empty()){while(n < q1.size() - 1){q2.push(q1.front());q1.pop();}num = q1.front();q1.pop();}else if(!q2.empty()){while(n < q2.size() - 1){q1.push(q2.front());q2.pop();}num = q2.front();q2.pop();}return num;}int top() {//选择不空的队列操作if(q1.empty()){while(!q2.empty()){q1.push(q2.front());q2.pop();}return q1.back();}else if(q2.empty()){while(!q1.empty()){q2.push(q1.front());q1.pop();}return q2.back();}return 0;}bool empty() {if(q1.empty()&&q2.empty()){return true;}return false;}
};

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

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

相关文章

Python爬虫—requests模块简单应用

Python爬虫—requests模块简介 requests的作用与安装 作用&#xff1a;发送网络请求&#xff0c;返回响应数据 安装&#xff1a;pip install requests requests模块发送简单的get请求、获取响应 需求&#xff1a;通过requests向百度首页发送请求&#xff0c;获取百度首页的…

Visual Studio Code 连接远程服务器方法

1、输入用户名和服务器ip连接远程服务器 2、选择配置文件 配置文件路径&#xff1a;C:\Users\Administrator\.ssh\config config的内容大致如下&#xff1a; Host 192.168.134.3HostName 192.168.134.3User zhangshanHost 192.168.134.3HostName 192.168.134.3User lisiHost…

Java中异常处理-详解

异常&#xff08;Exception&#xff09; JVM 默认处理方案 把异常的名称&#xff0c;异常的原因&#xff0c;及异常出错的位置等信息输出在控制台程序停止执行 异常类型 编译时异常必须显示处理&#xff0c;否则程序会发生错误&#xff0c;无法通过编译运行时异常无需显示处理…

干货|移动端App自动化之触屏操作自动化

工作中我们经常需要对应用的页面进行手势操作&#xff0c;比如滑动、长按、拖动等&#xff0c;AppiumDriver 为我们提供一个模拟手势操作的辅助类 TouchAction&#xff0c;可以通过它对手机屏幕进行手势操作。 具体用法参见链接&#xff1a;chromedriver下载地址与webview自动化…

C语言入门教程,C语言学习教程(第三部分:C语言变量和数据类型)一

第三部分&#xff1a;C语言变量和数据类型 本章也是C语言的基础知识&#xff0c;主要讲解变量、数据类型以及运算符&#xff0c;这其中涉及到了数据的存储格式以及不同进制。 一、大话C语言变量和数据类型 在《数据在内存中的存储&#xff08;二进制形式存储&#xff09;》一…

winSCP是什么?它有什么功能和特性?它值不值得我们去学习?我们该如何去学习呢?

WinSCP是一款免费的开源SFTP、SCP、FTP和WebDAV客户端&#xff0c;用于Windows操作系统。它提供了一个图形化界面&#xff0c;使用户可以方便地在本地计算机和远程计算机之间传输文件。 WinSCP支持SSH加密通信和多种认证方法&#xff0c;包括密码、公钥和键盘交互。它还支持自…

【调研】人工智能(大模型)生成内容AIGC检测

本篇文章分享近期人工智能生成内容AIGC检测的相关工作,主要介绍大模型的文本生成检测和图片生成检测 目录 1. AI-Generated Content 人工智能生成内容2. 大语言模型LLM生成内容检测方法分类黑盒检测方法论文举例白盒检测方法论文举例3. 大模型图片生成检测论文举例1. AI-Gene…

el-form中一个el-form-item需要规则校验多个input

我的数据的格式&#xff1a; formData: {ipAddress: {one: ,two: ,}, }, 代码结构&#xff1a; <el-form-item label"IP地址" prop"ipAddress"><el-input-numberv-model"formData.ipAddress.one"class"ip-address":contro…

松木和桉木建筑模板:它们的性能和用途有何区别?

在建筑行业中&#xff0c;选择合适的模板材料对于保证施工质量和效率至关重要。松木和桉木是两种常用的建筑模板材料&#xff0c;它们各有特点和优势。特别是桉木&#xff0c;在某些方面相比松木有显著的优势。 松木建筑模板的特点 松木因其广泛的可用性和经济性而被广泛应用…

【刷题笔记3】

笔记3 输出小数位数控制。&#xff08;自动四舍五入&#xff0c;不够就自动补0&#xff09; double a123.456; cout<<fixed<<setprecision(2)<<a;递归题目的记录 &#xff08;1&#xff09;&#xff1a;n*m的棋盘格子&#xff08;n为横向的格子数&#xf…

响应式编程Reactor API大全(下)

Reactor 是一个基于响应式编程的库&#xff0c;主要用于构建异步和事件驱动的应用程序。Reactor 提供了丰富的 API&#xff0c;包括创建、转换、过滤、组合等操作符&#xff0c;用于处理异步数据流。以下是一些 Reactor 的主要 API 示例&#xff1a; pom依赖 <dependencyMan…

Git Large File Storage介绍

Git Large File Storage&#xff08;Git LFS&#xff09;是一个 Git 扩展&#xff0c;用于改善大文件的处理。著名的huggingface就是使用它存储大模型文件。在使用传统的 Git 时&#xff0c;所有历史记录中的文件都存储在 Git 仓库中&#xff0c;这可能导致仓库变得异常庞大&am…

抛弃安卓,追赶iOS,鸿蒙能否成为中国第二大系统?

据半导体行业观察机构Techinsights发布报告预测&#xff0c;从2024年起&#xff0c;鸿蒙Harmony OS将取代苹果iOS&#xff0c;成为中国市场上第二大智能手机操作系统。 鸿蒙系统&#xff0c;支棱起来了&#xff01;去年&#xff0c;华为前脚“复活”麒麟芯片&#xff0c;后脚宣…

C#-sort()利用委托自定义排序

文章速览 前言&#xff1a;核心代码&#xff1a;完整示例&#xff1a;对链表实现自定义排序1、链表类2、解决方案&#xff1a; 坚持记录实属不易&#xff0c;希望友善多金的码友能够随手点一个赞。 共同创建氛围更加良好的开发者社区&#xff01; 谢谢~ 前言&#xff1a; 使用…

学习笔记18——个人理解为什么快速重传是3次ACK

为什么快速重传是选择3次ACK&#xff1f; 个人理解&#xff1a;首先网络中的丢包&#xff0c;乱序以及网路故障都会让服务器端发回duplicated ACK&#xff0c;表示有一个包一直未收到。快速重传是通过3次ACK来区分乱序&#xff0c;丢包和网路拥塞的情况&#xff0c;是基于实践经…

解决jenkins需要jdk11,项目需要jdk8的问题

思路&#xff1a;jdk8 采用解压缩模式&#xff0c;jdk11采用安装模式&#xff0c;然后在jenkins中指定jdk路径 下载解压缩jdk8 https://www.oracle.com/java/technologies/downloads/#java8 解压缩&#xff1a;jdk-8u391-linux-i586.tar.gz /lib/ld-linux.so.2: bad ELF inte…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷⑥

2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷6 目录 需要竞赛软件包环境以及备赛资源可私信博主&#xff01;&#xff01;&#xff01; 2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷6 模块一…

时空数据各大顶会最新论文和代码分享,结合多模态、扩散学习等热门主题

本次继续分享时空数据相关的论文。上一期戳这里↓&#xff1a;时空预测方向最新研究成果汇总&#xff0c;附13篇必看顶会论文https://blog.csdn.net/weixin_42645636/article/details/135369217 在刚刚过去的2023年间&#xff0c;我们不仅在时空数据领域的传统任务上取得了许多…

Java线程学习笔记

1、判断线程存活 1. 当线程run()或者call()方法执行结束&#xff0c;线程进入终止状态 2. 当线程内发生异常&#xff0c;并且异常没有被捕获&#xff0c;线程进入终止状态 3. 线程调用stop()方法后&#xff0c;线程进入终止状态(不推荐使用) 当主线程结束时&#xff0c;其他线程…

下一代人工智能的设计思路

大模型扭转了此前人工智能研究的思路&#xff0c;放弃了可解释性&#xff0c;而开始拥抱复杂网络和大规模参数。 这些让现代神经网络的能力超越前代&#xff0c;但也带来了不少问题。 巨大的成本&#xff1a;训练模型需要的数据和算力都是海量&#xff0c;动辄数百万千万&…