Python算法入门Day2——括号匹配

【栈的抽象数据类型——操作】

Stack() 创建一个空栈。它不需要参数,且会返回返回值

push(item) 将一个元素添加到栈的顶端。它需要一个参数item,且无返回值

pop() 将栈顶端的元素移除。它不需要参数,但会返回顶端的元素,并修改栈的内容

peek() 返回栈顶端元素,但是并不移除该元素。它不需要参数,也不会修改栈的内容

isEmpty() 检查栈是否为空。它不需要参数,且返回布尔值

size() 返回栈中元素的数目。它不需要参数,且会返回一个整数

【题目——简单括号匹配】

True: ((()))、 (()())

False:(()、 ()())

【解题思路】

1.相匹配的右括号与左括号出现的顺序相反(栈)

2.从左到右扫描,最后打开的左括号必须要匹配最先打开的右括号

3.当扫描到右括号时,删除栈顶端的左括号,如果栈中没有元素则返回False

4.如果都没有找到,返回false

【代码实现】

导入栈操作,或者直接写函数

python导入栈from pythonds.basic.stack import Stack 报错问题_m0_48936146的博客-CSDN博客【原因】没有导入栈包的问题,程序获取不到【解】1.首先在需要导入栈的目录下创建一个pythonds文件夹2.接着在pythonds下创建basic文件夹3.在basic目录下创建一个stack.py文件4.打开py文件,将代码复制进去保存就可以了class Stack: def __init__(self): self.items=[] def isEmpty(self): return self.items==...https://blog.csdn.net/m0_48936146/article/details/123504223?spm=1001.2014.3001.5501

#栈的应用:简单括号匹配
'''
1.每个开括号要恰好对应一个闭括号
2.每对开括号要正确对嵌套
    True:(()()())
    False:(((())
解题
从左到右扫描括号串==》最后打开的左括号必须要匹配最先打开的右括号
(次序反转)
'''

from pythonds.basic.stack import Stack#导入栈

def parChecker(n):
    s=Stack()
    balanced=True #表示匹配成功
    index=0 #下标
    while index<len(n) and balanced:
        i=n[index]
        if i=="(":
            s.push(i)
        else:#右括号
            if s.isEmpty(): #查找有没有左括号,栈是否为空
                balanced=False
            else:
                s.pop()#删除栈中最上面的'('
        index+=1
    if balanced and s.isEmpty():
        return True
    else:#都没有找到
        return False
print(parChecker('((()))()()'))#True
print(parChecker('((((())'))#Fals

【题目——复杂括号匹配】

True:{{([])}}  []{}

False:([)] ((()])) [{()

比起简单括号匹配,增加了[]、{}

只要在简单括号匹配上增加一点即可

1.首先需要定义一个函数函数,判断左括号是否一致

2.将简单匹配中判断i是否等于"("改为是否等于"({["

3.利用上面写的函数判断栈顶的左括号是否与右括号匹配

【代码实现】

#多种括号匹配
'''
True:{{([])}}  []{}

False:([)] ((()])) [{()]

只需要在通用的括号匹配上修改就可以
1.碰到各种左括号依然入栈
2.碰到各种右括号的时候需要判断栈顶的左括号是否跟右括号同个类型

'''

from pythonds.basic.stack import Stack #导入栈包

#定义一个函数,判断左右括号是否一致
def matches(l,r):
    left="({["
    right=")}]"
    return left.index(l)==right.index(r)

def parChecker(n):
    s=Stack()
    balanced=True #表示匹配成功
    index=0 #下标
    while index<len(n) and balanced:
        i=n[index]
        if i in "({[":
            s.push(i)
        else:#右括号
            if s.isEmpty(): #查找有没有左括号,栈是否为空
                balanced=False
            else:
                top=s.pop()#删除栈中最上面的括号
                if not matches(top,i):
                    balanced=False
                    
        index+=1
    if balanced and s.isEmpty():
        return True
    else:
        return False
print(parChecker('{{([])}}'))#True
print(parChecker('([)]'))#False

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值