数据结构栈的经典OJ题【leetcode最小栈问题大剖析】【leetcode有效的括号问题大剖析】

news/2024/4/26 2:07:08/文章来源:https://blog.csdn.net/qq_63992711/article/details/129183805

目录

0.前言

1.最小栈

1.1 原题展示

1.2 思路分析

1.2.1 场景引入

1.2.2 思路

1.3 代码实现

1.3.1 最小栈的删除

1.3.2 最小栈的插入

1.3.3 获取栈顶元素

1.3.4 获取当前栈的最小值

2. 有效的括号


0.前言

本篇博客已经把两个关于栈的OJ题分块,可以根据目录跳转,并且代码已经上传至gitee可自取。

1.最小栈

155. 最小栈 - 力扣(LeetCode)

1.1 原题展示

本题需要我们设计一个栈,这个栈相对于普通的栈,有一个特异功能,可以在常数O(1)的时间复杂度下直接找到并返回,现在栈内所有元素的最小值是多少。

这个要设计的有特异功能的栈,我们称之为最小栈,本题就是要实现一个MinStack类。多了一个特异接口getMin。

1.2 思路分析

1.2.1 场景引入

我们如何实时记录当前栈的最小值呢?有人说,我们可以在MinStack类当中记录一个int _min成员,每次插入之后,我们对比一下这个_min,如果插入的数据比当前的_min更小的话,那就更新_min,这样不就可以实时记录当前最小值吗?

class MinStack {
private:stack<int> _st;int _min;
};

但是这样并不能的哦,如果你删除数据呢?如果你删除一个当前的_min值元素,那你能知道,现在删除完_min元素之后,栈的新最小值_min是什么,需要更新什么值呢?这就不知道了吧!!!

所以我们的思路是再存一个存放最小值的容器,这个容器负责存储如果每次删除完_min最小值之后,可以从这个容器当中再找到次小的_min的值

从时序角度上来说,一个栈的最小值,肯定是一浪更比一浪强,前浪被拍在沙滩上。在插入数据的过程中,一个栈内数据的最小值不断的被更新成越来越小的。相反,在删除数据的过程中,如果我们删除了现在的最小值(后浪),我们应该把曾经作为最小值的值(被拍死的前浪),作为新的最小值。

栈这个容器,是后进先出,先进后出,我们的记录的最小值:先被作为最小值(被拍死的前浪们)的元素是后出的最新一次作为最小值的元素,肯定是优先被删除的,后成为最小值的值要先出。所以我们选取栈作为记录每次最小值的容器。

class MinStack {
private:stack<int> _st;stack<int> _min_st;

1.2.2 思路

所以我们除了定义一个主栈_st存储所有插入的数据,还要定义一个最小栈_min_st,用来存储每次当前栈的最小值,始终维持这个最小栈的栈顶元素始终代表当前的最小值

如果我们在主栈当中插入一个比当前栈最小值_min,还要更小的一个数据more min,那么我们就在最小栈当中插入以记录这个更小的一个数据。而如果是一个插入更大的数据,那就没有必要动最小栈_min_st,此时最小值不变。

如果我们在主栈当中删除了当前栈的最小值,那么我们也要在最小栈进行出栈操作去除更新当前的最小值,出栈之后,那接下来最小栈的栈顶,就变成了次小的最小值,此时最小栈的栈顶仍然代表着当前栈的最小值!

1.3 代码实现

1.3.1 最小栈的删除

最小栈的栈顶数据代表当前栈内所有数据的最小值,如果删除的是当前最小值,那要顺便再对最小栈出栈,更新为次小值为最小值!

void pop() {//我们删除还要看删除的是否在现在的最小栈中int val = _st.top();if(val == _min_st.top()) //是最小栈的该元素,要删除{_st.pop();_min_st.pop();}else //不是最小栈中的元素,就可以直接出栈,然后现在min_st中的顶还是最小值{_st.pop();}}

1.3.2 最小栈的插入

插入比当前最小值更小的数据,更新入栈_min_st,或者还有一种特殊情况,如果是一个空栈,我们也要更新入栈_min_st!

如果插入比当前最小值还大的数据,那么我们就没有必要动最小栈_min_st。

而如果插入的是和当前最小值相等的数据,那么我们入不入最小栈呢?不管入不入栈,都不会影响当前栈的最小值的记录,这样看入不入的确没有太大关系。可是你想一想,如果你遇到相等最小值的时候,不入最小栈的话,在删除逻辑中,如果你删除了这个最小值,那么我们如果出栈_min_st,那此时最小栈的栈顶元素就不能代表当前栈内元素的最小值了

例如,你依次插入了 2 3 4 1 1,那最小栈从栈底到栈顶就依次是2 1,如果我要删除1,那主栈内就变为2 3 4 1,那我最小栈就会变成2,此时最小栈栈顶就不是当前栈的最小值。

所以如果插入的是和当前最小值相等的数据,也要入最小栈。

void push(int val) {_st.push(val);if(_min_st.empty()){_min_st.push(val);}else //不是空{//如果出现了更小的val,那就入栈if(val<=_min_st.top()) //相等的情况也必须入栈,不然我们删除的时候就不知道最小值在栈底还有多个的情况{_min_st.push(val);}//否则更大的val就不用入栈了}}

1.3.3 获取栈顶元素

返回主栈的栈顶。

int top() {return _st.top();}

1.3.4 获取当前栈的最小值

返回最小栈的栈顶。

int getMin() {return _min_st.top();}

2. 有效的括号

20. 有效的括号 - 力扣(LeetCode)

 就是给你一个括号序列,看看这个是否是一个有效的括号序列。那么什么是有效的括号呢?其实就是最近的一个左括号和离得它最近的右括号能够相互匹配,也可以说是一个右括号和离得它最近的左括号能够相互匹配(匹配的意思是 "(" 只能去匹配 ")" ,"{" 只能去匹配 "}" ,"[" 只能去匹配 "]" )

这里用栈结构即可很好的解决,如果遇到了左括号,那么就入栈,等待最近一个右括号的匹配(先进后出,后进先出,一定是后面的左括号先被匹配,前面的括号后被匹配,这完美的符合栈的性质),如果遇到了右括号,那么我们就出栈顶数据,即找到最近的一个左括号,进行匹配检查,如果不匹配,那就return false,如果匹配就继续检查。

转换成代码就是这样的:

bool isValid(char * s){此时就可以利用栈先进后出的特性进行判断*///遍历遇到左括号,则入栈//遍历遇到右括号,则出栈数据对右括号进行匹配//到最后遍历匹配完毕,栈为空即可【这是针对左括号多出来的情况】//【而右括号多出来的情况,则是栈中没有数据与之匹配了,此时也不是有效的括号false】//定义一个栈Stack st;StackInit(&st);//遍历字符串括号集while(*s!='\0'){//遇到左括号if(*s == '{' || *s == '[' || *s=='('){StackPush(&st,*s);}else{//遇到右括号//判断非法情况,右括号多余左括号if(StackEmpty(&st)){return false;}//出栈和右括号进行匹配int left_brace = StackTop(&st);StackPop(&st);//不匹配则false,匹配则继续遍历比较if(left_brace=='{'&&*s != '}'|| left_brace=='['&&*s != ']'|| left_brace=='('&&*s != ')'){return false;}}++s;}//判断非法情况,左括号多余右括号return StackEmpty(&st);
}

当然我们还需要想一想左右括号如果数量不匹配的情况:到最后遍历匹配完毕,如果栈为空那就是左右括号全部被匹配成功,而如果栈不为空,这是针对左括号数量多于右括号的情况;而右括号多出来的情况,则是栈中没有数据与之匹配了,此时也不是有效的括号false。

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

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

相关文章

【华为OD机试模拟题】用 C++ 实现 - 分糖果(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

Jina 3.14 版本发布!支持独立部署Executor

Jina 是一个 MLOps 框架&#xff0c;赋能开发者在云上构建多模态、跨模态的应用程序。Jina 能够将 PoC 提升为生产就绪服务。基础设施的复杂性交给 Jina&#xff0c;开发者能够直接轻松使用高级解决方案和云原生技术。&#x1f31f; GitHubhttps://github.com/jina-ai/jina/rel…

基于博客系统的测试用例

登陆界面博客预览页博客详情页博客编辑页

【华为OD机试模拟题】用 C++ 实现 - 时间格式化(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

【华为OD机试模拟题】用 C++ 实现 - 最多获得的短信条数(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 分积木(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 吃火锅(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - RSA 加密算法(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 构成的正方形数量(2023.Q1) 【华为OD机试模拟…

MATLAB绘制雷达图/蜘蛛图

雷达图/蜘蛛图 1 方法一 函数来源为MATLAB | 如何使用MATLAB绘制雷达图(蜘蛛图) 1.1 调用函数 1.2 案例 2 方法二 函数来源为MATLAB帮助-spider_plot 2.1 调用函数 语法&#xff08;Syntax&#xff09;&#xff1a; spider_plot(P)spider_plot(P, Name, Value, ...)h …

内网穿透常用方法系列总结

前言在内网渗透时&#xff0c;一个WebShell或CobaltStrike、Metasploit上线等&#xff0c;只是开端&#xff0c;更多是要内网横向移动&#xff0c;扩大战果&#xff0c;打到核心区域。但后渗透的前提是需要搭建一条通向内网的“专属通道”&#xff0c;才能进一步攻击。可实战中…

中国ETC行业市场规模及未来发展趋势

中国ETC行业市场规模及未来发展趋势编辑根据市场调研在线网发布的2023-2029年中国ETC行业发展策略分析及战略咨询研究报告分析&#xff1a;随着政府坚持实施绿色出行政策&#xff0c;ETC行业也受到了极大的支持。根据中国智能交通协会统计&#xff0c;2017年中国ETC行业市场规模…

高端装备的AC主轴头结构

加工机器人的AC主轴头和位置相关动力学特性1. 位置依赖动态特性及其复杂性2. AC主轴头2.1 常见主轴头摆角结构2.2 摆动机构3. 加装AC主轴头的作用和局限性4. 切削机器人的减速器类型5. 其他并联结构形式参考文献资料1. 位置依赖动态特性及其复杂性 However, FRF measurements …

【华为OD机试模拟题】用 C++ 实现 - 求解连续数列(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 分积木(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 吃火锅(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - RSA 加密算法(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 构成的正方形数量(2023.Q1) 【华为OD机试模拟…

【异常】导出Excel异常This archive contains unclosed entries.

一、异常说明 二、定位问题代码 一看问题&#xff0c; 上下文都是与订单相关的内容。 查询代码的使用地方&#xff0c;发现出现在这个Mybatis的select语句中 查看备注&#xff0c;发现是订单物流&#xff0c;那就没跑了&#xff0c; 肯定是商城的物流模块出了问题 那是什么地…

Gin获取Response Body引发的OOM

有轮子尽量用轮子 &#x1f62d; &#x1f62d; &#x1f62d; &#x1f62d; &#x1f62d; &#x1f62d; 我们在开发中基于Gin开发了一个Api网关&#xff0c;但上线后发现内存会在短时间内暴涨&#xff0c;然后被OOM kill掉。具体内存走势如下图&#xff1a; 放大其中一次 在…

软件测试之测试模型

软件测试的发展 1960年代是调试时期&#xff08;测试即调试&#xff09; 1960年 - 1978年 论证时期&#xff08;软件测试是验证软件是正确的&#xff09;和 1979年 - 1982年 破坏性测试时期&#xff08;为了发现错误而执行程序的过程&#xff09; 1983年起&#xff0c;软件测…

springboot+vue.js协同过滤算法之智能旅游推荐系统java

目 录 第一章 绪论 3 1.1课题背景 3 1.2课题研究的目的和意义 3 1.3 研究现状 4 1.4论文所做的主要工作 4 第二章 技术介绍 5 2.1B/S结构 5 2.2MySQL 介绍 5 2.3MySQL环境配置 6 第三章 系统分析与设计 8 3.1系统说明 8 3.2系统可行性分析…

xray API漏洞检测

一、介绍 一款功能强大的安全评估工具。国内长亭科技研发&#xff0c;xray 并不开源。目前支持的漏洞检测类型包括:XSS漏洞检测 (key: xss)SQL 注入检测 (key: sqldet)命令/代码注入检测 (key: cmd-injection)目录枚举 (key: dirscan)路径穿越检测 (key: path-traversal)XML 实…

【Linux】进程间通信(无名/有名管道及System V共享内存)

目录 一、通信的相关概念 二、管道&#xff08;半双工&#xff09; 1、管道的概念 三、匿名管道&#xff08;fork实现&#xff0c;用于父子及血缘关系进程间通信&#xff09; 1、匿名管道的使用 2、匿名管道的读写情况 3、管道的特征 4、基于匿名管道的进程池 四、命名…

【华为OD机试模拟题】用 C++ 实现 - 密室逃生游戏(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

独家 | 6个Python数据科学库正在狂飙,你一定要学来提升文化素养

作者&#xff1a;Bex T翻译&#xff1a;wwl 校对&#xff1a;张睿毅本文约3200字&#xff0c;建议阅读8分钟 计算类数据科学库&#xff0c;已经不再局限在Pandas、NumPy、Scikit-learn之内了&#xff01;动机2023年的开始&#xff0c;自然需要探索数据科学和机器学习的新趋势。…

【华为OD机试模拟题】用 C++ 实现 - 分积木(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

Web Spider Ast-Hook 浏览器内存漫游-数据检索

文章目录一、资源下载二、通过npm安装anyproxy模块三、anyproxy的介绍以及基本使用1. anyproxy的功能介绍2. anyproxy的基本使用四、给浏览器挂代理五、实操极验demo案例总结提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、资源下载 Github&#x…