有效的括号

目录

一、题目描述

二、代码实现

三、分析


一、题目描述

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。

  2. 左括号必须以正确的顺序闭合。

  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1

输入:s = "()"

输出:true

示例 2

输入:s = "()[]{}"

输出:true

示例 3

输入:s = "(]"

输出:false

提示

  • 1 <= s.length <= 10^4

  • s 仅由括号 '()[]{}' 组成

二、代码实现

bool isValid(char * s)
{
    Stack st;
    StackInit(&st);
    int flag = 1;
    while (*s != '\0' && flag)
    {
        switch(*s)
        {
            case '(':
            case '[':
            case '{':
                // 左括号入栈
                StackPush(&st, *s);  
                break;
            case ')':
                // 如果栈非空且栈顶元素是 '(',则正确匹配
                if (!StackEmpty(&st) && StackTop(&st) == '(')  
                    StackPop(&st);
                else
                    flag = 0;
                break;
            case ']':
                // 如果栈非空且栈顶元素是 '[',则正确匹配
                if (!StackEmpty(&st) && StackTop(&st) == '[')  
                    StackPop(&st);
                else
                    flag = 0;
                break;
            case '}':
                // 如果栈非空且栈顶元素是 '{',则正确匹配
                if (!StackEmpty(&st) && StackTop(&st) == '{')  
                    StackPop(&st);
                else
                    flag = 0;
                break;
        }
        ++s;  // 走到下一个字符
    }
    bool ret = StackEmpty(&st) && flag;
    StackDestroy(&st);
    return ret;
}

三、分析

检验算法借助一个栈,每当读入一个左括号,则直接入栈,等待相匹配的同类右括号;每当读入一个右括号,若与当前栈顶的左括号类型相同,则二者匹配,将栈顶的左括号出栈,直到遇到字符串的结束标志 \0

在处理过程中,还要考虑括号不匹配的情况。例如:

  1. 当出现 (()[])) 这种情况,由于前面入栈的左括号均已和后面出现的右括号相匹配,栈已空,因此最后扫描的右括号不能得到匹配。

  2. 出现 [([]) 这种错误,当字符串扫描结束时,栈中还有一个左括号没有匹配。

  3. 出现 (()] 这种错误显然是栈顶的左括号和最后的右括号不匹配。

你可能感兴趣的:(数据结构,数据结构)