Python用栈解决括号匹配问题

本文通过盘子堆叠的比喻解释了栈的数据结构,并详细介绍了如何使用Python的list实现栈,解决括号匹配问题。提供了两种不同实现方法的代码示例。

极客时间上王争老师说:
关于“栈”,我有一个非常贴切的例子,就是一摞叠在一起的盘子。我们平时放盘子的时候,都是从下往上一个一个放;取的时候,我们也是从上往下一个一个地依次取,不能从中间任意抽出。
后进者先出,先进者后出,这就是典型的“栈”结构。

括号匹配问题

课程中老师提到了栈在括号匹配中的应用

Python 代码实现

其实栈,不用特别去定义一个类,就用 Python 的 list 就可以了。
入栈:就用 list 的 append() 方法,添加到 list 尾部
出栈:就用 list 的 pop() 方法,从 list 尾部取出一个
这样操作跟栈的进先出,是同理的。

版本1

遇到左括号入栈,否则就从栈里面拿出来进行匹配

def isValid(s):
        stack = []
        brackets= {'{':'}','(':')','[':']'}   # 左括号当key, 右括号当value
        for ch in s:
            if ch in brackets: # 如果ch是左括号,则入栈
                stack.append(ch)
            elif not stack or ch != brackets[stack.pop()]:  # 如果ch是‘右括号’,那么用栈顶元素当值去取value,也就能找到对应的右括号;如果没有或匹配不上,失败
                return False
        return not stack   # 最后,判断stack是否为空,为空也是匹配成功

print(isValid('{()[]}'))
版本2

遇到右括号入栈,否则就从栈里面拿出来进行匹配
版本1和版本2的区别在于,括号组成的 map 的定义方式,和取元素的方式有一点点区别,具体看代码

def isValid(s):
        stack = []
        brackets= {
            '}':'{',
            ')':'(',
            ']':'['
        }   # 右括号当key, 左括号当value
        for ch in s:
            if ch not in brackets: # 如果ch不是右括号,则压栈
                stack.append(ch)
            elif not stack or brackets[ch]!=stack.pop():  # 如果ch是‘右括号’,那么栈顶元素一定可以找到与之对应的‘左括号’;如果没有,匹配失败
                return False
        return not stack   # 最后,判断stack是否为空,写法比较简洁

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

谢谢你的阅读~

题图:pixabay.com

参考资料:
极客时间:https://time.geekbang.org/column/article/41222
有效括号问题:https://www.cnblogs.com/wl413911/p/12923951.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值