基于栈ADT实现Python的balanced_brackets函数:括号匹配求助
解决括号匹配问题:完善你的balanced_brackets函数
看起来你已经选对了核心思路——用栈来处理括号匹配绝对是这类问题的最优解!咱们来补全你的代码,解决那些你可能卡壳的点。
首先,先明确咱们的需求:
- 只关心
(、)、<、>这四种符号,其他字符直接忽略 - 左括号必须和对应的右括号按顺序匹配,不能交叉或不对应
- 最终所有左括号都要有对应的右括号,反之亦然
第一步:补全Stack类(如果还没实现的话)
Python标准库没有自带的Stack类,所以咱们需要先实现一个简单的版本,包含必要的push、pop和is_empty方法:
class Stack: def __init__(self): self.items = [] def push(self, item): self.items.append(item) def pop(self): if not self.is_empty(): return self.items.pop() # 如果栈为空时调用pop,返回None标记异常 return None def is_empty(self): return len(self.items) == 0
第二步:完善balanced_brackets函数
现在基于你已有的代码框架,补全逻辑:
def balanced_brackets(text): s = Stack() balanced = True index = 0 # 定义括号匹配映射,快速查找对应关系 bracket_pairs = {')': '(', '>': '<'} while index < len(text) and balanced: symbol = text[index] # 遇到左括号,压入栈 if symbol in "(<": s.push(symbol) # 遇到右括号,检查匹配情况 elif symbol in ")>": # 栈为空说明没有对应左括号,直接不匹配 if s.is_empty(): balanced = False else: top = s.pop() # 检查弹出的左括号是否和当前右括号匹配 if top != bracket_pairs[symbol]: balanced = False # 其他字符直接忽略,无需处理 index += 1 # 循环结束后必须检查栈是否为空(避免有未闭合的左括号) return balanced and s.is_empty()
代码关键点解释
- 括号映射字典:用
bracket_pairs存储右括号到左括号的对应关系,比多个if判断更简洁高效 - 右括号处理逻辑:遇到右括号时先判断栈是否为空(空栈意味着没有对应左括号),再弹出栈顶元素检查匹配性
- 最终栈检查:循环结束后必须确认栈为空——如果还有剩余元素,说明存在未闭合的左括号,依然不匹配
测试用例验证
你可以用这些例子测试函数是否正常工作:
balanced_brackets("((<>))")→ 返回True(完全匹配)balanced_brackets("(()>")→ 返回False(括号类型不匹配)balanced_brackets("a(b<c>d)e")→ 返回True(忽略其他字符,括号匹配)balanced_brackets(")<")→ 返回False(右括号在前,无对应左括号)balanced_brackets("(<")→ 返回False(有未闭合的左括号)
内容的提问来源于stack exchange,提问作者hpotter054
相关产品推荐
相关产品推荐

