思路:{{}[()()][]}
扫描整个括号序列:
1、遇到左括号(无论是哪种),入栈
2、遇到右括号,则需要进行判断:
(1)栈是否为空。为空,则返回缺少对应的左括号;
(2)如果非空,则弹出左括号
(3)对弹出的左括号进行检查,看是否与右括号匹配,这里是个小技巧,代码如下:
def matched(open,close):
opens = '([{'
closes = ')]}'
return opens.index(open) == closes.index(close)
(4)如果匹配,则继续扫描
3、扫描结束,检查栈内是否还有左括号,如果有,则是缺少右括号。
完整代码如下:
# 导入自定义stack模块
import stack
# 创建一个栈对象symbol_stack
symbol_stack = stack.Stack()
# 定义函数parchecker,输入参数为symbols(待检查的符号序列),left_pattern(左括号模式),right_pattern(右括号模式)
def parchecker(symbols, left_pattern, right_pattern):
# 遍历符号序列symbols
for symbol in symbols:
# 如果当前符号属于左括号模式,则压入栈
if symbol in left_pattern:
symbol_stack.push(symbol)
# 否则,若栈为空,直接返回缺失的对应左括号
else:
if symbol_stack.isEmpty():
return f'{left_pattern[right_pattern.index(symbol)]} missed!'
# 否则弹出栈顶元素进行匹配
else:
top = symbol_stack.pop()
# 若栈顶元素与当前符号不匹配,则返回“not match!”
if not matched(top, symbol):
return f'not match!'
# 遍历结束后,若栈为空,说明所有括号都已成功匹配
if symbol_stack.isEmpty():
return f'{symbols}, perfectly matched!'
# 否则,存在未匹配的左括号,返回“not match!”
else:
return f'{symbols} not match!'
# 定义辅助函数matched,判断一对括号是否匹配
def matched(open, close):
opens = '([{'
closes = ')]}'
# 根据左右括号在各自字符串中的索引是否相等判断是否匹配
return opens.index(open) == closes.index(close)
# 主程序入口,调用parchecker函数并打印结果
if __name__ == '__main__':
print(parchecker('{}}}', '([{', ')]}'))