LeetCode | 20.有效的括号(C语言版)

简介: LeetCode | 20.有效的括号(C语言版)

       这次来写一下 LeetCode 的第 20 题,有效的括号。

题目描述

       题目直接从 LeetCode 上截图过来,题目如下:

       上面的题就是 有效的括号 题目的截图,同时 LeetCode 给出了一个函数的定义,然后要求实现 有效的括号 的函数体。函数定义如下:

bool isValid(char* s) {
}

       从上面函数的定义来看,参数是一个字符串,字符串中保存了括号的序列。

问题分析

       这个题目是要判断括号是否前后匹配出现,解决这种问题思路是通过数据结构的 “栈” 来进行。


       我们常用的括号基本就是 小括号、中括号 和 大括号 这三种。正常情况下,写括号的时候,都会先写开始部分的 “(” 、“[” 或 “{”,然后才成对出现的 “)”、“]” 或 “}” 闭合部分。这几种形式的括号也是题目一开始就明确给出的。


       那么,当我们遇到开始部分的三种形式的括号的时候,就让它们入栈,当遇到闭合括号的时候,就取出栈顶的括号来进行匹配,如果它们是配对的,就继续取下一个括号,如果是不配对的,就说明整个括号序列写法是有误的。


       举个例子,比如给出的括号字符串是“{[]}”,我们要如何进行判断呢?如图所示。

       从图中可以看出,遇到开始的括号就入栈,遇到闭合的括号就把栈顶的拿出来进行匹配。题目中给出的示例 1、2 和 5,都可以通过此方式进行匹配,可以手动画图思考。

      如果是类似示例 3 和 4 的情况,其实也是这种方式的,用示例 4 来画图,如图所示。

     可以看到,第三个括号是一个 “)” 闭合括号,但是此时栈顶的括号是 “[”,它们是不匹配的,因此这个括号序列是无效的。

代码实现

       依据我的思路来写代码,代码还是比较简单的,代码如下:

bool isValid(char* s) {
    int len = strlen(s);
    int i;
    // 栈顶位置
    int pos = 0;
    char *pArr = (char*)malloc(len * sizeof(char));
    for (i = 0; i < len; i ++) {
        if (s[i] == '(' || s[i] == '[' || s[i] == '{') {
            pArr[pos ++] = s[i];
        }
        if (s[i] == ')') {
            if ( pos - 1 < 0 || pArr[pos - 1] != '(' ) {
                return 0;
            } else {
                pos--;
            }
        } else if (s[i] == '}') {
            if ( pos - 1 < 0 || pArr[pos - 1] != '{' ) {
                return 0;
            } else {
                pos--;
            }
        } else if (s[i] == ']') {
            if ( pos - 1 < 0 || pArr[pos - 1] != '[' ) {
                return 0;
            } else {
                pos--;
            }
        }
    }
    free(pArr);
    if ( pos != 0 ) {
        return 0;
    }
    return 1;
}

       代码不复杂,其中关键的就是 pos 变量表示的是栈顶的位置。只要遇到开始括号则入栈。如果是闭合括号则有三种可能的情况:

       第一种情况是,如果此时栈空,则说明没有和它匹配的开始括号,那么它就不是有效的括号序列;

       第二种情况是,如果栈不空,但是栈顶的开始括号与它不匹配,那么也说明它不是有效的括号序列;

       第三种情况是,栈顶的开始括号与它匹配,此时就调整栈顶的位置,因为下次再需要匹配开始括号的时候,刚才匹配过的就不再匹配了。也就是说,被匹配过的开始括号已经出栈了。

       最后循环遍历完所有的括号后,判断栈是否为空,如果全部匹配,那么栈应该是空的,如果栈不为空,说明有开始括号没有被闭合。

提交结果

       在写完 isValid 函数体后,点击右下角的 “执行代码”,然后观察 “输出” 和 “预期结果” 是否一致,一致的话就点击 “提交” 按钮。点击 “提交” 按钮后,系统会使用更多的测试用例来测试我们写的函数体,如果所有的测试用例都通过了,那么就会给出 “通过” 的字样,如果没有通过,会给出失败的那一组测试用例,我们继续修改代码。我们以上代码 “提交” 以后的截图如下:

aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy9CZnY5c21vSHd0aDVYaWJKcmZzdGlidlppY1NpYzM5Y2FxMjh3ZmFyS21Vd3hZNGFwcGNIOW83ZXJKa1Q0cHd4YnN0dU5CRVo3aWNncGliT0V3V2N0Rk1BdzNkQS82NDA.png        以上代码我认为其实可以有改进的地方,比如括号的长度如果是单数,则直接说明是无效的括号序列。malloc 申请内存空间来当作栈使用时,申请的空间是字符串长度的一半,如果超过这个长度了还要继续入栈,则说明后面的闭合括号肯定无法全部闭合掉前面的开始括号了。可以把入栈的代码放到比较闭合括号代码的后面。不过这些思路我没有挨个去测试。


       这个题目还是比较简单的,至少没有什么坑在里面。

相关文章
|
3月前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
4月前
|
程序员 C语言
【C语言】LeetCode(力扣)上经典题目
【C语言】LeetCode(力扣)上经典题目
|
4月前
|
算法 C++
Leetcode第二十二题(括号生成)
这篇文章讨论了如何使用递归算法解决LeetCode第22题“括号生成”的问题,提供了两种C++的实现方法,目的是生成所有有效的括号组合。
32 0
Leetcode第二十二题(括号生成)
|
4月前
|
存储 C++ 容器
Leetcode第二十题(有效的括号)
这篇文章介绍了如何使用栈来解决LeetCode第20题“有效的括号”问题,提供了两种方法:数组栈和容器栈,以及相应的C++代码实现。
28 0
|
6月前
|
算法
LeetCode第22题括号生成
该文章介绍了 LeetCode 第 22 题括号生成的解法,通过回溯算法生成所有可能的括号组合,在递归过程中根据左右括号数量的条件进行剪枝,从而得到有效的括号组合。
LeetCode第22题括号生成
|
6月前
|
存储 算法
LeetCode第20题有效的括号
该文章介绍了 LeetCode 第 20 题有效的括号的解法,通过分析有效括号的特征,使用栈结构存储括号关系,判断遇到右边括号时栈顶是否有匹配的左边括号,从而解决问题,同时总结了栈的先进后出结构可用于解决有规律的符号匹配问题。
LeetCode第20题有效的括号
|
6月前
|
算法 Python
【Leetcode刷题Python】括号匹配问题
一种解决括号匹配问题的Python实现方法,通过计算给定括号串的所有子串的最长合法括号子序列长度之和来确定权值。
45 0
|
6月前
|
机器学习/深度学习 Python
【Leetcode刷题Python】22. 括号生成
本文介绍了了LeetCode题目22的两种Python编程解决方案,题目要求生成所有可能的且有效的括号组合,包括暴力求解和回溯方法。
37 0
|
6月前
|
Python
【Leetcode刷题Python】20. 有效的括号
LeetCode上题目“20. 有效的括号”的Python解决方案,使用栈数据结构来验证括号序列的有效性。具体实现中,会在栈中预先放置一个特殊字符以避免在弹出操作时出现空栈错误,并通过匹配左右括号来判断括号序列是否有效。
64 0
|
8月前
|
算法 Java C语言
【经典算法】LeetCode 20:有效的括号(Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode 20:有效的括号(Java/C/Python3实现含注释说明,Easy)
65 1

热门文章

最新文章