力扣20-有效括号(多家面试题)

一道简单的关于栈的题目

C语言解法

c 复制代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int isMatch(char left, char right) {
    return (left == '(' && right == ')') || 
           (left == '{' && right == '}') || 
           (left == '[' && right == ']');
}

int isValid(char* s) {
    if (s == NULL) return 0;
    int len = strlen(s);
    if (len == 0) return 1;
    
    // 动态分配堆内存(避免栈溢出)
    char* stack = (char*)malloc(len * sizeof(char));
    if (stack == NULL) return 0; // 内存分配失败
    
    int top = -1;
    for (int i = 0; i < len; i++) {
        char c = s[i];
        if (c == '(' || c == '{' || c == '[') {
            top++;
            stack[top] = c;
        } else if (c == ')' || c == '}' || c == ']') {
            if (top == -1) {
                free(stack); // 提前释放内存,避免泄漏
                return 0;
            }
            if (isMatch(stack[top], c)) {
                top--;
            } else {
                free(stack);
                return 0;
            }
        } else {
            free(stack);
            return 0;
        }
    }
    
    int result = (top == -1) ? 1 : 0;
    free(stack); // 释放堆内存
    stack = NULL; // 置空野指针
    return result;
}

java解法

java 复制代码
class Solution {
        public boolean isValid(String s) {
        // 第四步:剪枝校验1 - 空字符串直接判定为有效(题目规则)
        if (s == null || s.length() == 0) {
            return true;
        }

        // 第五步:剪枝校验2 - 字符串长度为奇数直接返回false
        // 原因:括号必须成对出现,奇数长度必然有单个括号无法匹配,无需后续遍历
        if (s.length() % 2 != 0) {
            return false;
        }

        // 第六步:初始化栈结构,用于暂存未匹配的左括号
        // Stack<Character> 表示栈中存储的是字符类型(Character是char的包装类)
        Stack<Character> stack = new Stack<Character>();

        // 第七步:遍历字符串的每个字符(增强for循环,比普通for更简洁)
        // s.toCharArray() 将字符串转为字符数组,方便逐个遍历
        for (char c : s.toCharArray()) {

            // 第八步:处理左括号 - 遇到(、[、{直接入栈暂存
            // 原因:左括号需要等待后续对应的右括号匹配,栈的"后进先出"特性适配括号顺序
            if (c == '(' || c == '[' || c == '{') {
                stack.push(c); // push(c):将当前左括号压入栈顶
            }

            // 第九步:处理右括号) - 单独判断,避免多条件混写
            else if (c == ')') {
                // 子步骤1:栈为空 → 无对应的左括号匹配,直接返回false
                // 子步骤2:栈不为空则弹出栈顶元素,判断是否是(,不是则匹配失败
                // 注意:char强制类型转换,因为stack.pop()返回的是Object类型
                if (stack.empty() || (char) stack.pop() != '(') {
                    return false;
                }
            }

            // 第十步:处理右括号] - 逻辑和)完全一致
            else if (c == ']') {
                if (stack.empty() || (char) stack.pop() != '[') {
                    return false;
                }
            }

            // 第十一步:处理右括号} - 逻辑和)、]完全一致
            else if (c == '}') {
                if (stack.empty() || (char) stack.pop() != '{') {
                    return false;
                }
            }
        }

        // 第十二步:最终校验 - 遍历结束后栈必须为空才有效
        // 原因:栈不为空说明有未匹配的左括号(如"(()"遍历后栈剩一个()
        return stack.empty();

    }
}
相关推荐
2401_831824962 小时前
基于C++的区块链实现
开发语言·c++·算法
We་ct2 小时前
LeetCode 918. 环形子数组的最大和:两种解法详解
前端·数据结构·算法·leetcode·typescript·动态规划·取反
愣头不青2 小时前
238.除了自身以外数组的乘积
数据结构·算法
人工智能AI酱2 小时前
【AI深究】逻辑回归(Logistic Regression)全网最详细全流程详解与案例(附大量Python代码演示)| 数学原理、案例流程、代码演示及结果解读 | 决策边界、正则化、优缺点及工程建议
人工智能·python·算法·机器学习·ai·逻辑回归·正则化
WangLanguager2 小时前
逻辑回归(Logistic Regression)的详细介绍及Python代码示例
python·算法·逻辑回归
m0_518019482 小时前
C++与机器学习框架
开发语言·c++·算法
一段佳话^cyx2 小时前
详解逻辑回归(Logistic Regression):原理、推导、实现与实战
大数据·算法·机器学习·逻辑回归
qq_417695052 小时前
C++中的代理模式高级应用
开发语言·c++·算法
xiaoye-duck3 小时前
《算法题讲解指南:动态规划算法--路径问题》--5.不同路径,6.不同路径II
c++·算法·动态规划
ambition202423 小时前
最大子数组和算法全解析:从暴力枚举到动态规划优化
数据结构·c++·算法