Leetcode20 —— 有效的括号(栈解法)

目录

题目:

解题思路:

代码:

代码细节注意:

题目:

解题思路:

  • 核心数据结构:利用栈「先进后出」的特性,存储未匹配的左括号;
  • 遍历匹配:遍历字符串,左括号直接入栈;遇到右括号时,若栈空(无左括号匹配)或栈顶左括号与当前右括号类型不匹配,直接判定无效,否则弹出栈顶左括号完成匹配;
  • 最终校验:遍历结束后,栈为空则所有左括号均匹配成功(有效),否则存在未匹配的左括号(无效)。

代码:

C++无注释代码:

复制代码
class Solution {
public:
    bool isValid(string s) {
        stack<char> stk;
        for(char c:s){
            if(c == '('||c == '{' || c == '['){
                stk.push(c);
            }
            else{
                if(stk.empty()){
                    return false;
                }
                char temp = stk.top();
                stk.pop();
                if(c == ')'){
                    if(temp != '('){
                        return false;
                    }
                }
                else if(c == '}'){
                    if(temp != '{'){
                        return false;
                    }
                }
                else if(c == ']'){
                    if(temp != '['){
                        return false;
                    }
                }
            }
        }
        return stk.empty();
    }
};

C++注释代码:

复制代码
// 包含栈容器的头文件(stack是C++标准库的容器,用于实现括号匹配)
#include <stack>
// 包含字符串类的头文件(处理输入的括号字符串)
#include <string>
// 使用标准命名空间,避免重复写std::前缀
using namespace std;

// 定义解题的类(LeetCode题目固定格式)
class Solution {
public:
    // 函数功能:判断输入的括号字符串是否有效
    // 参数:s - 由(){}[]组成的字符串
    // 返回值:bool类型,true=有效,false=无效
    bool isValid(string s) {
        // 1. 初始化一个char类型的栈,用于存储未匹配的左括号
        // 栈的特性:先进后出,正好匹配括号的嵌套规则(最后出现的左括号最先匹配)
        stack<char> stk;

        // 2. 遍历字符串中的每一个字符(范围for循环,C++11及以上支持)
        // c依次代表字符串中的每个括号字符
        for(char c : s){
            // 2.1 情况1:当前字符是左括号((、{、[)
            if(c == '(' || c == '{' || c == '['){
                // 左括号入栈,等待后续匹配对应的右括号
                stk.push(c);
            }
            // 2.2 情况2:当前字符是右括号()、}、])
            else{
                // 2.2.1 边界判断:栈为空但遇到右括号 → 无效
                // 说明没有对应的左括号匹配,比如输入")"或"[])"
                if(stk.empty()){
                    return false;
                }

                // 2.2.2 取出栈顶的左括号(最后入栈的左括号),准备匹配
                char temp = stk.top(); // 只获取栈顶值,不弹出
                stk.pop();             // 弹出栈顶元素(匹配后不再需要)

                // 2.2.3 按类型匹配右括号和左括号
                // 用if-else if结构:确保每个右括号只判断一次,避免无用逻辑
                if(c == ')'){
                    // 右括号是),则栈顶必须是(才匹配,否则无效
                    // 比如输入"(]",此时temp=(,c=],不匹配
                    if(temp != '('){
                        return false;
                    }
                }
                else if(c == '}'){
                    // 右括号是},则栈顶必须是{才匹配
                    if(temp != '{'){
                        return false;
                    }
                }
                else if(c == ']'){
                    // 右括号是],则栈顶必须是[才匹配
                    if(temp != '['){
                        return false;
                    }
                }
            }
        }

        // 3. 最终判断:遍历完所有字符后,栈必须为空才有效
        // 栈为空 → 所有左括号都找到了对应的右括号(比如"()[]{}")
        // 栈不为空 → 有未匹配的左括号(比如"(()"或"[{(")
        return stk.empty();
    }
};

代码细节注意:

单个char类型的字符用 ' '包裹, 如在判断 c == '(' 用" "包裹会报类型不匹配的错误,因为 " " 表示字符串常量(const char* 类型)。

相关推荐
小辉同志4 小时前
215. 数组中的第K个最大元素
数据结构·算法·leetcode··快速选择
风一样的航哥7 小时前
LeetCode 2615 等值距离和:前缀和优化O(n)解法深度解析
数据结构·算法·leetcode
khalil102010 小时前
代码随想录算法训练营Day-34动态规划03 | 01背包问题 二维、01背包问题 一维、416. 分割等和子集
数据结构·c++·算法·leetcode·动态规划·背包问题·01背包
空中海11 小时前
Redis 从零到精通:9大数据结构 × 11个高频工程实战场景完全手册
数据结构·数据库·redis
地球资源数据云12 小时前
1951-2025年中国逐年1千米逐月总降水量区域统计数据集_年表_县
大数据·数据结构·数据库·数据仓库·人工智能
cpp_250113 小时前
P2639 [USACO09OCT] Bessie‘s Weight Problem G
数据结构·算法·动态规划·题解·洛谷·背包dp
郝学胜-神的一滴13 小时前
[力扣 227] 双栈妙解表达式计算:从思维逻辑到C++实战,吃透反向波兰式底层原理
java·前端·数据结构·c++·算法
菜鸟丁小真14 小时前
LeetCode hot100 -131.分割回文串
数据结构·算法·leetcode·知识点总结
数智化精益手记局14 小时前
8d报告案例分析:拆解8d报告案例分析的8个步骤,解决生产现场重复发生的质量难题
大数据·数据结构·数据库·人工智能·精益工程
笨笨饿14 小时前
66_C语言与微控制器底层开发
linux·c语言·网络·数据结构·算法·机器人·个人开发