用栈来实现简单的括号匹配问题。主要包含圆括号、方括号和花括号。
当前闭括号应该与前面最近的尚未配对的开括号进行匹配,下一个闭括号应该与前面次近的括号进行匹配。这恰恰符合后进先出的的原则。如果一个开括号已经匹配,则将其删除,为随后的匹配做准备。
class StackUnderflow(ValueError): pass class SStack(): def __init__(self): self.elems = [] def is_empty(self): return self.elems == [] def top(self): if self.elems == []: raise StackUnderflow('in SStack.top()') return self.elems[-1] def push(self, elem): self.elems.append(elem) def pop1(self): if self.elems == []: raise StackUnderflow('in SStack.pop()') return self.elems.pop() def check_parens(text): """ 括号匹配检查函数 """ parens = '()[]{}' # 所有括号字符 open_parens = '([{' # 开括号字符 opposite = {')': '(', ']': '[', '}': '{'} # 表示配对关系的字典 def parentheses(text): """ 括号生成器 """ i, text_len = 0, len(text) while True: while i < text_len and text[i] not in parens: i += 1 # 如果不是括号字符,直接pass掉 if i >= text_len: return yield text[i], i i += 1 s = SStack() for pr, i in parentheses(text): # 对text中个括号和位置进行迭代 if pr in open_parens: # 开括号,压进栈并继续 s.push(pr) elif s.pop1() != opposite[pr]: # 不匹配则退出 print('Unmatching is found at', i, 'for', pr) return False print('All parentheses are correctly matched.') return True if __name__ == '__main__': text = '(dog] cat ' check_parens(text)