上一篇博客介绍了栈的定义以及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

posted on 2017-12-22 21:28  未雨愁眸  阅读(1299)  评论(0编辑  收藏  举报