You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

栈实现括号平衡检测函数全返回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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 18:26:17