【算法系列】栈

目录

leetcode题目

一、删除字符串中的所有相邻重复项

二、比较含退格的字符串

三、基本计算器 II

四、字符串解码

五、验证栈序列

六、有效的括号

七、最小栈

八、逆波兰表达式求值

九、用栈实现队列

十、用队列实现栈


leetcode题目

一、删除字符串中的所有相邻重复项

1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/1.题目解析

删除字符串中所有相邻的重复项

2.算法分析

显然该题是要用栈,遍历字符串,当遍历到的元素和栈顶元素一样时,就让栈顶元素出栈,否则就让遍历到的元素入栈;本题如果创建一个栈,最后还要把栈的元素都依次插入到字符串中,还得逆序字符串,因此我们直接用字符串模拟栈~

3.算法代码

class Solution {
public:string removeDuplicates(string s) {string ret; //模拟栈for(auto ch : s){if(ret.size() && ch == ret.back()) ret.pop_back();else ret.push_back(ch);}return ret;}
};

二、比较含退格的字符串

844. 比较含退格的字符串 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/backspace-string-compare/1.题目解析

本质和题目一是一样的

2.算法分析

依旧是用字符串模拟栈,解法和题目是一样的~

3.算法代码

class Solution {
public:bool backspaceCompare(string s, string t) {return changeStr(s) == changeStr(t);}string changeStr(string& s){string ret;for(char ch : s){if(ch != '#') ret += ch;else {if(ret.size())ret.pop_back(); }}return ret;}
};

三、基本计算器 II

227. 基本计算器 II - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/basic-calculator-ii/1.题目解析

给定一个字符串(包含加减乘除运算), 字符串中可能有空格,求最终结果

2.算法分析

利用栈来模拟计算过程(栈+变量op)

大家可以根据下面的总结去分析一下这个例子: 4-3+6*4/2-123+34

1.遇到操作符, 更新操作符 op (开始置成'+')

2.遇到数字:

2.1 先把数字提取出来 tmp

2.2 分情况讨论,根据op的符号:

     2.2.1 op == '+',  tmp入栈

     2.2.2 op == '-',  -tmp入栈

     2.2.3 op == '*', 直接乘到栈顶元素上

     2.2.4 op == '/', 直接除到栈顶元素上

最后把栈中的所有元素加起来就可以了~

3.算法代码

class Solution {
public:int calculate(string s){vector<int> st; //数组模拟栈int i = 0, n = s.size();char op = '+';while(i < n){if(s[i] == ' ') i++; //跳过空格else if(s[i] >= '0' && s[i] <= '9') //数字字符{int tmp = 0;//提取数字while(i < n && s[i] >= '0' && s[i] <= '9') tmp = tmp * 10 + (s[i++] - '0');if(op == '+') st.push_back(tmp);else if(op == '-') st.push_back(-tmp);else if(op == '*') st.back() *= tmp;else if(op == '/') st.back() /= tmp;}elseop = s[i++];}//将栈中的所有元素加起来,就是最终结果int ret = 0;for(auto x : st)ret += x;return ret;}
};

四、字符串解码

394. 字符串解码 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/decode-string/description/1.题目解析

k[encoded_string], 表示将encoded_string重复k次,给定的字符串中可能有多个[ ], 求最终解码后字符串

2.算法分析

用双栈模拟字符串解码过程  大家可以用下面的方法去分析一下这个例子:

eg:  1 [ a 2 [ b c ] ] d e 3 [ f ]

注意:字符串栈开始放一个空字符串,就是为了 防止 放到"字符串栈"栈顶的字符串后面时栈为空而非法访问报错~

1.遇到数字:把数字提取出来, 放入"数字栈"

2.遇到 '[':把后面的字符串提取出来,放入"字符串栈"中

3.遇到 ']':  取出两栈的栈顶元素进行解析,然后放到"字符串栈"栈顶的字符串后面

4.遇到单独的字符:提取出字符串,直接放到"字符串栈"栈顶的字符串后面

遍历完题目所给字符串后,字符串栈的栈顶字符串就是最终解码结果~

3.算法代码

class Solution {
public:string decodeString(string s) {stack<int> nums;stack<string> st;st.push(""); //字符串开始放一个空串int i = 0, n = s.size();while(i < n){if(s[i] >= '0' && s[i] <= '9') //遇到数字,提取数字,放入数字栈{int tmp = 0;while(s[i] >= '0' && s[i] <= '9')tmp = tmp * 10 + (s[i++] - '0');nums.push(tmp);}else if(s[i] == '[') //遇到'[', 将'['后面的字符串提取出来,放入字符串栈{i++;string tmp;while(s[i] >= 'a' && s[i] <= 'z')tmp += s[i++];st.push(tmp);}else if(s[i] == ']') //遇到']', 取出两栈的栈顶元素,进行解析,然后将结果加入到字符串栈栈顶字符串的后面{string tmp = st.top();st.pop();int k = nums.top();nums.pop();while(k--)st.top() += tmp;i++; //跳过']'}else //遇到单独的字符串,直接提取字符串,加入到字符串栈栈顶元素的后面{string tmp;while(i < n && s[i] >= 'a' && s[i] <= 'z')tmp += s[i++];st.top() += tmp;}}return st.top();}
};

五、验证栈序列

946. 验证栈序列 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/validate-stack-sequences/description/栈的压入、弹出序列_牛客题霸_牛客网 (nowcoder.com)icon-default.png?t=N7T8https://www.nowcoder.com/practice/d77d11405cc7470d82554cb392585106?tpId=13&&tqId=11174&rp=1&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking1.题目解析

给定入栈序列,判断给定的出栈序列是否成立

2.算法分析

借助栈模拟过程即可

1.让pushed元素一直进栈

2.定义i下标遍历popped数组,进栈后判断栈顶元素是否和popped[i] 相等,相等就出栈, 同时i++

所有元素进栈完毕之后,判断 i 是否已经遍历完毕,或者判断栈是否为空即可

3.算法代码

class Solution {
public:bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {stack<int> st;int i = 0;for(auto x : pushed) {st.push(x); //让pushed中的元素一直进栈while(st.size() && st.top() == popped[i]) //判断栈顶元素与popped对应位置元素是否相等{st.pop();i++;}}//return st.empty(); return i == popped.size();}
};

六、有效的括号

20. 有效的括号 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/valid-parentheses/1.题目解析

给定一个包含三类括号的字符串,判断括号是否有效匹配

2.算法分析

用栈模拟括号匹配过程即可

1.遇到左括号,入栈

2.遇到右括号,取栈顶元素和右括号匹配,匹配失败就返回false(注意细节问题,就是当第一个字符就是右括号,栈中还没有元素,取栈顶元素会非法访问,要特殊处理一下)

当遍历完整个字符串之后,如果栈中还有元素,就返回false, 否则返回true

3.算法代码

class Solution {
public:bool isValid(string s) {int i = 0, n = s.size();stack<char> st;while(i < n){if(s[i] == '(' || s[i] == '{' || s[i] == '[') //左括号就进栈st.push(s[i]);else //是右括号就取栈顶元素{//1.开始就是右括号, 返回falseif(st.empty()) return false;//2.判断括号是否匹配char ch = st.top();st.pop();if(ch == '(' && s[i] != ')'|| ch == '{' && s[i] != '}'|| ch == '[' && s[i] != ']')return false;}i++;}return st.empty(); //如果栈中还有元素,就返回false}
};

七、最小栈

155. 最小栈 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/min-stack/description/1.题目解析

设计一个栈,支持栈的常规操作,并且能够在常数时间内检索到栈中的最小元素

2.算法分析

借助一个栈 _minst, _minst的栈顶元素保存了栈  _st 中的最小值

push: 当_minst为空 或 插入元素val <= _minst的栈顶元素时候,val插入_minst

pop: 当_st的栈顶元素 == _minst的栈顶元素时,弹出 _minst的栈顶元素

3.算法代码

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

八、逆波兰表达式求值

150. 逆波兰表达式求值 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/evaluate-reverse-polish-notation/1.题目解析

给定一个逆波兰表达式(后缀表达式), 求表达式的值

2.算法分析

逆波兰表达式(后缀表达式),该表达式可以很好的借助栈来模拟计算

1. 遇到数字,入栈

2. 遇到操作符,取出栈顶的两个元素,分别作为右操作数和左操作数,进行计算, 计算结果放入栈中

3.算法代码

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

九、用栈实现队列

232. 用栈实现队列 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/implement-queue-using-stacks/1.题目解析

用两个栈实现队列

2.算法分析

定义两个栈,pushst用于压入元素,popst用于弹出元素~

3.算法代码

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

十、用队列实现栈

225. 用队列实现栈 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/implement-stack-using-queues/description/1.题目解析

用两个队列实现栈

2.算法分析

两个队列,使用时保持一个队列为空,一个队列不为空

push: 哪个队列不为空,push到哪个队列

pop: 哪个队列不为空,哪个队列就一直pop元素到另外一个队列,直到原本不为空的队列只剩下一个元素,返回该元素并从队列中pop即可

top: 哪个队列不为空,就返回哪个队列的back()

empty: 当栈中有元素时始终有1个队列为空,1个不为空,只有两队列都为空时,栈才为空

3.算法代码

class MyStack {
public:MyStack() {}void push(int x){if(!q1.empty())q1.push(x);else q2.push(x);}int pop() {if(!q1.empty()){while(q1.size() > 1){q2.push(q1.front());q1.pop();}int top = q1.front();q1.pop();return top;}else{while(q2.size() > 1){q1.push(q2.front());q2.pop();}int top = q2.front();q2.pop();return top;  }}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;
};

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

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

相关文章

数据结构-二叉树-二叉搜索树

一、概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者具有以下性质的二叉树&#xff1a; 若它的左子树不为空&#xff0c;则左树上所有节点的值都小于根节点的值。 若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值。 它…

2024年 Java 面试八股文——SpringCloud篇

目录 1.Spring Cloud Alibaba 中的 Nacos 是如何进行服务注册和发现的&#xff1f; 2.Spring Cloud Alibaba Sentinel 的流量控制规则有哪些&#xff1f; 3.Spring Cloud Alibaba 中如何实现分布式配置管理&#xff1f; 4.Spring Cloud Alibaba RocketMQ 的主要特点有哪些&…

干货 | 嵌入式OTA升级实现原理

我曾经一个经理&#xff0c;被老板骂到狗血淋头的场景&#xff0c;还历历在目。 原因是&#xff0c;产品大批量出货了&#xff0c;发现了一个偶发性的BUG。 这意味着&#xff0c;所有卖出去的产品&#xff0c;都得退回来&#xff0c;重新烧录程序。 估计当时经理在想&#xff0…

fork后如何同步最新的代码

1.查看自己的库并添加远程源库 #查看所有远程库的url git remote -v; #添加源项目url&#xff08;upstream是自己定义的一个名字&#xff0c;可以删 git remote remove upstream&#xff09; git remote add upstream 这里替换为源项目url; #查看所有远程库的url&…

哪个牌子的电容笔好用?618五款爆款电容笔评测,不踩雷!

随着信息技术不断发展&#xff0c;iPad慢慢成为了现代年轻人工作、娱乐和学业的必备智能工具之一。然而&#xff0c;市场上涌现出众多品牌的电容笔&#xff0c;也存在着大量低质量的电容笔产品。这些产品往往无法达到预期的书写和绘画效果&#xff0c;反而可能导致用户体验不佳…

AI适老化!10秒一张的AI姓氏头像,居然要卖9块9?中老年用户都说好!

看短视频的你&#xff0c;一定会刷到过这样的直播间&#xff1a; 现在大家明白了&#xff0c;这是一个做姓氏图像的直播间。我刚开始刷到的时候也觉得这种头像好看&#xff0c;高大上&#xff0c;也想做一个这样的图像&#xff0c;来当自己的微信头像。 做这样的图像需要排队刷…

电脑提示msvcr100.dll丢失?五种msvcr100.dll丢失的解决方法

在使用电脑的过程中&#xff0c;我们可能会遇到各种各样的问题。其中&#xff0c;msvcr100.dll丢失是一个常见的问题。这个DLL文件是Microsoft Visual C 2015 Redistributable的一部分&#xff0c;它提供了许多重要的功能&#xff0c;包括一些运行时间库。当此DLL文件丢失时&am…

Android Kernel源码下载方法

Android Kernel的源码是git管理的&#xff0c;和之前下载的Android源码管理方式不一样&#xff0c;所以下载方式也不一样&#xff0c;直接用git下载就可以了&#xff1b;去网上搜的下载方式五花八门&#xff0c;有很多问题&#xff0c;因为服务器经常无法访问&#xff0c;也一直…

拼多多商品详情API返回值全解析

关键数据指标 成长层级&#xff1a;根据店铺近30天交易额、店铺领航员&#xff0c;综合评估得出店铺所处的成长层级 店铺综合体验星级&#xff1a;以领航员综合分为数据基础&#xff0c;同时结合店铺活跃度、行业特色服务(特色服务要求根据行业特色调整)&#xff0c;形成的店铺…

武王伐纣时杀死一位商朝大将,八百年后其子孙复仇推翻周朝

大约在公元前1046年&#xff0c;周武王率领大军征讨商朝&#xff0c;并在牧野之战中击溃商军&#xff0c;纣王兵败后自焚而死&#xff0c;至此商朝灭亡&#xff0c;史称“武王伐纣”。周武王进入朝歌城后&#xff0c;对商朝的旧臣进行了相关处理&#xff0c;有人“升职”了&…

河南大学大礼堂火灾事故引发安防监控对智能分析技术应用的思考

一、方案背景 2024年5月2日&#xff0c;在修缮施工期间的河南大学河南留学欧美预备学校旧址大礼堂发生火情。现场航拍画面显示&#xff0c;大礼堂经过火灾&#xff0c;房顶已经基本坍塌&#xff0c;被火烧过的建筑呈焦黑状。 公开资料显示&#xff0c;大礼堂属河南留学欧美预…

SM618卡件SM480模块和利时

SM618卡件❗电:183-6998-1851❗SM480模块和利时。自动化程度的提高&#xff0c;I/O点数大幅增 加&#xff0c;传统单一配线的方式已经无法满足发展的需 要SM618卡件SM480模块和利时。&#xff0e;对简单、可靠的配线方式的需求日益强烈&#xff0e; 传统接线 - 以并联方式连 接…

N9048B PXE EMI 测试接收机,1 Hz 至 44 GHz

​ _EMI_ N9048B EMI 测试接收机 1 Hz 至 44 GHz Keysight N9048B PXE 是一款符合标准的 EMI 测试接收机&#xff0c;配有射频预选器和 LNA 设计。其实时扫描&#xff08;RTS&#xff09;功能有助于您缩短总体测试时间&#xff0c;轻松执行无间隙的信号捕获和分析。 特点 …

pyqt 分组框控件QGroupBox

pyqt 分组框控件QGroupBox 分组框控件QGroupBox介绍效果代码 分组框控件QGroupBox介绍 QGroupBox提供了一个框架&#xff0c;用于将其他控件&#xff08;如按钮、滑块、标签等&#xff09;组合在一起。 QGroupBox 通常包含一个标题栏和一个内容区域。标题栏显示文本标签&#…

财务世界中数据叙事对于企业决策的影响力

数据叙事是财务规划与分析中一项能够改变企业管理规则、体现数据差异化的技能。它使得财务专业人士能够在企业高层的决策桌上获得一席之地。财务团队可以利用这项出色且无与伦比的技能将数据转化为可操作的业务建议。在当今这个数字化时代&#xff0c;任何值得分享的见解都可以…

ctfshow web78 获取flag(用老版的火狐浏览器)

题&#xff1a; 第一种&#xff1a;利用input伪协议 ,获取到flag ?filephp://input POST data <?php system(tac ls) ?> 第二种&#xff1a;利用flter协议,获取到flag https://21d9e58a-c0fd-47ea-a9c4-d875100f2fdb.challenge.ctf.show/?filephp://filter/readcon…

Leetcode—1652. 拆炸弹【简单】

2024每日刷题&#xff08;127&#xff09; Leetcode—1652. 拆炸弹 实现代码 class Solution { public:vector<int> decrypt(vector<int>& code, int k) {int codeSize code.size();vector<int> ans(codeSize, 0);if(k 0) {return ans;}if(k > 0)…

323_C++_QT_QProcess执行cmd解压、压缩、删除tar.gz等等其他压缩包文件到指定目录,不需要外部库,QT自带API的就行

// decompressPath : 解压到此目录 // fileName : 解压的tar.gz文件名executeCommand(decompressPath , QString::fromStdString(fileName));// 开始解压 void executeCommand

完美质量的追求:6Sigma咨询的实践指南

在竞争激烈的商业环境中&#xff0c;6Sigma这一术语正在逐渐崭露头角&#xff0c;成为众多企业追求卓越质量的重要工具。6Sigma不仅仅是一个数字或标准&#xff0c;它代表着一种对完美质量的追求与承诺&#xff0c;是企业在市场中立足的基石。 面对产品质量的不稳定与客户需求…

linux部署java服务流程案例

linux部署java服务流程案例 一 检查java环境启动jar包命令 一 检查java环境 java启动jar包命令 java -jar zdbs_hd_33333.jar