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

C++-stack题型->最小栈,栈的压入与弹出,逆波兰表达式

目录

最小栈

栈的压入与弹出

 逆波兰表达式


最小栈

155. 最小栈 - 力扣(Leetcode)

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素val推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int getMin() 获取堆栈中的最小元素。

刚刚开始,我认为可以写一个栈存放数据,一个int保存最小值,但是如果最小值在栈中呗pop时,我们就找不到之前的最小值了

 设计双栈解决该问题

mini栈的栈顶就是最小值存放栈数据中的。 当我们栈pop时只需要比较是否与mini.top()是否相等,相等mini.pop(),否则不动

如果多次压入多个0(最小值)我们也需要在mini栈压入0。否者在栈pop最小值时会把mini唯一最小值删除,但是pop的最小值是多个的,数据会出错。

栈.pop()。是把0删除,这次删除也会把mini栈0删除,删除后mini.top=2,而实际栈最小数据==0

 

所以我们需要在压入数据如果与mini.top相同或小于,mini.top也压入数据。

这样如果我们删除栈.pop(),此刻最小值依旧是0,而mini.top()也为0。

假设极端情况:最小值非常非常非常多,最小值1有100w个

 此时最小栈也要存放100w个1,极大的浪费了空间,所以我们使用计数器(一个结构体,里面保存最小值,以及最小值数量)

struct Intcount
{Intcount(int x = 0):_val(x), count(1){}int _val;int count;
};

使用计数器代替了stack<int>-->stack<Intcount>

实现代码:

struct Intcount
{Intcount(int x = 0):_val(x), count(1){}int _val;int count;
};class MinStack {
private:    std::stack<Intcount> _minst;std::stack<int> st;
public:void push(int val) {if (_minst.size() == 0){_minst.push(val);st.push(val);}else{st.push(val);if (st.top() == _minst.top()._val){++_minst.top().count;}else if(st.top() < _minst.top()._val){_minst.push(val);}}}void pop() {if (st.top() == _minst.top()._val){--_minst.top().count;if (_minst.top().count == 0){_minst.pop();}}st.pop();}int top() {return st.top();}int getMin() {return _minst.top()._val;}
};

栈的压入与弹出

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

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。

1. 0<=pushV.length == popV.length <=1000

2. -1000<=pushV[i]<=1000

3. pushV 的所有数字均不相同

一句话,判断出栈顺序是否合法。

开辟一个栈

将popV与pushV的数据拿出来,将pushV的数据加载到栈中。

那栈顶的数据与popV的数据比较,如果相等就pop栈顶数据并且popV的下标++,无论相等不相等都要一直载入pushV数据

直到栈.top()等于popV[j]此刻将栈顶删除并且j++,并且检查新栈top是否等于popV[j         ] 

继续栈pop

 

 

这个时候检查栈是否有数据,如果有数据就是错误的,如果没有数据就是正确的。

代码:

class Solution {
public:bool IsPopOrder(vector<int> pushV,vector<int> popV) {stack<int> st;vector<int>::size_type j=0;for(size_t i=0;i<pushV.size();++i){st.push(pushV[i]);while(!st.empty()&&popV[j]==st.top()){st.pop();++j;}}return st.empty();}
};

 逆波兰表达式

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

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。

请你计算该表达式。返回一个表示表达式值的整数。

注意:

  • 有效的算符为 '+''-''*' 和 '/' 。
  • 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
  • 两个整数之间的除法总是 向零截断 。
  • 表达式中不含除零运算。
  • 输入是一个根据逆波兰表示法表示的算术表达式。
  • 答案及所有中间计算结果可以用 32 位 整数表示。

建一个栈,将数字字符串转换为整型然后存放到栈中,如果遇见运算符字符串,就将栈中取两个数据,进行运行,结果在压入栈中。

注意我们将使用switch判断表达式,表达式不可能比对字符串,但是可以比对整型字符char。所以我们将运算符字符串在比较时取第一个元素比较  char*ch="+"  取ch[0]进行比较。

利用stoi函数将数字字符串转换为整型。

将“2”  和 “1”转换后压入栈中

 

 

 继续将字符串“5”压入栈中,

 

继续走遇见''*" 拿出数据5和3进行运算,5为右操作数,3为左操作数

++j走到末尾,此刻将栈.top取出的数据就是结果数据

 

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

相关文章:

C++-stack题型->最小栈,栈的压入与弹出,逆波兰表达式

目录 最小栈 栈的压入与弹出 逆波兰表达式 最小栈 155. 最小栈 - 力扣&#xff08;Leetcode&#xff09; 设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void …...

【计算机网络实验】BGP和OSPF协议仿真实验

实验内容  BGP和OSPF协议仿真实验 实验目的 &#xff08;1&#xff09;学习BGP协议的配置方法&#xff1b; &#xff08;2&#xff09;验证BGP协议的工作原理&#xff1b; &#xff08;3&#xff09;掌握网络自治系统的划分方法&#xff1b; &#xff08;4&#xff09;验证…...

提升日期处理效率:day.js 实战经验分享

theme: smartblue 本文简介 点赞 关注 收藏 学会了 本文主要介绍我在工作中使用 day.js 较多的方法。本文并不能代替 day.js 官方文档&#xff0c;日常工作中该查文档的还是要查文档。本文是写给刚接触 day.js 的工友&#xff0c;让这部分工友能更顺利上手 day.js。本文不涉…...

mysql中的count(1)、count(*)、count(id)哪个更快?

今天和大家聊一下mysql中的count()方法 我们日常开发中&#xff0c;经常会用到count()命令&#xff0c;有的人用count(*)&#xff0c;有的人用count(1)&#xff0c;还有的人用count(id)&#xff0c;那么这几种写法都有什么区别呢&#xff1f;哪种方法效率更高呢&#xff1f;今…...

cf1750E Bracket Cost

前言&#xff1a; 好久没训练了,来做道计数题找找感觉。**期末毁我青春 大意&#xff1a; 定义对于一个括号串 s的值&#xff0c;为通过最小次数以下操作使 s 实现括号匹配的操作次数。 选择一个子串&#xff0c;循环右移一位。在任意一个位置插入一个任意括号。 求一个括…...

Vue+springboot医院住院挂号登记收费系统7ui9s

医院信息管理系统的开发过程中&#xff0c;采用B / S架构&#xff0c;主要使用java语言进行开发&#xff0c;结合最新流行的springboot框架。使用Mysql数据库和idea开发环境。该医院信息管理系统包括用户、医生和管理员。其主要功能包括用户管理、医生管理、医生信息管理、预约…...

大前端之Koa2学习

Koa2框架介绍 Koa2是一个基于Node.js的Web框架&#xff0c;它使用了ES6的语法和async/await特性&#xff0c;使得编写异步代码更加简单和优雅。Koa2的核心思想是中间件&#xff0c;它允许开发者将应用程序拆分成小的、可重用的部分&#xff0c;从而使得代码更加模块化和易于维…...

Qml实现Dock浮动、停靠功能

纯Qml实现Dock浮动、停靠功能 效果展示github地址:介绍环境Demo代码参数说明API说明 效果展示 Qml Dock效果演示 github地址: https://github.com/longtwilight/QmlDock 介绍 这是一个使用纯qml实现的Dock组件&#xff0c;它支持停靠、浮动、窗体分离、窗体独立、大小调整等…...

最新版本 Stable Diffusion 开源 AI 绘画工具之微调模型篇

✨ 目录 &#x1f388; 模型种类&#x1f388; 变分自动编码器 / VAE&#x1f388; 美学梯度 / Aesthetic Gradients&#x1f388; 大型语言模型的低阶自适应 / LoRA&#x1f388; 超网络模型 / Hypernetwork&#x1f388; 微调模型 / LyCORIS &#x1f388; 模型种类 当你打开…...

路径规划算法:基于哈里斯鹰优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于哈里斯鹰优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于哈里斯鹰优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…...

Web 应用程序防火墙 (WAF) 相关知识介绍

Web应用程序防火墙 (WAF) 如何工作&#xff1f; Web应用防护系统&#xff08;也称为&#xff1a;网站应用级入侵防御系统。英文&#xff1a;Web Application Firewall&#xff0c;简称&#xff1a;WAF&#xff09;。利用国际上公认的一种说法&#xff1a;Web应用防火墙是通过执…...

docker快速部署hue+hue集成hive

首先需要安装hive&#xff0c;hive的安装在HIVE的安装与配置_EEEurekaaa&#xff01;的博客-CSDN博客 安装完成之后&#xff0c;使用脚本命令启动hdfs和hive的相关服务。 一、安装docker # 安装yum-config-manager配置工具 $ yum -y install yum-utils # 设置yum源 $ yum-co…...

基于java SpringBoot和Vue uniapp的校园信息交流小程序

随着信息社会的网络化和计算机科学的广泛普及和迅速普及应用&#xff0c;具有综合智能的我国校园信息教育网络已成为推动中小学科学教育及其实践科学发展的信息技术手段。迅速推进了信息化改革&#xff0c;改善了高校信息交流的网络环境&#xff0c;提高了信息教育平台的管理水…...

数据包伪造替换、会话劫持、https劫持之探索和测试

&#xff08;一&#xff09;数据包替换攻击 该攻击过程如下&#xff1a;伪造服务器响应客户端的数据包。监听客户端的数据包&#xff0c;用预先伪造的数据包&#xff0c;伪装成服务器返回的数据发送给客户端。 因为攻击者跟目标在同一个局域网&#xff0c;所以攻击者发送的数…...

正则表达式集合

目录 一、校验数字的表达式 1. 数字 2. n位的数字 3. 至少n位的数字 4. m-n位的数字 5. 零和非零开头的数字 6. 非零开头的最多带两位小数的数字 7. 带1-2位小数的正数或负数 8. 正数、负数、和小数 9. 有两位小数的正实数 10. 有1~3位小数的正实数 11. 非零的正整…...

Django框架中models对象转换为json的方法

在django框架中输出api接口时一般都是输出json数据但是通过orm获取的数据库数据一般都是object所以需要转换成json数据&#xff0c;一般有一下3种情况 1.models对象使用“all()”时 from django.http import HttpResponse from django.core import serializers from TestMode…...

利用Servlet编写第一个“hello world“

利用Servlet编写第一个"hello world" &#x1f50e;创建 Maven 项目&#x1f50e;引入依赖&#x1f50e;创建目录&#x1f50e;编写代码&#x1f50e;打包代码&#x1f50e;部署&#x1f50e;程序验证&#x1f50e;结尾 &#x1f50e;创建 Maven 项目 Maven 是一个构…...

python 爬虫之js逆向爬虫详解

随着网站前端技术的不断发展&#xff0c;越来越多的网站采用JS进行渲染&#xff0c;并加上了一些反爬机制&#xff0c;导致传统的爬虫技术有些力不从心。本文将为大家介绍如何进行JS逆向爬虫&#xff0c;并且不少于1000字。 一、JS逆向爬虫的介绍 JS逆向是一种分析反爬机制的…...

SpringBoot:WebSocket实现消息撤回、图片撤回

下面只是讲述一下实现思路&#xff0c;代码基本没有哈&#xff01;有时间单独发表一篇关于websocket的相关操作的博客。 1. 消息撤回、图片撤回 个人觉得关于撤回&#xff0c;需要下述几个过程&#xff1a; 发送的消息的标签上可以定义一个属性&#xff0c;这个属性的值应该是…...

输出指定日期区间内的所有天、周、月

部分方法需要依赖hutool工具包。 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>4.5.10</version> </dependency>需求&#xff1a;输出2023-04-17到2023-05-23期间所有的天、周、月。…...

Ubuntu 22.04上从零安装UCSF DOCK 6.11:手把手解决依赖与编译的那些坑

Ubuntu 22.04实战&#xff1a;UCSF DOCK 6.11完整安装指南与避坑手册在计算化学和药物发现领域&#xff0c;UCSF DOCK一直是分子对接和虚拟筛选的重要工具。最新发布的6.11版本集成了RDKit功能&#xff0c;为药物描述符计算和分子设计带来了全新可能。本文将带你在Ubuntu 22.04…...

3大显示难题如何解决?用ColorControl实现专业级色彩管理

3大显示难题如何解决&#xff1f;用ColorControl实现专业级色彩管理 【免费下载链接】ColorControl Easily change NVIDIA display settings and/or control LG TVs 项目地址: https://gitcode.com/gh_mirrors/co/ColorControl ColorControl是一款强大的开源工具&#x…...

3步突破微信限制:wechat-need-web插件终极使用手册

3步突破微信限制&#xff1a;wechat-need-web插件终极使用手册 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web 你是否经常遇到微信网页版无法正常使用…...

量子机器学习中的偏见:从编码到测量的系统性挑战与缓解策略

1. 量子机器学习中的偏见&#xff1a;一个被忽视的工程挑战量子机器学习&#xff08;QML&#xff09;正从理论实验室走向现实应用&#xff0c;从药物分子筛选到金融衍生品定价&#xff0c;其潜力令人兴奋。然而&#xff0c;作为一名长期关注量子算法落地的从业者&#xff0c;我…...

从哈密顿量到李代数:对称性识别与结构常数计算实践

1. 从哈密顿量到李代数&#xff1a;物理学家工具箱里的对称性语言在理论物理和数学物理的日常工作中&#xff0c;我们常常面对一个核心问题&#xff1a;如何从一堆看似复杂的运动方程或一个写出来的哈密顿量中&#xff0c;快速识别出系统隐藏的“灵魂”&#xff1f;这个灵魂&am…...

LVF时序变异分析:原理、应用与EDA工具支持

1. 什么是LVF&#xff08;Liberty Variance Format&#xff09;&#xff1f;在芯片设计领域&#xff0c;时序分析是确保电路性能符合预期的重要环节。Liberty Variance Format&#xff08;LVF&#xff09;是一种用于描述时序变异的新方法&#xff0c;它解决了传统Stage Based O…...

Unity编辑器AI增强:本地化轻量模型驱动的开发效率升级

1. 不是“接管”&#xff0c;而是编辑器能力的自然延伸&#xff1a;从Unity传统工作流说起你有没有过这样的时刻&#xff1a;在Unity里改完一段C#脚本&#xff0c;保存&#xff0c;切回编辑器&#xff0c;等几秒——然后发现Scene视图没刷新&#xff1b;再点一下Play&#xff0…...

HRN三维人脸UV对齐:Blender与Unity跨平台精准映射指南

1. 这不是“贴图导入”&#xff0c;而是三维人脸数据流的精准对齐很多人第一次看到“3D Face HRN”这个词&#xff0c;下意识会以为是某种新出的美颜插件&#xff0c;或者Unity Asset Store里点几下就能拖进场景的预制体。我去年在给一家医疗仿真团队做面部肌肉运动模拟时也这么…...

同事还在手动整理文件,我已经让 Open Claw 全自动搞定了|Windows 一键部署

⚡OpenClaw 一键安装包&#xff5c;一键部署&#xff0c;告别复杂环境配置⚡ 适配系统 Windows10/11 64 位 当前版本 2.7.5 版本&#xff08;虾壳云版&#xff09; 核心优势 全程可视化操作&#xff0c;无需命令行、无需手动配置 Python/Node.js&#xff0c;内置所有运行…...

独立开发者如何利用 Taotoken 的 Token Plan 套餐以更优成本启动 AI 项目

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 独立开发者如何利用 Taotoken 的 Token Plan 套餐以更优成本启动 AI 项目 对于独立开发者或小型工作室而言&#xff0c;在项目启动…...