变量top在for循环内外的差异解析:有效括号函数失效原因
有效括号代码的变量作用域问题解析
var isValid = function (s) { let stack = []; for (let i = 0; i < s.length; i++) { let top = stack[stack.length - 1]; if (s[i] === "(" || s[i] === "{" || s[i] === "[") { stack.push(s[i]); } else if (s[i] === ")" && top === "(" && stack.length !== 0) { stack.pop(); } else if (s[i] === "]" && top === "[" && stack.length !== 0) { stack.pop(); } else if (s[i] === "}" && top === "{" && stack.length !== 0) { stack.pop(); } else { return false; } } return stack.length === 0; };
上述代码是有效括号问题的实现,当前写法可正常运行,但如果把变量top的声明移到for循环之前,函数就无法正常工作,两种写法的核心差异如下:
循环内声明
top的逻辑:
每次进入for循环迭代时,都会重新执行let top = stack[stack.length - 1],top会实时获取当前栈的最新顶部元素。比如push左括号到栈后,下一次循环的top会更新为这个新栈顶;pop栈顶后,下一次循环的top也会同步更新为新的栈顶(或undefined,若栈为空)。循环外声明
top的逻辑:
若把top放在for循环外,只会在函数初始化时执行一次let top = stack[stack.length - 1],此时栈为空,top的值是undefined。后续整个循环过程中,top的值不会自动更新——哪怕栈因push或pop发生元素变化,top始终保持最初的undefined。
举个实际例子,输入"()"时:
- 循环内声明
top:第一次循环处理(并push进栈;第二次循环处理),此时top重新获取栈顶为(,满足条件pop栈,最终栈为空返回true。 - 循环外声明
top:第一次循环push(后,top仍为undefined;第二次循环处理)时,top === "("判断不成立,直接进入else分支返回false,导致结果错误。
本质是变量更新时机的问题:循环内的变量每次迭代都会重新初始化,确保拿到最新栈顶;循环外的变量仅初始化一次,无法跟上栈的动态变化。
内容的提问来源于stack exchange,提问作者Tomislove
相关产品推荐
相关产品推荐

