栈和队列相关的OJ题

1.栈的压入、弹出序列

题目链接

栈的压入、弹出序列_牛客题霸_牛客网 (nowcoder.com)

题目描述

题目给出两个序列,一个是入序列pushV,一个是出序列popV,要求判断是否匹配入栈出栈的规则顺序。

解题思路

可以用数据模拟入栈出栈,将pushV序列的数据逐一放到栈中,当放到的数据与popV序列的数据相同时,则pop掉数据,再进行判断是否和栈顶相同,若是相同则进行pop,若是不同则将剩下数据再次逐一入栈,每次入栈一个数据都作一次判断是否需要出栈,最后将所有数据入栈后,此时对应判断pop数据后跳出循环,若是循环结束后栈内数据全部出栈成功,则意味着这两个序列匹配入栈出栈的规则,若还有数据则说明某次不匹配。

参考代码

    bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {size_t pushi = 0,popi = 0;stack<int> st;while(pushi != pushV.size()){st.push(pushV[pushi++]);while(!st.empty() && st.top() == popV[popi]){st.pop();popi++;}}return st.empty();}

2.最小栈

题目链接

155. 最小栈 - 力扣(LeetCode)

题目描述

题目要求实现一个能够返回栈内数据最小值的栈,具备栈该有的基本接口,并且要以O(1)的代价提供一个接口,能够返回栈内最小的数据

解题思路

用C++的话可以复用库内的栈,将数据和最小值分别存在两个栈中,当栈push的时候,最小值的栈作判断,若是push的值比栈顶的小或者相等,则将值同时存放到放最小值的栈中,出栈时同样判断是否需要一起出栈,即可实现要求

参考代码

class MinStack 
{
public:MinStack() {}void push(int val) {_st.push(val);if(_min.empty() || _min.top() >= val){_min.push(val);}}void pop() {if(_min.top() == _st.top()){_min.pop();}_st.pop();}int top() {return _st.top();}int getMin() {return _min.top();}
private:stack<int> _st;stack<int> _min;
};

3.逆波兰表达式求值

题目链接

150. 逆波兰表达式求值 - 力扣(LeetCode)

题目描述

逆波兰表达式也叫后缀表达式,计算机在对式子进行运算时,需要知道运算的先后顺序,因此需要将平时常见的中缀表达式先转换为后缀表达式,该题目要求模拟实现计算机然后实现对中缀表达式进行运算,题目给一串字符串序列,我们需要模拟实现计算过程,将计算结果返回

解题思路

后缀表达式的计算方法,从左往右遍历,遇到数值则入栈,当遇到运算符时,则将栈顶的两个元素作为表达式左值和右值进行运算(栈顶第一个元素为右值,第二个为左值),将结果继续入栈,重复操作后,最终遍历结束后,在栈中保留下来的值就是计算的最终结果。

参考代码

class Solution 
{
public:int evalRPN(vector<string>& tokens) {stack<int> ret;int left = 0;int right =0;for(auto& e: tokens){if(e == "+" || e =="-" || e =="*" || e == "/"){right = ret.top();ret.pop();left = ret.top();ret.pop();switch(e[0]){case '+':ret.push(left+right);break;case '-':ret.push(left-right);break;case '*':ret.push(left*right);break;case '/':ret.push(left/right);break;                    }}else{ret.push(stoi(e));}}return ret.top();}
};

4.用栈实现队列

题目链接

232. 用栈实现队列 - 力扣(LeetCode)

题目描述

用两个栈去实现一个队列,并且要支持其基本的接口

解题思路

两个栈可以想象成两个单口长杯,数据入队列时,用a栈去接收数据,当需要出队列时,则将a栈内的数据全部倒到b栈中,a栈负责接收数据,b栈负责出数据,当b为空则找a要数据,两个栈都为空则说明队列内为空

参考代码

class MyQueue 
{
public:MyQueue() {}void push(int x) {_in.push(x);}void if_out_empty(){if(_out.empty() && !_in.empty()){while(!_in.empty()){_out.push(_in.top());_in.pop();}}}int pop() {if_out_empty();int ret = peek();_out.pop();return ret;}int peek() {if_out_empty();return _out.top();}bool empty() {return _in.empty()&&_out.empty();}
private:stack<int> _in;stack<int> _out;
};

5.用队列实现栈

题目链接

225. 用队列实现栈 - 力扣(LeetCode)

题目描述

用两个队列实现栈的基本接口

解题思路

核心难点在于找到栈顶top,一个队列用来存放数据,一个队列用来找到栈顶,当需要pop栈顶的时候,可以让存放数据的队列,除了队尾的数据,也就是需要被pop的栈顶,其余全部放到另一个队列中,让另一个队列重新作为存储数据的地方,而栈顶单独拿出来释放即可。

参考代码

class MyStack {
public:MyStack() {}void push(int x) {if(_q1.empty()){_q2.push(x);}else{_q1.push(x);}}int pop() {int ret = top();if(!_q1.empty()){while(_q1.size() != 1){_q2.push(_q1.front());_q1.pop();}_q1.pop();}else{while(_q2.size() != 1){_q1.push(_q2.front());_q2.pop();}_q2.pop();}return ret;}int top() {if(!_q1.empty()){return _q1.back();}else{return _q2.back();}}bool empty() {return _q1.empty() && _q2.empty();}
private:queue<int> _q1;queue<int> _q2;};

总结

本章整理了部分与栈和队列相关的OJ题,加深练习栈和队列的特性

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

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

相关文章

SpringBoot使用@Value获取不到yaml中配置的值

在最近的开发中遇到一个问题,使用Value获取yml文件中配置的属性时始终获取不到值,一开始我以为是没有注入的问题,或者没有写setter方法的问题,后来我发现这些都都写了然后开始百度发现获取不到属性值有这么几个原因 获取不到值的原因 1.没有使用Component注解,也就是没有注入…

技术文档工具『Writerside』抢鲜体验

前言 2023 年 10 月 16 日&#xff0c;JetBrains 宣布以早期访问状态推出 Writerside&#xff0c;基于 IntelliJ 平台的 JetBrains IDE&#xff0c;开发人员可使用它编写、构建、测试和发布技术文档&#xff0c;可以作为 JetBrains IDE 中的插件使用&#xff0c;也可以作为独立…

无论有没有按钮,iPhone都可以进行截屏操作!如何在iPhone上截屏

通过简单的按键组合&#xff0c;可以很容易地将iPhone屏幕的图片捕获到图像文件中&#xff0c;并保存到照片库中。以下是操作方法。 什么是屏幕截图 屏幕截图是指通常包含你在设备屏幕上看到的内容的精确副本的图像。在设备内拍摄的数字屏幕截图通常使用相机拍摄物理屏幕的照…

Spring容器中同名 Bean 加载策略

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是「奇点」&#xff0c;江湖人称 singularity。刚工作几年&#xff0c;想和大家一同进步&#x1f91d;&#x1f91d; 一位上进心十足的【Java ToB端大厂…

【vSphere 8 自签名证书】企业 CA 签名证书替换 vSphere Machine SSL 证书Ⅳ—— 替换默认证书

目录 博文摘要6. 使用企业 CA 签发的 SSL 证书 替换 vSphere 默认 SSL 证书6.1 确认证书文件6.2 替换默认 vSphere 证书6.3 验证自签名证书6.4 补充说明 关联博文参考资料 博文摘要 博文主要描述了在 vCenter Server 8 上通过实用工具 certificate-manager 将 vSphere 默认 Ma…

差分时钟与DDR3

Zynq上的存储器接口 所有 Zynq-7000 AP芯片上的存储器接口单元包括一个动态存储器控制器和几个 静态存储器接口模块。动态存储器控制器可以用于 DDR3、DDR3L、DDR2 和 LPDDR2。 静态存储器控制器支持一个 NAND 闪存接口、一个 Quad-SPI 闪存接口、一个并行数 据总线和并行 NOR …

力扣刷题 day52:10-22

1.数组拆分 给定长度为 2n 的整数数组 nums &#xff0c;你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) &#xff0c;使得从 1 到 n 的 min(ai, bi) 总和最大。 返回该 最大总和 。 方法一&#xff1a;排序 #方法一&#xff1a;排序 def arrayPai…

uniapp开发微信小程序,webview内嵌h5,h5打开pdf地址,解决方案

根据公司要求&#xff0c;让我写一个h5&#xff0c;后续会嵌入到合作公司的微信小程序的webview中&#xff0c;如果是自己公司微信小程序&#xff0c;可以采取先下载下来pdf&#xff0c;然后通过wx.openDocument&#xff0c;进行单纯的预览操作&#xff0c;这个可以根据这个老哥…

工具让公众号推送变得轻而易举

公众号运营的关键在于定期向用户推送内容&#xff0c;但手动推送过程繁琐且浪费时间。现在&#xff0c;有了乔拓云公众号助手工具&#xff0c;你可以轻松实现公众号的自动推送功能。让我们一起来看看如何操作吧&#xff01; 首先&#xff0c;你需要注册一个乔拓云公众号助手工具…

【Rust】4 一文讲解重点 pattern matching | trait | 生命周期 | 闭包 | 迭代器 | 智能指针 | 并发与并行

文章目录 一、pattern matching二、trait2.1 常见 trait2.1.1 Copy 和 Clone2.1.2 PartialEq 和 Eq2.1.3 PartialOrd 和 Ord2.1.4 Hash2.1.5 From, Into, TryFrom, TryInto 2.2 概念2.2.1 关联类型2.2.2 关联常量2.3.3 泛型关联类型2.3.3.1 示例: 用泛型关联类型, 创建集合工厂…

【Docker从入门到入土 2】Docker数据管理、网络通信和网络模式 1.0

Part2 一、Docker网络模式&#xff08;面试高频&#xff09;1.1 Docker 网络实现原理1.2 host模式1.3 container模式1.4 none模式1.5 bridge模式1.6 自定义网络 二、Docker网络通信2.1 端口映射2.2 容器互联 三、Docker资源控制3.1 Cgroup简介3.2 CPU资源控制3.2.1 设置CPU使用…

Android C/C++ native编程NDK开发中logcat的使用

Android C/C native编程NDK开发中logcat的使用 前言具体用法 前言 在NDK开发过程中&#xff0c;C/C层&#xff0c;需要对代码进行一些调试&#xff0c;日志打印是我们解决异常或崩溃的重要手段&#xff0c;这里我就简单介绍下日志打印三步走。 首先我们先看下官方文档关于日志…

QSlider 类使用教程

文章目录 1、简介2 、公共类型3、属性4、functions4.1、访问属性相关 function4.2、公共槽4.3、Signal4.4、其他方法 5、设置样式 QT 官方文档参考地址&#xff1a;https://doc.qt.io/qt-5/qslider.html 1、简介 QSlider是垂直或水平滑块条控件&#xff0c;最常见的应用就是视…

DELM深度极限学习机回归预测研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

一秒开挂!工厂模式让你告别重复代码!

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一、工…

DC电源模块的数字电源优势

BOSHIDA DC电源模块的数字电源优势 数字电源模块是指在电源的设计和控制上采用数字式方案&#xff0c;采用数字化技术&#xff0c;将传统的电源模块从模拟传统电源转变为数字电源变成的模块。 传统的电源模块使用模拟技术&#xff0c;其主要优势在于可控性高、稳定性好&#…

运维人必须掌握的 5 种常用运维监控工具

运维人必须掌握的 5 种常用运维监控工具 运维监控工具千千万,仅开源的解决方案就有流量监控(MRTG、Cacti、SmokePing、Graphite 等)和性能告警(Nagios、Zabbix、Zenoss Core、Ganglia、OpenTSDB等)可供选择。 并且每种软件都有自己的特点和功能,各自的侧重点和目标不完全…

四大特性模块(module)

module的动机 C20中新增了四大特性之一的模块(module)&#xff0c;用以解决传统的头文件在编译时间及程序组织上的问题。 modules 试图解决的痛点 能最大的痛点就是编译慢, 头文件的重复替换, 比如你有多个翻译单元, 每一个都调用了 iostream, 就得都处理一遍. 预处理完的源…

如何开发一个 Safari 插件

本文字数&#xff1a;2493字 预计阅读时间&#xff1a;15分钟 由于常用浏览器是Safari&#xff0c;而Safari浏览器的插件比不上Chrome&#xff0c;所以就有了自己开发常用的Safari插件的想法。 打算开发当前页面生成二维码的Extension&#xff0c;因为网络原因&#xff0c;AirD…

DASCTF-CBCTF-2023 Crypto部分复现

文章目录 EzRSACB backpack 这次比赛没打&#xff0c;记错时间了&#xff0c;看了一下&#xff0c;如果去做的话大概也只能做出那两道简单的题&#xff0c;还是太菜啦 EzRSA 题目描述&#xff1a; from Crypto.Util.number import * import random from gmpy2 import * from …