栈和队列的OJ题--12.括号匹配

 12.括号匹配

20. 有效的括号 - 力扣(LeetCode)


栈和队列的OJ题--12.括号匹配_第1张图片 

解题思路:
     该题比较简单,是对栈特性很好的应用,具体操作如下:
     循环遍历String中的字符,逐个取到每个括号,如果该括号是:
        1. 左括号,直接入栈
        2. 右括号,与栈顶的左括号进行匹配,如果不匹配直接返回false
           否则继续循环
     循环结束后,如果栈空则匹配,否则左括号比右括号多肯定不匹配
bool isValid(char * s){
    // oj题目给的提示:1 <= s.length <= 104  说明s中一定是有字符串的  不考虑空串或者s为空的情况
    int size = strlen(s);
    Stack st;
    StackInit(&st);
    bool isMatch = true;
    for(int i = 0; i < size; ++i)
    {
        // 如果是左括号则入栈
        if(('(' == s[i]) || ('[' == s[i]) || ('{' == s[i]))
        {
            StackPush(&st, s[i]);
        }
        else
        {
            // 拿到的是右括号
            // 此时: 需要从栈顶获取左括号来检测是否匹配
            // 注意:一定要保证栈中有元素才可以获取栈顶元素
            if(StackEmpty(&st))
            {
                //StackDestroy(&st);
                //return false;
                isMatch = false;
                break;
            }


            char top = StackTop(&st);
            if((top == '(' && s[i] == ')') ||
               (top == '[' && s[i] == ']') ||
               (top == '{' && s[i] == '}'))
            {
                StackPop(&st);
            }
            else
            {
                // 没有匹配
                // StackDestroy(&st);
                // return false;
                isMatch = false;
                break;
            }
        }
    }


    // 如果完全匹配,则循环结束时,栈一定是空的
    // 否则说明:左括号比右括号多
    if(!StackEmpty(&st))
    {
        //StackDestroy(&st);
        //return false;
        isMatch = false;
    }


    StackDestroy(&st);
    return isMatch;
}

 

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