【发布时间】:2022-01-02 17:22:41
【问题描述】:
我试图了解堆栈是如何通过代码工作的。现在,我尝试编写一个简单的括号匹配程序:我编写了链表实现,并用它在 JS 中实现堆栈。这个想法是遍历字符串中的所有字符并将开括号放入堆栈中。在此之后,如果没有匹配的顶括号,函数应该返回 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
正如你所看到的,当语句为真时,它肯定是有效的,但它不会调用内部返回语句(在第一个'working' 输出之后,控制台中应该没有更多的对;只有false) .问题出在哪里?
【问题讨论】:
-
.forEach()方法会忽略其回调函数的所有返回值。因此,.forEach()回调中的return基本上是无用的。 -
@Pointy 谢谢!将
.forEach()更改为for (let char in string)有帮助! -
'a'是什么,你要忽略它吗? -
@NinaScholz 是的,我想忽略
a,我认为它工作得很好
标签: javascript stack