关于栈实现括号匹配函数check_parens()判断条件的疑问
关于
check_parens()中s.pop() != '('判断的疑问解答 你的观察没错——在当前这个只处理圆括号的函数里,栈确实只会被推入'(',从逻辑上说s.pop()不可能不等于'(',这个判断看起来像是多余的。但它的存在其实是出于代码健壮性和扩展性的考虑,具体原因如下:
为扩展多类型括号预留逻辑
这个函数是括号匹配问题的基础模板,实际场景中我们经常需要处理多种括号(比如[]、{})。如果后续要扩展功能,让函数同时支持多种括号,只需要修改判断条件:遇到'['或'{'也推入栈,遇到对应的右括号时,检查弹出的元素是否为匹配的左括号。这时候s.pop() != 对应左括号的判断就成了核心逻辑,现在保留这个判断能让后续扩展更顺畅,不用重构代码结构。防御性编程,避免意外错误
虽然当前代码逻辑里栈只会存'(',但如果后续有人修改代码时出现失误(比如误推入了其他字符),或者栈的实现本身存在bug,这个判断能及时拦截异常情况,直接返回False,避免程序出现更奇怪的报错或行为。这是一种防御性编程的习惯,能让代码更稳健。保持代码与通用解法的一致性
括号匹配的通用解法逻辑里,必然包含“右括号要匹配最近的同类型左括号”的判断。当前代码保留这个判断,能让代码结构更贴近通用解法,方便其他开发者理解,也能让你在学习后续多类型括号匹配时,更容易关联到这个基础实现。
举个扩展后的例子,当我们要支持圆括号和方括号时,只需要对代码做少量修改:
def check_parens(expr): s = Stack() for c in expr: if c in '([': s.push(c) elif c == ')': if s.empty() or s.pop() != '(': return False elif c == ']': if s.empty() or s.pop() != '[': return False return s.empty()
你看,原来的s.pop() != '('判断直接就成了扩展后逻辑的一部分,完全不需要重构内层条件的结构。
内容的提问来源于stack exchange,提问作者JTruant
相关产品推荐
相关产品推荐

