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

news2024/11/28 17:41:09

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

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

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

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

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

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

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

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

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

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

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

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

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 判断语句

运行过程:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1052418.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UG\NX二次开发 通过点云生成曲面 UF_MODL_create_surf_from_cloud

文章作者:里海 来源网站:《里海NX二次开发3000例专栏》 感谢粉丝订阅 感谢 Rlgun 订阅本专栏,非常感谢。 简介 有网友想做一个通过点云生成曲面的程序,我们也试一下 效果 代码 #include "me.hpp" /*HEAD CREATE_SURF_FROM_CLOUD CCC UFUN */

小谈设计模式(6)—依赖倒转原则

小谈设计模式&#xff08;6&#xff09;—依赖倒转原则 专栏介绍专栏地址专栏介绍 依赖倒转原则核心思想关键点分析abc 优缺点分析优点降低模块间的耦合度提高代码的可扩展性便于进行单元测试 缺点增加代码的复杂性需要额外的设计和开发工作 Java代码实现示例分析 总结 专栏介绍…

python编写修改sqlmap进行_WAF绕过

WAF绕过 文章目录 WAF绕过1 waf机制了解1.1 waf防火墙识别工具1.2 WAF机制及绕过方法总结: [绕waf参考总结地址](https://www.freebuf.com/articles/web/229982.html)1.3 绕过waf&#xff08;安全狗&#xff09;方式 2 绕过分析 -替换格式3 编写py脚本绕过安全狗3.1启动编好的脚…

Bug:elementUI样式不起作用、Vue引入组件报错not found等(Vue+ElementUI问题汇总)

前端问题合集&#xff1a;VueElementUI 1. Vue引用Element-UI时&#xff0c;组件无效果解决方案 前提&#xff1a; 已经安装好elementUI依赖 //安装依赖 npm install element-ui //main.js中导入依赖并在全局中使用 import ElementUI from element-ui Vue.use(ElementUI)如果此…

VBA技术资料MF62:创建形状添加文本及设置颜色

【分享成果&#xff0c;随喜正能量】须知往生净土&#xff0c;全仗信、愿。有信、愿&#xff0c;即未得三昧、未得一心不乱&#xff0c;亦可往生。且莫只以一心不乱&#xff0c;及得念佛三昧为志事&#xff0c;不复以信、愿、净念为事。。 我给VBA的定义&#xff1a;VBA是个人…

OpenWinding PMSM 开绕组永磁同步电机零序电流抑制以及无感控制

文章目录 前言仿真模型观测器速度观测位置观测电流波形A相电流零序电流电流FFT 转矩波形 前言 记录下最近开绕组电机的学习记录。 零序电流抑制&#xff0c;120解耦调制&#xff0c;基于零序电压的转子观测 仿真模型 观测器 速度观测 位置观测 电流波形 A相电流 零序电流 电…

新手怎么做小说推文和短剧推广怎么申请授权

新手想做小说推文和短剧推广可以通过“巨量推文”进行授权 只要你懂发短视频内容&#xff0c;会一点剪辑即可通过短剧推广和小说推文来获取收入 小说推文和短剧都分为cpa和cps模式 另短剧又cpm模式收入&#xff08;按照广告点击&#xff09; cpa为拉新类&#xff0c;cps为充…

1859. 将句子排序

目录 一、题目 二、代码 一、题目 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 二、代码 定义了一个vector<vector<string>> v(MAX);采用const string& word : v[k] word 就会依次取得 v[k] 中的每个元素&#xff08;v[k][0],…

Python学习--with语句

国庆当然要学习了 with语句 with语句可以自动管理上下文资源&#xff0c;不论什么原因跳出with块&#xff0c;都能确保文件正确的关闭&#xff0c;以此来达到释放资源的目的 #跳出with块 文件正确关闭 with open(a.txt,r) as file:print(file.read()) with语句原理 MyConten…

git代码管理 分支相关 新建dev、hot分支,分支协同操作

初始化仓库后 会自动为我们创建master分支&#xff0c;我们也可以自己创建分支&#xff0c;每一个分支都有自己的一套工作区&#xff0c;暂存区&#xff0c;仓库区。 问题情景1 此时正在dev分支上开发新的功能&#xff0c;如果线上产生了一个bug&#xff0c;使用stash存储下在…

Arcgis克里金插值报错:ERROR 999999: 执行函数时出错。 表名无效。 空间参考不存在。 ERROR 010429: GRID IO 中存在错误

ERROR 999999: 执行函数时出错。 问题描述 表名无效。 空间参考不存在。 ERROR 010429: GRID IO 中存在错误: WindowSetLyr: Window cell size does not match layer cell size. name: c:\users\lenovo\appdata\local\temp\arc2f89\t_t164, adepth: 32, type: 1, iomode: 6, …

python: 用百度API读取增值税发票信息

# encoding: utf-8 # 版权所有 2023 涂聚文有限公司 # 许可信息查看&#xff1a; # 描述&#xff1a; # Author : geovindu,Geovin Du 涂聚文. # IDE : PyCharm 2023.1 python 311 # Datetime : 2023/9/30 6:56 # User : geovindu # Product : PyCharm # Proj…

智慧公厕:探索未来公共厕所的创新设计

近年来&#xff0c;随着城市发展的不断科技化&#xff0c;智慧公厕的设计成为了一个备受关注的话题。作为城市基础设施的重要组成部分&#xff0c;公厕不仅仅是简单的功能性建筑&#xff0c;更是体现了城市形象和管理水平的重要指标。在这篇文章中&#xff0c;我们将以智慧公厕…

【python】python实现杨辉三角的三种方法

文章目录 1.杨辉三角介绍&#xff1a;2.方法一&#xff1a;迭代3.方法二&#xff1a;生成器4.方法三&#xff1a;递归 1.杨辉三角介绍&#xff1a; 杨辉三角是一种数学图形&#xff0c;由数字排列成类似三角形的形状。它的每个数值等于它上方两个数值之和。这个三角形的形状可以…

【Linux】CentOS-6.8超详细安装教程

文章目录 1.CentOS介绍&#xff1a;2.必要准备&#xff1a;3.创建虚拟机&#xff1a;4 .安装系统 1.CentOS介绍&#xff1a; CentOS是一种基于开放源代码的Linux操作系统&#xff0c;它以其稳定性、安全性和可靠性而闻名&#xff0c;它有以下特点&#xff1a; 开源性&#xff1…

STM32F4X UCOSIII软件定时器

STM32F4X UCOSIII软件定时器 定时器概念 定时器在MCU中是一个很常用的外设&#xff0c;其作用是可以在某个事件点触发MCU中断&#xff0c;告知MCU处理事情。定时器跟生活中的闹钟很类似&#xff0c;可以设置闹钟每天什么时候响&#xff0c;还能设置响的次数&#xff0c;是响一…

山西电力市场日前价格预测【2023-10-01】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-10-01&#xff09;山西电力市场全天平均日前电价为254.94元/MWh。其中&#xff0c;最高日前电价为399.30元/MWh&#xff0c;预计出现在19: 00。最低日前电价为0.00元/MWh&#xff0c;预计出…

源码编译安装systemtap

目录 编译环境 编译步骤 编译环境 阿里云ubuntu20.04 编译步骤 1 先安装elfutils&#xff0c;参见我的前一篇博客 源码编译elfutils_金色熊族的博客-CSDN博客 2 下载systemtap源码 3 解压 解压后的文件夹与elfutils的文件夹应该是平行的&#xff0c;如下图&#xff1a…

利用mAP计算yolo精确度

当将yolo算法移植部署在嵌入式设备上&#xff0c;为了验证算法的准确率。将模型测试的结果保存为txt文件&#xff08;每一个txt文件&#xff0c;对应一个图片&#xff09;。此外&#xff0c;需要将数据集中的标签由[x,y,w,h]转为[x1,y1,x2,y2]。最后&#xff0c;运行验证代码 …

轻松整理电脑文件:按大小归类保存,高效管理你的数据

你是否曾经在电脑中迷失在纷繁复杂的文件海洋中&#xff1f;你是否曾经花费大量时间搜索需要的文件&#xff0c;却发现它们并不在你想找的地方&#xff1f;如果你也遇到了这样的问题&#xff0c;那么是时候采取行动&#xff0c;对电脑文件进行整理和归类了。 首先。进入文件批…