代码随想录算法训练营第11天 | 20. 有效的括号, 1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值

简介: 代码随想录算法训练营第11天 | 20. 有效的括号, 1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值

20. 有效的括号

代码

class Solution {
public:
    bool isValid(string s) {
        stack<char>s_s;
        //返回条件:
        //1 遍历结束 栈不为空 返回false,因为符号与栈顶匹配的都被pop出了
        //2 遍历途中栈为空,待插入字符为括号右边符号则直接返回false;一开始就是右边符号肯定是错误的
        //3 遍历途中栈不为空,符号不等于栈顶值且是括号右边值则直接返回 false;同理等待插入的符号为符号左边那一定是错误的,因为括号位置左右反了。
        for(int i = 0;i< s.size();++i){
            char val = s[i];
                if(!s_s.empty() && val==s_s.top()){
                    s_s.pop();
                }else{
                    switch (val){
                        case '(' : s_s.push(')');break;
                        case '[' : s_s.push(']');break;
                        case '{' : s_s.push('}');break;
                        default :return false; //栈为空且字符为括号右边,直接返回false;
                    }
                }
        }
        return s_s.empty();
    }
};

思路

使用栈先入后出的属性可以实现,栈插入的字符全部是括号右边。

1 栈为空的情况下要插入的字符是左边括号则直接返回false;因为一开始的插入了左侧括号后面是无法在括号规则正确的情况下弹出括号的。如“)(”,遍历找到了‘)’则要插入的符号为‘(’,显然这是不可以的。

2 栈不为空的情况下栈顶值不等于当前遍历的字符,且字符为右边括号,直接返回false;因为栈顶值不等于当前被遍历的字符,则说明当前括号的右边括号是准备被插入的字符,如果括号本身已经是右边字符则无法插入,说明该括号是一个不配对的字符。如“{ } { ) }”‘{’插入的是‘}’,‘}’与栈顶值‘}’相等

所以pop掉,同样地,第三个字符‘{’要插入栈顶的是‘}’,‘)’不等于栈顶部值,则‘)’会被作为一个要插入栈顶的字符,但是如果插入了则后面就不会有右边字符与其匹配,所以不能插入,字符串括号不匹配。

3 遍历结束后栈为空则返回ture,否则返回false;

难点

上述三点一开始不太好想到。

总结

简单题。主要加深对栈的使用。

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

代码

class Solution {
public:
    string removeDuplicates(string s) {
        string res;
        for(char val :s){
            if(!res.empty() && val == res.back()){
                res.pop_back();
            }else{
                res.push_back(val);
            } 
        }
        return res;
    }
};

思路

采用栈的思想,遍历字符,如果栈内的字符和当前字符相等则将其弹出,继续下一层遍历,直到所有字符都遍历完成,栈内剩下的字符就是不相邻的字符,将其反转就可以得到结果

难点

不难

总结

也是考察对栈的使用

150. 逆波兰表达式求值

代码

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<long long> number;
        for(string val : tokens){
            if(val == "+"||val=="-"||val=="*"||val=="/"){
            long long res1  = number.top();
            number.pop();
            long long res2 = number.top();
            number.pop();
            if(val == "+") number.push(res2 + res1);
            if(val == "-") number.push(res2 - res1);
            if(val == "*") number.push(res2 * res1);
            if(val == "/") number.push(res2 / res1);
            }else{ 
                number.push(stoi(val));
            }
        }
        return number.top();
    }
};

思路

遍历字符,将不等于+-*/的字符全部转换成数字存入站内,字符串的前面一定是数字字符。所以遍历到+-*/时就可以栈顶两个元素弹出,计算出结果后在插入栈顶,直到遍历结束,栈顶值就是逆波兰表达式的结果。

难点

要理解什么是逆波兰表达式。

总结

深入理解了栈这种数据结构。

参考来源

有效括号:https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B7.html

删除字符串中的所有相邻重复项:https://programmercarl.com/1047.%E5%88%A0%E9%99%A4%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E7%9B%B8%E9%82%BB%E9%87%8D%E5%A4%8D%E9%A1%B9.html

逆波兰表达式:https://programmercarl.com/0150.%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE

相关文章
|
4天前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
7天前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
15天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
18 3
|
14天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
27天前
|
存储 缓存 算法
如何通过优化算法和代码结构来提升易语言程序的执行效率?
如何通过优化算法和代码结构来提升易语言程序的执行效率?
|
28天前
|
搜索推荐
插入排序算法的讲解和代码
【10月更文挑战第12天】插入排序是一种基础的排序算法,理解和掌握它对于学习其他排序算法以及数据结构都具有重要意义。你可以通过实际操作和分析,进一步深入了解插入排序的特点和应用场景,以便在实际编程中更好地运用它。
|
20天前
|
缓存 分布式计算 监控
优化算法和代码需要注意什么
【10月更文挑战第20天】优化算法和代码需要注意什么
16 0
|
22天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
7天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
8天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。