括号匹配
从空栈开始,从左到右处理括号字符串。如果一个符号是一个开始符号,将其作为一个信号,对应的结束符号稍后会出现。另一方面,如果符号是结束符号,弹出栈,只要弹出栈的开始符号可以匹配每个结束符号,则括号保持匹配状态。如果任何时候栈上没有出现符合开始符号的结束符号,则字符串不匹配。最后,当所有符号都被处理后,栈应该是空的。
在 Python 中,方括号 [ 和 ] 用于列表,花括号 { 和 } 用于字典。括号 ( 和 ) 用于元祖和算术表达式。只要每个符号都能保持自己的开始和结束关系,就可以混合符号。。符号字符串如
{ { ( [ ] [ ] ) } ( ) }
[ [ { { ( ( ) ) } } ] ]
这些被恰当的匹配了,因为不仅每个开始符号都有对应的结束符号,而且符号的类型也匹配。相反这些字符串没法匹配:
( [ ) ]
[ { ( ) ]
from python_basic_stack.stack_definition import Stack def matches(open, close): # top symbol opens = "([{" closers = ")]}" # 对比下标位置是否相同 return opens.index(open) == closers.index(close) # 定义一个符号匹配函数 def symbolmatch(symbolString): # 初始化一个栈 s = Stack() balanced = True # 初始下标 index = 0 # 遍历symbolString {{([][])}()} [{()] while index < len(symbolString) and balanced: symbol = symbolString[index] if symbol in "([{": s.push(symbol) else: print(s.list1()) if s.isEmpty(): balanced = False else: # 输出栈顶 top=s.peek() print(top) s.pop() if not matches(top, symbol): balanced = False index += 1 if balanced and s.isEmpty(): return True else: return False print(symbolmatch('{{([][])}()}')) print(symbolmatch('[{()]'))