「算法」使用栈判断括号是否匹配 - pod4g/tool GitHub Wiki

/**
 *
 * Author: 李彦峰
 * 算法实现的思路为:遇到左括号入栈,遇到右括号出栈,到最后判断栈是否为空,为空则说明左右括号是匹配的
 * 时间复杂度为 O(n)
 *
 **/
function verify () {
    // 左括号正则
    const leftReg = /\{|\(|\[/
    // 右括号正则
    const rightReg = /\}|\)|\]/
    // 如果str是null、undefined、非字符串类型、空串、trim之后是空串、串中不含有左括号、串中不含有右括号
    // 这些情况就直接返回false
    if(
      !str
      || Object.prototype.toString.call(str).slice(8,-1)!== 'String'
      || !str.trim()
      || !leftReg.test(str)
      || !rightReg.test(str)
    ){
      return false
    }
    const stack = []
    let i = 0, n = str.length, char, top
    while( i < n ){
      char = str.charAt(i++)
      // 遇到左括号就进栈
      if(leftReg.test(char)) {
        stack.push(char)
      } else if(rightReg.test(char)) {
        // 如果遇到右括号,栈为空,说明括号的对数不匹配,直接返回
        if(stack.length === 0){
          return false
        }
        // 拿出栈顶元素
        top = stack.pop()
        if(top === '{'){
          // 当前char若不是 } 则再次入栈,否则不处理,下面同理
          if(char !== '}'){
            stack.push(top)
          }
        } else if (top === '(') {
          if(char !== ')'){
            stack.push(top)
          }
        } else if (top === '[') {
          if(char !== ']'){
            stack.push(top)
          }
        }
      }
    }
    return stack.length === 0
  }

  console.log(verify(123)) // false
  console.log(verify('  ')) // false
  console.log(verify('')) //false
  console.log(verify('(')) // false
  console.log(verify('{')) // false
  console.log(verify('[')) // false
  console.log(verify(')')) // false
  console.log(verify('}')) // false
  console.log(verify(']')) // false
  console.log(verify('([{})]')) // false
  console.log(verify('()')) // true
  console.log(verify('{}')) // true
  console.log(verify('[]')) // true
  console.log(verify('()')) // true
  console.log(verify('{}()')) // true
  console.log(verify('[]()')) // true
  console.log(verify('{([])}')) // true
  console.log(verify('([{}])')) // true
  console.log(verify('[({})]')) // true
  console.log(verify('[1,2,3,4]')) // true