If 语句执行除 return 语句之外的所有内容

If-statement executes everything but return-statement

我试图了解堆栈如何通过代码工作。现在,我试着写了一个简单的括号匹配程序:我写了链表实现,我用它在 JS 中实现了栈。这个想法是遍历字符串中的所有字符并将左括号放入堆栈中。在此之后,如果顶部括号没有匹配的括号,函数应该 return false。主要问题是,if 语句执行除 return 语句之外的所有内容。

输入:([(a()]])

期望的输出:false

function isBalanced(string) {
  let stack = new Stack();
  [...string].forEach(char => {
    let bracket
    if (char === '[' || char === '(') {
      stack.push(char)
    } else {
      if (stack.isEmpty()) {
        return false
      }

      bracket = stack.pop().data
      console.log(`PAIR: ${bracket}${char}`)
      if (!(bracket === "[" && char === "]") && !(bracket === "(" && char === ")")) {
        console.log("working")
        return false
      }
    }});

    return stack.isEmpty();
}

let string = '([(a()]])'

console.log(isBalanced(string))

我已经使用 console.log() 检查我的语句是否有效以及它在哪些对上有效。

控制台中的输出如下所示:

PAIR: (a
working
PAIR: ()
PAIR: []
PAIR: (]
working
true

如你所见,当语句为真时,它肯定可以工作,但它不会调用内部 return 语句(在第一个 'working' 输出之后,应该没有更多的对在控制台中;只是 false)。问题出在哪里?

您可以使用 Array#every 以及堆栈的长度检查和 return 回调内部的每个正确字符 true

function isBalanced(string) {
    const
        closed = { '(': ')', '[': ']' },
        stack = [];
    return [...string].every(char => {
        if (char === '[' || char === '(') {
            stack.push(char);
            return true;
        }
        if (!stack.length) return false;
        const bracket = stack.pop();
        console.log(`PAIR: ${bracket}${char}`);
        return closed[bracket] === char;
    }) && !stack.length;
}

console.log(isBalanced('(([()]))'));
console.log(isBalanced('([(a()]])'));
.as-console-wrapper { max-height: 100% !important; top: 0; }