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

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

括号与算法的关系

我们都写过这样的表达式: ( 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 判断语句

运行过程:


目录
相关文章
|
28天前
|
消息中间件 缓存 NoSQL
Redis各类数据结构详细介绍及其在Go语言Gin框架下实践应用
这只是利用Go语言和Gin框架与Redis交互最基础部分展示;根据具体业务需求可能需要更复杂查询、事务处理或订阅发布功能实现更多高级特性应用场景。
167 86
|
2月前
|
存储 监控 JavaScript
基于布隆过滤器的 Node.js 算法在局域网电脑桌面监控设备快速校验中的应用研究
本文探讨了布隆过滤器在局域网电脑桌面监控中的应用,分析其高效空间利用率、快速查询性能及动态扩容优势,并设计了基于MAC地址的校验模型,提供Node.js实现代码,适用于设备准入控制与重复数据过滤场景。
78 0
|
10天前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
78 3
|
21天前
|
机器学习/深度学习 资源调度 算法
遗传算法模型深度解析与实战应用
摘要 遗传算法(GA)作为一种受生物进化启发的优化算法,在复杂问题求解中展现出独特优势。本文系统介绍了GA的核心理论、实现细节和应用经验。算法通过模拟自然选择机制,利用选择、交叉、变异三大操作在解空间中进行全局搜索。与梯度下降等传统方法相比,GA不依赖目标函数的连续性或可微性,特别适合处理离散优化、多目标优化等复杂问题。文中详细阐述了染色体编码、适应度函数设计、遗传操作实现等关键技术,并提供了Python代码实现示例。实践表明,GA的成功应用关键在于平衡探索与开发,通过精心调参维持种群多样性同时确保收敛效率
|
21天前
|
机器学习/深度学习 边缘计算 人工智能
粒子群算法模型深度解析与实战应用
蒋星熠Jaxonic是一位深耕智能优化算法领域多年的技术探索者,专注于粒子群优化(PSO)算法的研究与应用。他深入剖析了PSO的数学模型、核心公式及实现方法,并通过大量实践验证了其在神经网络优化、工程设计等复杂问题上的卓越性能。本文全面展示了PSO的理论基础、改进策略与前沿发展方向,为读者提供了一份详尽的技术指南。
粒子群算法模型深度解析与实战应用
|
21天前
|
机器学习/深度学习 算法 安全
小场景大市场:猫狗识别算法在宠物智能设备中的应用
将猫狗识别算法应用于宠物智能设备,是AIoT领域的重要垂直场景。本文从核心技术、应用场景、挑战与趋势四个方面,全面解析这一融合算法、硬件与用户体验的系统工程。
|
3月前
|
机器学习/深度学习 人工智能 算法
AI-Compass 强化学习模块:理论到实战完整RL技术生态,涵盖10+主流框架、多智能体算法、游戏AI与金融量化应用
AI-Compass 强化学习模块:理论到实战完整RL技术生态,涵盖10+主流框架、多智能体算法、游戏AI与金融量化应用
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习模型、算法与应用的全方位解析
深度学习,作为人工智能(AI)的一个重要分支,已经在多个领域产生了革命性的影响。从图像识别到自然语言处理,从语音识别到自动驾驶,深度学习无处不在。本篇博客将深入探讨深度学习的模型、算法及其在各个领域的应用。
491 3
|
3月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
78 1
|
2月前
|
算法 数据可视化
matlab版本粒子群算法(PSO)在路径规划中的应用
matlab版本粒子群算法(PSO)在路径规划中的应用

热门文章

最新文章