括号平衡算法无法检测不平衡括号,代码始终输出Success问题求助
排查括号平衡算法始终输出"success"的问题
看起来你的括号检测逻辑肯定在某个环节漏掉了关键判断,导致无论输入如何都走到了输出success的分支。我来帮你梳理下常见的错误点,再给你一个符合要求的实现参考:
常见的错误原因
- 循环结束后未检查栈是否为空:比如所有右括号都匹配了,但还有未闭合的左括号留在栈里,这时候应该返回第一个未闭合左括号的索引,但代码直接输出success了。
- 右括号匹配时未做有效性检查:比如遇到右括号时,不管栈里有没有对应的左括号,直接跳过或者错误地认为匹配,没有触发不平衡的判断。
- 括号类型匹配逻辑错误:比如把不同类型的括号(比如
(和])当成匹配的,导致错误地弹出栈,最终栈被清空输出success。 - 错误的分支逻辑:比如代码里的条件判断写反了,或者默认分支就是输出success,没有正确触发不平衡的返回。
正确的实现思路与示例代码
下面是一个符合要求的Python实现,你可以对比自己的代码找差异:
def check_balance(s): stack = [] # 定义括号匹配映射,右括号为键,对应左括号为值 bracket_map = {')': '(', ']': '[', '}': '{'} for idx, char in enumerate(s, start=1): # 索引从1开始计数 if char in bracket_map.values(): # 左括号,压入索引和括号类型 stack.append((idx, char)) elif char in bracket_map.keys(): # 右括号,先检查栈是否为空(无对应左括号) if not stack: return idx # 检查栈顶左括号是否匹配当前右括号 if stack[-1][1] != bracket_map[char]: return idx # 匹配成功,弹出栈顶 stack.pop() # 循环结束后检查栈是否还有未闭合的左括号 if stack: # 返回第一个未闭合的左括号索引(栈底元素的索引) return stack[0][0] # 所有括号都平衡 return "success" # 测试用例验证 print(check_balance("([])")) # 输出 success print(check_balance("([)]")) # 输出 3 print(check_balance("((()))")) # 输出 success print(check_balance("((())")) # 输出 1 print(check_balance("())")) # 输出 3
关键检查点
- 遇到右括号时,必须先判断栈是否为空:空栈说明没有对应的左括号,直接返回当前索引。
- 右括号和栈顶左括号的类型必须严格匹配,不能混淆不同类型的括号。
- 循环结束后一定要检查栈的状态:如果栈不为空,说明有未闭合的左括号,返回第一个左括号的索引。
- 索引计数要从1开始,
enumerate的start=1参数可以直接实现这一点。
你可以对照自己的代码,看看是不是漏掉了上面某一步的判断,比如有没有在循环结束后检查栈是否为空,或者遇到右括号时有没有正确判断匹配情况。
内容的提问来源于stack exchange,提问作者Diego Jose Quan Campos
相关产品推荐
相关产品推荐

