美文网首页让前端飞
JavaScript 平衡括号算法

JavaScript 平衡括号算法

作者: 贵在随心 | 来源:发表于2019-04-11 16:26 被阅读2次

    何谓平衡括号问题?
    平衡括号也叫有效括号,问题描述有很多种,看下面中的一种描述:

    给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
    有效字符串需满足:
    1、左括号必须用相同类型的右括号闭合。
    2、左括号必须以正确的顺序闭合。

    解决此问题需要借助栈的知识,如下:

    引入创建好的 Stack 类

    代码实现如下:

    // symbols 为传入的字符串
    function parenthesesChecker(symbols) {
      // 创建 Stack 类
      const stack = new Stack();
      // 左括号
      const opens = '([{';
      // 右括号
      const closers = ')]}';
      let balanced = true;
      let index = 0;
      let symbol;
      let top;
    
      while (index < symbols.length && balanced) {
        symbol = symbols[index];
        // 左括号入栈待匹配
        if (opens.indexOf(symbol) >= 0) {
          stack.push(symbol); 
        } else if (stack.isEmpty()) {
          balanced = false;
        } else {
          // 遇到右括号,出栈匹配
          top = stack.pop();
          if (!(opens.indexOf(top) === closers.indexOf(symbol))) {
            balanced = false;
          }
        }
        index++;
      }
      // 剩下未匹配的左括号,一定是无效的
      return balanced && stack.isEmpty();
    }
    
    // test
    console.log('([])', parenthesesChecker('([])'));    // ([]) true
    console.log('{([])}', parenthesesChecker('{([])}'));    // {([])} true
    console.log('(([()])))', parenthesesChecker('(([()])))'));    // (([()]))) false
    console.log('([()[]()])()', parenthesesChecker('([()[]()])()'));    // ([()[]()])() true
    

    平衡(有效)括号问题有很多的变形描述,这只是一种,这里的解决思路也是JavaScript 的方式,其他的描述方式解决方法也不一样,这里只是提供一个解决思路作为参考。

    相关文章

      网友评论

        本文标题:JavaScript 平衡括号算法

        本文链接:https://www.haomeiwen.com/subject/rhztwqtx.html