Python数据结构与算法基础-栈的应用-(1)括号匹配

举报
Aileen_0v0 发表于 2024/02/11 23:40:46 2024/02/11
【摘要】 ​ ​ 🌈write in front🌈🧸大家好,我是Aileen 🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流.🆔本文由Aileen_0v0 🧸 原创 CSDN首发🐒 如需转载还请通知⚠️📝个人主页:Aileen_0v0 🧸—CSDN博客🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​📣系列专栏:Aileen_0v0 🧸的数据结构与算法学习系列专栏...

 

 🌈write in front🌈
🧸大家好,我是Aileen 🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流.
🆔本文由Aileen_0v0 🧸 原创 CSDN首发🐒 如需转载还请通知⚠️
📝个人主页:Aileen_0v0 🧸—CSDN博客
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
📣系列专栏:Aileen_0v0 🧸数据结构与算法学习系列专栏 🌸 
🗼我的格言:"没有罗马,那就自己创造罗马💫~"

目录

括号与算法的关系

如何构造括号匹配识别算法

如何构造各类型括号匹配识别算法 

1.Python中 if...in和if...== 的区别

 2.括号匹配判断的区别

 3.matches函数的匹配小技巧

括号与算法的关系

我们都写过这样的表达式: ( 5 + 6 ) * ( 7 + 8 ) / ( 4 + 3 )

这里的括号是用来指定表达式项的计算优先级

但括号的使用必须遵循 "平衡" 规则

首先, 每个开阔号要恰好对应一个闭括号~ 

其次,每对开阔号要正确的嵌套~

正确的括号: ( ( ) ( ) ( ) ( ) ), ( ( ( ( ) ) ) ), ( ( ) ( ( ( ) ) ( ) ) ) 

错误的括号: ( ( ( ( ( ( ( ) ), ( ) ) ), ( ( ) ( ) ( ( )

对括号的正确匹配和识别,是很多语言编译器的基础算法

如何构造括号匹配识别算法

从左到右扫描括号串,最新打开的左括号,应和最先遇到的右括号匹配

这样,第一个左括号(最早打开),就应该匹配最后一个右括号(最后遇到)

这种次序反转的识别,正好符合栈的特性!

class Stack:#Stack---->ADT
    def __init__(self):
        self.items =[]
 
    def isEmpty(self):
        return self.items == []
 
# 满足这些属性(行为)的是栈
    def push(self,item):
        self.items.append(item)
 
    def pop(self):
        return self.items.pop()
 
    def peek(self):
        return self.items[len(self.items)-1]
 
    #
    def size(self):
        return len(self.items)
 
 
def parChecker(symbolstring):
    print(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
 
result = parChecker("(())")
print(result)
print(parChecker("(()"))

运行结果:

如何构造各类型括号匹配识别算法 

 在实际的应用里,我们会碰到更多种括号

如 Python 中 列表的方括号[], 字典的花括号{},  元组和表达式使用的圆括号().

这些不同的括号可能混合在一起使用,因此就要注意各自的开闭匹配情况.

上面我们只是匹配了括号,那如果我们要匹配多种类型的括号呢?

那我们要如何操作?

代码如下: 

# 如何给其他类型的括号进行匹配---代码如下👇

# 如何给其他类型的括号进行匹配---代码如下👇
class Stack:#Stack---->ADT
    def __init__(self):
        self.items =[]
 
    def isEmpty(self):
        return self.items == []
 
# 满足这些属性(行为)的是栈
    def push(self,item):
        self.items.append(item)
 
    def pop(self):
        return self.items.pop()
 
    def peek(self):
        return self.items[len(self.items)-1]
 
    #
    def size(self):
        return len(self.items)
 
 
def parChecker(symbolstring):
    print(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)
result = parChecker("(())}")
print(result)
print(parChecker("[()]"))

对比匹配括号和其它各种类型的括号的代码可以学习到以下几个小知识点和技巧: 

1.Python中 if...in和if...== 的区别

if...in和if...==都是Python中常见的条件语句,但是它们使用方式和判断条件的方式不同。

if...in是用来检查某个元素是否在一个集合(字符串、列表、元组、字典等)中,语法如下:

if element in collection:
    # do something

例如:

fruits = ["apple", "banana", "cherry"]
if "banana" in fruits:
    print("Yes, banana is in the fruits list")

再比如:

x="banana"
if "a" in x:
    print("a is in x")
    #a is in x

if...==则是用来检查一个变量或表达式是否等于某个值,语法如下:

if variable == value:
    # do something

例如:

x = 5
if x == 5:
    print("x is equal to 5")
 


上面两段代码的区别就是:

左边代码:单独判断括号是否匹配,为了防止用户输入其它类型的括号进行匹配,所以用==去限制匹配的括号类型

右边代码:因为字符串相当于列表,如果是各种类型的括号,用in的话相当于检查列表中某个元素是否存在,每种类型的括号都可以进行一一匹配

因此,if...in和if...==的区别在于,if...in是用来检查某个元素是否在一个集合中,而if...==是用来检查一个变量或表达式是否等于某个值。

 2.括号匹配判断的区别

左边的只是进行括号的匹配,所以直接pop出来即可

而右边的还需要判断栈顶的括号是否和pop的是一对的,一对的才能成功被pop出来,所以利用 matches 进行判断匹配

运行过程:

 3.matches函数的匹配小技巧

通过开闭区间下标索引进行位置判断,判断相同类型的括号位置是否一致,从而完成匹配pop出来,就可省去一堆的   if   else 判断语句

运行过程:


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。