• 栈实例(1):符号匹配


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

  • 相关阅读:
    Android事件机制之一:事件传递和消费
    数据类型和JSON格式
    json 数据交换格式与java
    写给iOS程序员的命令行使用秘籍
    pthread_create线程创建的过程剖析
    同步变量及知识要素
    mysql 批量更新与批量更新多条记录的不同值实现方法
    gettype
    寻求全站搜索功能开发思路
    DEDE中 field:rel 是什么意思,起一个什么样的作用效果
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9411625.html
Copyright © 2020-2023  润新知