栈实现括号平衡检测函数全返回True的问题排查
括号平衡检测问题排查:栈长度始终不为0的原因及修复
你的问题核心是栈元素从未被正确移除,导致所有测试用例误返回True。以下是最常见的三个错误点及修复方案:
1. 自定义Stack类的pop方法实现错误
很多人实现pop时只返回栈顶元素,却没有从栈中删除它,导致栈内元素持续累加,长度永远不会减少。
- 错误示例:
def pop(self): if self.is_empty(): return None return self.items[-1] # 仅返回栈顶,未删除元素 - 正确实现:
def pop(self): if self.is_empty(): return None return self.items.pop() # 调用list的pop()删除并返回最后一个元素
2. 右括号匹配时未执行弹出操作
遇到匹配的右括号时,没有调用pop()移除对应的左括号,导致栈内左括号一直残留。
- 错误逻辑:
if char == ')': if stack.peek() == '(': continue # 仅判断匹配,未弹出元素 - 正确逻辑:
if char == ')': if stack.is_empty() or stack.peek() != '(': return False stack.pop() # 匹配成功,弹出栈顶左括号
3. 函数末尾未检查栈是否为空
即使所有右括号都匹配,但如果输入字符串左括号数量多于右括号(比如"((("),栈内会残留元素,此时必须返回False。如果直接返回True,就会误判。
- 错误结尾:
return True - 正确结尾:
return stack.is_empty()
完整可运行代码示例
class Stack: def __init__(self): self.items = [] def is_empty(self): return len(self.items) == 0 def push(self, item): self.items.append(item) def pop(self): if self.is_empty(): return None return self.items.pop() def peek(self): if self.is_empty(): return None return self.items[-1] def is_balanced(s): stack = Stack() # 用字典映射右括号到对应左括号,简化匹配逻辑 bracket_map = {')': '(', '}': '{', ']': '['} for char in s: # 左括号入栈 if char in bracket_map.values(): stack.push(char) # 右括号处理 elif char in bracket_map.keys(): # 栈为空或栈顶不匹配,直接返回False if stack.is_empty() or stack.peek() != bracket_map[char]: return False # 匹配成功,弹出栈顶左括号 stack.pop() # 最后必须检查栈是否为空,确保所有左括号都有对应的右括号 return stack.is_empty() # 测试用例及预期结果 test_cases = [ ("()[]{}", True), ("([)]", False), ("{[]}", True), ("((())", False), ("((()))", True), ] for case, expected in test_cases: result = is_balanced(case) print(f"用例 '{case}':结果={result},预期={expected} {'✅' if result == expected else '❌'}")
运行上述代码后,测试用例将返回正确的True/False结果,栈长度也会在匹配完成后正确归零。
内容的提问来源于stack exchange,提问作者Tchaly Leandre Jr.
相关产品推荐
相关产品推荐

