代码随想录训练营 Day 11 | 栈的应用

1.成对匹配问题

        标签:经典的括号匹配检验

典例1:LeetCode 20   20. 有效的括号 - 力扣(Leetcode)

算法核心思路 检查表达式中的字符,遇到左括号入栈,遇到右括号则出栈栈顶元素与其

                          匹配,如果匹配成功则继续,否则退出。

算法分析:不匹配的三种情况:

                  1.和栈顶的左括弧不相匹配;

                  2.栈中并没有左括弧等在哪里;

                  3.栈中还有左括弧没有等到和它相匹配的右括弧。

代码实现流程:1.遇到左括号入栈; 2.遇到右括号出栈匹配;

                         3.匹配右括号时,栈提前为空(此时遍历字符串未结束),说明匹配失败;

                         4.遍历完检查栈,若栈不为空,则也说明匹配失败。

具体代码:

备注:注意事项:1.使用栈前需要初始化

                             2.出栈匹配之前必须判断栈是否为空。(细节问题)

           技巧(小tip):左括号入栈时,可直接入对应的右括号。

                                  方便元素出栈时,不做“匹配”,而做“判等”。

2.删除重复项问题

典例1:LeetCode 1047   1047. 删除字符串中的所有相邻重复项 - 力扣(Leetcode)

解法一:双指针法

备注:我解题的第一反应确实也是双指针法。

           大抵是因为这道题范围受限,重复项是相邻字符,这就使得fast和slow两个指针完全够用。

            覆盖的时候注意一下slow指针的回退条件就好,思考难度其实没有那么大。

但一般来说,栈有天然的好处在于可以回退。因此这道题用栈也是可以做的。

解法二:字符串模拟栈

联想:由此,我可能想到了一道题:删除s中与t相等的字串。

           那么如出一辙地,假设主串s为 aabb , t为ab, 那么删除后最终结果应该为空串。

           显然对于一对一的匹配问题(匹配括号/相邻字符),栈是很好用的工具,优先用栈

           但对于多于一个匹配元素的题目(如上所述),用栈还是KMP? 可能思想就不能拘泥了。

3.表达式 转化 / 求值

说明:表达式分为前缀、中缀以及后缀表达式,所谓“前中后”,其实是运算符和字符的相对位置。

           前缀表达式求值和后缀类似,一个从右往左扫描,一个从左往右扫描,因此学会后缀即可。

中缀表达式:如表达式“3*2^(4+2*2-1*3)-5”

正确的处理过程是:需要两个栈,运算对象栈s1和算符栈s2. 自左向右扫描表达式的每一个字符, 若当前字符是运算对象,则入对象栈, 如果是运算符时: 若这个运算符比栈顶运算符高,则入栈,继续向后处理, 若这个运算符比栈顶运算符低,则从对象栈出栈两个运算对象,从算符栈出栈一个运算符进行运算,并将其结果入对象栈 继续处理当前字符,如处理完则处理下一字符,直到遇到结束符。

tip: 预设一个在栈中优先级最低的左括号( , 以保证表达式中的第一个运算符总能入栈。

后缀表达式:

只需要一个栈,遇到运算对象(数字)就入栈,遇到运算符就出栈两个数字计算后再入栈。

典例1:LeetCode  150  150. 逆波兰表达式求值 - 力扣(Leetcode)

   标签:逆波兰式是典型的后缀表达式

备注: 写到这里,发现解题过程中各种语言混用。。。。。

            一方面,C语言最熟悉,但是缺少容器,解题过慢;

            另一方面,C++与C语言比较接近,运用和理解确实比较简单,

           但是,作为一个选修java的学生,java又必须要熟练。。。。。[惆怅]

           因此初步学习阶段,可能更需要侧重算法思路,代码语言方面会是次要点。

代码随想录算法训练营是一个优质的学习和讨论平台,提供了丰富的算法训练内容和讨论交流机会。在训练营中,学员们可以通过观看视频讲解来学习算法知识,并根据讲解内容进行刷题练习。此外,训练营还提供了刷题建议,例如先看视频、了解自己所使用的编程语言、使用日志等方法来提高刷题效果和语言掌握程度。 训练营中的讨论内容非常丰富,涵盖了各种算法知识点和解题方法。例如,在第14天的训练营中,讲解了二叉树的理论基础、递归遍历、迭代遍历和统一遍历的内容。此外,在讨论中还分享了相关的博客文章和配图,帮助学员更好地理解和掌握二叉树的遍历方法。 训练营还提供了每日的讨论知识点,例如在第15天的讨论中,介绍了层序遍历的方法和使用队列来模拟一层一层遍历的效果。在第16天的讨论中,重点讨论了如何进行调试(debug)的方法,认为掌握调试技巧可以帮助学员更好地解决问题和写出正确的算法代码。 总之,代码随想录算法训练营是一个提供优质学习和讨论环境的平台,可以帮助学员系统地学习算法知识,并提供了丰富的讨论内容和刷题建议来提高算法编程能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [代码随想录算法训练营每日精华](https://blog.csdn.net/weixin_38556197/article/details/128462133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值