• 栈和队列——有效括号


    20. 有效的括号

    添加链接描述
    给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。

    有效字符串需满足:

    左括号必须用相同类型的右括号闭合。
    左括号必须以正确的顺序闭合。
    每个右括号都有一个对应的相同类型的左括号。
    在这里插入图片描述

    思路

    编辑器检查括号也是用栈检查的
    有三种错误方式

    1. 左括号多了
    2. 右括号多了
    3. 左右括号对不上

    代码

    class Solution {
    public:
        bool isValid(string s) {
            if(s.size()%2) return false;
            stack<char> st;
            for(int i=0;i<s.size();i++)
            {
                if(s[i]=='(') st.push(')');
                else if(s[i]=='[') st.push(']');
                else if(s[i]=='{') st.push('}');
                // 右边括号多了|| 左右不等 
                else if(st.empty() || s[i]!=st.top()) return false;
                else  st.pop();
            }
            // 左括号多了,括号没配对完
            if(!st.empty()) return false;
            return true;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    代码小细节

    class Solution {
    public:
        bool isValid(string s) {
            if(s.size()%2) return false;
            stack<char> st;
            for(int i=0;i<s.size();i++)
            {
                if(s[i]=='(') st.push(')');
                else if(s[i]=='[') st.push(']');
                else if(s[i]=='{') st.push('}');
                // 右边括号多了|| 左右不等 
                
                
                else if(s[i]!=st.top() || st.empty()) return false;
                // st.empty() || s[i]!=st.top() 交换了顺序,报错
                
    
                else  st.pop();
            }
            // 左括号多了,括号没配对完
            if(!st.empty()) return false;
            return true;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    if中的或判断顺序
    if(conditionA || conditionB);
    先判断A,A为真就不判断B,输出true,A为假再判断B
    代码中,交换顺序错,是因为st.top(),当栈st为空时,以为top()返回NULL,其实top()返回超尾-1,所以使用top()最好先判断empty(),本文中st.empty()有两重意思:为空,右括号多了;不为空,或中第二个开始判断(为第二个top不为空的先决条件)

  • 相关阅读:
    IDA、X32dbg逆向分析易语言程序窗口标题、宽度、高度
    数据结构与算法图论 并查集
    多线程进阶(CAS和synchronized原理)
    Spring框架(六):SpringTransaction事务的底层原理、xml配置和注解配置
    Linux C语言开发-D9输入输出
    Mycat分库分表
    常用的故障分析工具
    【ARM架构】armv8 系统安全概述
    如何下载国外硕博论文?
    vue 笔记04
  • 原文地址:https://blog.csdn.net/ljh5930/article/details/127696915