数据结构与算法python第九天

栈的应用

简单括号匹配

  • 类似于这样的表达式:(5+6)*(7+8)/(4+3)
  • 有些函数语言,如Lisp,在函数定义的时候会用到大量的括号
    比如: (defun square(n)
    (* n n))
    这个语句定义一个计算平方值的函数
  • 括号遵循“平衡”规则
  • 对括号是否正确匹配的识别是很多语言编译器的基础算法

构造括号匹配识别算法

  • 从左到右扫描括号串,最新打开的左括号,应该匹配最先遇到的右括号
  • 次序反转识别,符合栈的特性
    算法流程图
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

print(parChecker('((()))'))
print(parChecker('(((()))'))

更多括号匹配

  • ()、{}、[],分别是列表、字典、元组和表达式
  • 混合使用,注意开闭
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()  #删除
                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 = "([{"   #matches匹配
    closer = ")]}"
    return opens.index(open) == closers.index(close)


print(parChecker('{{([][])}()}'))
print(parChecker('[{()]'))

通用括号匹配算法

  • HTML/XML文档有类似于括号的开闭标记,这种层次结构化文档的校验、操作也可以通过栈来实现
    在这里插入图片描述

计算机领域的任何问题都可以通过增加一个间接的中间层来解决

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leopold·Lin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值