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; }
我试图了解堆栈如何通过代码工作。现在,我试着写了一个简单的括号匹配程序:我写了链表实现,我用它在 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; }