【Python】括号匹配问题与栈堆放

引入

请编写一个程序,判断给定的字符串 s 中括号的写法是否合法。

条件:

  1. 字符串仅包含 ‘(’、’)’、’[’、’]’、’{’、’}’ 这三对括号的组合
  2. 左右括号必须成对编写,比如 “()” 是合法的,"(" 则是非法的
  3. 左右括号必须以正确的顺序闭合,比如 “{()}” 是合法的,"{(})" 则是非法的

看到这道题首先有点懵逼,但只要顺着思路想,很快就能得到程序

解决第一个问题:如何判断两组括号是否叠加(即 [{]} )?

我们可以这样解决,先逐个读入s字符串,放在一个数组中,如果是左边的括号则不做处理,关键是如何处理右括号,其实只要将读到的右括号与我们创的数组里面最后一个括号相匹配,如果匹配成功,就删除数组中最后一个数组,都下一个字符,如果不匹配,直接输出非法即可

如果你稍微接触一下数据结构,你就会神奇的发现这个我们所建的数组就是一个栈结构(初学者也不要紧,我会详细讲解)

所谓的栈结构,也就是一种先进后出的数据结构。打个比方,比如有一个很长的非常狭窄的过道,一次只能有一个人移动,那么你分别叫小a,小b,小c,小d依次进入。现在你说,“小d,给我出来!”那么小d能直接从末尾出来,但你要想让小b出来,那么小d,小c要依次出来之后,小b才能出来。反观我们上面的数组,每次比较最后一个,就会神奇的发现,这就是一个栈结构。
其实很多地方都用到了栈结构,比如忍3里面祝融蓄力存的箭就采用了栈堆积。

还有一个小小的问题:如果字符串s的第一个括号就是右括号怎么取出我们所建的数组进行判断,这时如果还按上面的程序,就会判错,所以我们特判一下就ok了

最终程序:

a=[]
pd=True
s=input("请输入测试字符串:")
for each in s:
    if each=="(" or each=="[" or each=="{":
        a.append(each)
    else:
        if not len(a):
            print("非法T_T")
            pd=False
        elif a[len(a)-1]=="("and each==")":
            a.pop(len(a)-1)
        elif a[len(a)-1]=="["and each=="]":
            a.pop(len(a)-1)
        elif a[len(a)-1]=="{"and each=="}":
            a.pop(len(a)-1)
        else:
            print("非法T_T")
            pd=False
if pd:
    print("合法^o^")

a就是我创建的数据结构,pd是用来判断是否是合法字符串

append用来读入左括号,当判断匹配时,就可以利用pop删除数组中最后一个左括号

如果你说这个判断方式实在太垃圾,这还有个略微高级一点的for else结构

a=[]
s=input("请输入测试字符串:")
for each in s:
    if each=="(" or each=="[" or each=="{":
        a.append(each)
    else:
        if not len(a):
            print("非法T_T")
            break
        elif a[len(a)-1]=="("and each==")":
            a.pop(len(a)-1)
        elif a[len(a)-1]=="["and each=="]":
            a.pop(len(a)-1)
        elif a[len(a)-1]=="{"and each=="}":
            a.pop(len(a)-1)
        else:
            print("非法T_T")
            break
else:
    print("合法^o^")

如果还有什么疑问,欢迎评论,博主看见会回复

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值