有效的括号——使用栈实现

112 阅读3分钟

力扣20 有效的括号

题目

image.png

输出示例

image.png

基本思路

首先做这个题的时候我知道要用栈实现,但是因为对题目和对栈的理解并不是很清楚,所以思路就不是很清楚。

  1. 做这个题时首先是要明确栈的后进先出的特点
  2. 然后是要明确括号不匹配的几种情况,a)左括号多;b)右括号多; c)左右括号不匹配
  3. 还要明确的是如果字符串的总个数是奇数个,一定不成功

代码的基本思路

首先要写一个get_char函数进行手动的映射,就是如果遍历的是右括号,返回的就是左括号,如果遍历的是左括号,返回的就是0;然后就进行主函数的功能实现,先计算字符串的长度,如果是奇数个,就直接返回false;然后定义一个数组,用于表示栈,定义变量top用于指向数组中的位置。接着进行遍历字符串,在里面进行if语句的判断。定义ch表示get_char函数的返回值(左括号),如果当前遍历的是左括号,则返回的是0,即ch=0,则直接就入栈,如果ch不等于0,即ch表示的是左括号,则此时遍历的是右括号,则要比较栈顶的元素是否和ch相等,相等就表示匹配,不相等就不匹配,表示的就是c中情况;还有,如果此时的栈已经为空了,就是此时字符串还没遍历完,但是栈已经为空了,说明此时右括号多。还有左括号的多的情况,就是字符串遍历结束之后,栈中还有元素,此时就只需要判断top是否等于0即可。

代码实现

char pairs(char a) {
    //如果是遍历到的是右括号,返回的是左括号
    //如果遍历到的是左括号,返回的就是0
    if (a == '}') return '{';
    if (a == ']') return '[';
    if (a == ')') return '(';
    return 0;
}

bool isValid(char* s) {
    int n = strlen(s);
    //计算字符串的长度,如果是奇数个,就一定不匹配
    if (n % 2 == 1) {
        return false;
    }
    //定义一个数组,表示栈
    int stk[n + 1], top = 0;
    //遍历字符串
    for (int i = 0; i < n; i++) {
        //ch表示的是左括号,如果此时遍历的是左括号,在pairs中并没有相应的匹配,
        //所以返回的就是0,if语句就不会执行,所以会直接入栈,入栈的是左括号
        char ch = pairs(s[i]);
        if (ch) {
            //如果此时ch表示的是左括号,然后判断栈内是否为空或者栈顶元素是否等于ch
            //栈为空,表示字符串还没遍历完,栈就为空了,表示字符串中的括号数量不匹配
            //字符串中右括号多,如果栈顶元素与ch不相等,表示括号不匹配 
            if (top == 0 || stk[top - 1] != ch) {
                return false;
            }
            //出栈
            top--;
        } else {
            //入栈
            stk[top++] = s[i];
        }
    }
    //还有一种是左括号多了偶数个,栈内还有元素,此时top是不为0的,所以返回的是false
    return top == 0;
}