三、数据结构之"有效的括号"

102 阅读2分钟

1.有效的括号

题目:

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

  • 有效字符串需满足:

    1. 左括号必须用相同类型的右括号闭合。
    2. 左括号必须以正确的顺序闭合。
    3. 每个右括号都有一个对应的相同类型的左括号。
  • 题目来源于力扣: leetcode.cn/problems/va…

示例1:

输入: s = "()"
输出: true

示例2:

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

示例3:

输入: s = "(]"
输出: false

题解:

  • 解题思路
    1. 对于没有闭合的左括号来说,越靠后的左括号,对应的右括号越靠前
    2. 新建一个栈
    3. 扫描字符串,遇到左括号入栈(push)
    4. 遇到和栈顶括号类型匹配的右括号就出栈------栈顶括号: 栈(数组)中的最后一位
    5. 类型不匹配直接定为不合法
    6. 最后栈空了就合法,否则就是不合法的
    7. 更加严谨一点可以判断是否为奇数,奇数则阻断执行
/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
    // 判断字符串的长度是否等于奇数,等于则停止执行
    if(s.length % 2 === 1) return false 
    // 1.新建一个栈
    const stack = [];
    // 2.通过for循环来扫描字符串的长度
    for(let i = 0; i < s.length; i += 1){
        // 3.声明变量char
        const char = s[i];  // i 作为index
        // 4. 如果遇到左括号就推入栈中
        if(char === '(' || char === '{' || char === '['){
            stack.push(char);
        } else {
            // 5. 如果遇到右括号就要判断是否和栈顶元素匹配
            // 就是获取数组最后一项
            const top = stack[stack.length - 1] 
            if(
                // 判断它和栈顶元素类型是否匹配
                (top === '(' && char === ')') || 
                (top === '{' && char === '}') || 
                (top === '[' && char === ']') 
            ){
                // 6. 类型相同则在栈中消除掉
                stack.pop();
            } else {
                return false
            }
        }
    }
    // 判断栈是否为空
    return stack.length === 0;
};
// 时间复杂度为O(n)  s.length 的长度
// 空间复杂度也是O(n)  stack可能会占用n个内存单元s.length

JS 中的函数调用堆栈

  • 典型的后进先出的例子
  • js解释器就是利用了栈数据结构控制函数的调用顺序,满足后进先出的特性
  • 下面这个例子就是 最后调用的 最先执行完 fn3
function fn1 () {
    fn2();
}
function fn2 () {
    fn3()
}
function fn3 () {}

fn1()