如何编写可识别不平衡括号的函数

时间:2019-10-17 14:49:23

标签: javascript function

我正在尝试编写一个检查语法是否正确的函数。如果正确,则返回“ ok”,否则返回错误的索引。到目前为止,如果错误在第一个索引或最后一个索引处,则我的代码可以正确运行。我发现困难之间发现错误。这是我的代码。

function syntaxError(syntax) {

  let arr = syntax.split('').join()
  let arr1 = [];
  let arr2 = [];
  let result;

  //Error if the first index contain a closing braces

  if (arr[0] === '>' || arr[0] === ']' || arr[0] === '}' || arr[0] === ')') {
    result = 0
  };

  if (arr === "") {
    result = 'ok'
  };

  //Error if its just a single brace

  if (arr.length === 1) {
    result = 0
  };

  //Error if the last index contain an opening braces

  if (arr.slice(-1) === '<' || arr.slice(-1) === '[' || arr.slice(-1) === '{' || arr.slice(-1) === '(') {
    result = indexOf(arr.slice(-1))
  };

  let char = arr[i];

  if (char == '[' || char == '{' || char == '<' || char == '(') {
    arr1.push(char)
  } else {
    arr2.push(char);
  }

  if (arr1.length === 0 || arr2.length === 0) {
    result = 0
  }

  if (arr1.length === arr2.length) {
    result = 'ok'

  }

  return result
}

下面的示例应返回95

('[[[[[[[[[[[[[[]]]]]]]]<<<<<<<<<<<>>>>>>>>>>>]]]]]]'+'[[[[[[[[[[[[[[]]]]]]]

<<<<<<<<<<<>>>>>>>>>>>]}]]]]' + '>')

2 个答案:

答案 0 :(得分:2)

您可以为每个开始字符的索引获取一个数组,如果找到相关的结束字符,则将其弹出。

如果完成并且堆栈中没有任何项目,则语法正常,否则返回索引或最后推送的打开字符的索引。

  

示例:

code        comment
----------- ---------------------------
[][[[]][][]
[]          balanced
  [         error, this returns later 2
   [[]]     balanced
       []   balanced
         [] balanced
            finally a missing ]

function syntaxError(syntax) {
    const
        isOpening = c => /[<[{(]/.test(c),
        isClosing = c => /[>\]})]/.test(c),
        open = { '>': '<', ']': '[', '}': '{', ')': '(' };

    var stack = [],
        index,
        finished = Array
            .from(syntax)
            .every((c, i) => {
                var temp = stack[stack.length - 1];
                if (isOpening(c)) {
                    if (temp && temp.c === c) {
                        temp.indices.push(i);
                    } else {
                        stack.push({ c, indices: [i] });
                    }
                    return true;
                }
                if (isClosing(c)) {
                    if (temp && temp.c === open[c]) {
                        temp.indices.pop();
                        if (!temp.indices.length) stack.pop();
                    } else {
                       index = stack.length ? stack.pop().indices.pop() : i;
                       return false;
                    }
                }
                return true;
            });

    return finished && !stack.length
        ? 'ok'
        : index === undefined
            ? stack.pop().indices.pop()
            : index;
}

console.log(syntaxError('[][][[{}]]'));  // ok

console.log(syntaxError(')'));
//                       0

console.log(syntaxError('[][][[{<}]]'));
//                       01234567

console.log(syntaxError('[][[[]][][]'));
//                       012

console.log(syntaxError('[[[[[[[[[[[[[[]]]]]]]]<<<<<<<<<<<>>>>>>>>>>>]]]]]]'+'[[[[[[[[[[[[[[]]]]]]]<<<<<<<<<<<>>>>>>>>>>>]}]]]]' + '>'));

答案 1 :(得分:0)

执行此操作的算法是,找到一个开始符号,将其压入堆栈(或数组,无论如何)。查找另一个开头符号,将其推入堆栈。找到与堆栈顶部匹配的结束符号,将起始符号弹出堆栈。找到与堆栈顶部不匹配的结束符号,发现一个错误。找到一个结束符号,堆栈上没有任何内容,您发现了一个错误。到最后,堆栈上仍然有符号,您发现了一个错误。