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

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

目录

括号与算法的关系

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

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

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

 2.括号匹配判断的区别

 3.matches函数的匹配小技巧

括号与算法的关系

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

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

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

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

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

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

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

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

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

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

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

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

数据结构与算法基础-(5)---栈的应用-(1)括号匹配_第1张图片

数据结构与算法基础-(5)---栈的应用-(1)括号匹配_第2张图片

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("(()"))

运行结果:数据结构与算法基础-(5)---栈的应用-(1)括号匹配_第3张图片

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

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

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

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

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

那我们要如何操作?

数据结构与算法基础-(5)---栈的应用-(1)括号匹配_第4张图片

代码如下: 

# 如何给其他类型的括号进行匹配---代码如下
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("[()]"))

数据结构与算法基础-(5)---栈的应用-(1)括号匹配_第5张图片

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

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")

数据结构与算法基础-(5)---栈的应用-(1)括号匹配_第6张图片

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

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

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

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

 2.括号匹配判断的区别

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

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

数据结构与算法基础-(5)---栈的应用-(1)括号匹配_第7张图片

运行过程:

 3.matches函数的匹配小技巧

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

数据结构与算法基础-(5)---栈的应用-(1)括号匹配_第8张图片

运行过程:

你可能感兴趣的:(python学习,数据结构与算法,python,开发语言,学习,算法,服务器,数据结构,线性回归)