上一篇博客介绍了栈的定义以及python中关于栈的操作http://blog.csdn.net/m0_37324740/article/details/78830136。
在本篇博客中,将基于python,实现一些可以用栈思想处理的简单问题,本篇博客为简单符号的匹配。
1括号匹配
1.1单钟括号匹配
区分括号是否匹配的能力是识别很多编程语言结构的重要部分。具有挑战的是如何编写一个算法,能够从左到右读取一串符号,并决定符号是否平衡。如下图所示:
通过观察发现:
1 最近开始符号必须与下一个关闭符号相匹配
2 处理的第一个开始符号必须等待直到其匹配最后一个符号
3 结束符号以相反的顺序匹配开始符号
因此可以用栈解决问题,实现思路如下:
1 从空栈开始,从左到右处理括号字符串
2 如果一个符号是一个开始符号,将其作为一个信号,对应的结束符号稍后会出现;如果符号是结束符号,弹出栈
3 只要弹出栈的开始符号可以匹配每个结束符号,则括号保持匹配状态。如果任何时候栈上没有出现符合开始符号的结束符号,则字符串不匹配
4 最后,当所有符号都被处理后,栈应该是空的
代码如下:
from pythonds.basic.stack import Stack
def parChecker(symbolString):
s = Stack()
balanced = True
index = 0
while index < len(symbolString) and balanced:
symbol = symbolString[index]
if symbol == "(":
s.push(symbol)
else:
if s.isEmpty():
balanced = False
else:
s.pop()
index = index + 1
if balanced and s.isEmpty():
return True
else:
return False
1.2多种括号匹配
匹配和嵌套不同种类的开始和结束符号的情况经常发生。例如,在 Python 中,方括号 [ 和 ] 用于列表,花括号 { 和 } 用于字典。括号 ( 和 ) 用于元祖和算术表达式。
与单个括号匹配的区别在于必须检查确保它正确匹配栈顶部开始符号的类型,代码修改如下:
from pythonds.basic.stack import Stack
def parChecker(symbolString):
s = Stack()
balanced = True
index = 0
while index < len(symbolString) and balanced:
symbol = symbolString[index]
if symbol in "([{":
s.push(symbol)
else:
if s.isEmpty():
balanced = False
else:
top = s.pop()
if not matches(top,symbol):
balanced = False
index = index + 1
if balanced and s.isEmpty():
return True
else:
return False
def matches(open,close):
opens = "([{"
closers = ")]}"
return opens.index(open) == closers.index(close)
参考资料:《problem-solving-with-algorithms-and-data-structure-using-python》
http://www.pythonworks.org/pythonds