数据结构day05

一 栈的应用(括号匹配)

各位同学大家好,在之前的小结中,我们学习了栈和队列这两种数据结构,那从这个小节开始,我们要学习几种栈和队列的典型应用。这个小节中,我们来看一下括号匹配问题,这是栈这种数据结构的一个经典应用,那什么是括号匹配问题呢?这儿我在我的IDE上写了一小段代码,大家会发现我们写的代码当中这些小括号,大括号。还有中括号,它们都是成双成对出现的。所以你看这个地方,如果我们只有一个左括号而没有写与它对应的右括号,那这个IDE它是可以检测出来的。那如果我们加上与它对应的这个右括号啊IDE,就不会再报这个错误啊,对了,跨考的同学可能不知道这个名词是什么意思?IDE就是可视化的一个编程环境,反正就是大家用来写代码的那个东西好,那除了IDE之外,其实我们在对这段代码进行编译的时候。我们的编译器也会进行这样括号匹配的检查,因此这就是括号匹配的问题,我们必须保证我们在代码当中出现的这些括号。它们都是成双成对的,出现的除了左括号和右括号,在数量上必须匹配之外,那形状上是不是也必须匹配,比如我这儿写的是一个。左边的小括号,而这儿如果写一个呃,右边的中括号,那这样的代码也是有错误的

好,那我们先用手算的方式捋一下这个括号匹配的过程。那这几个括号是不是很简单,大家可以下意识的看出中间的这两个是一对,然后这两个是一对,这两个是一对,最外侧的两个是一对。那这是我们人脑的反应,
如果要用计算机来匹配这些括号的话,那只能一个一个依次扫描,对吧?也就是从左到右扫描,那不难发现这样的一个规律。越往后出现的左括号会越先被匹配,比如当我们从左往右扫描,扫描到这个右括号的时候。寻找与它匹配的左括号,应该是找到这个对吧?而这个左括号是最后出现的左括号,那扫描到再往后的一个右括号的时候。下一个被匹配的就是这个组合好,对吧?那算法的这种特性是不是就和栈的后进先出,其实是异曲同工的?我们是不是可以把这些左括号依次压入栈中,然后越往后压入栈的左括号越先被弹出栈,越先被匹配对吧?
来看另一个例子,从左往右依次扫描这些括号,那前面几个都是左括号,当扫描到第一个右括号的时候,是不是需要检查最近出现的一个左括号是哪一个?好发现是这个与它匹配,那就可以继续往后扫描后一个还是右括号,那是不是同样的,我们依然是往前找,最近出现的,并且没有被匹配的括号是这个好,
所以它们俩进行了配对。好,那再往后的过程都是类似的,总之每当出现一个右括号的时候,就需要消耗一个左括号,那这儿的消耗其实是不是就对应了出栈的一个操作?当我们遇到左括号的时候,就把它压入栈中,当我们遇到右括号的时候,就把栈顶的那个左括号给弹出,然后检查它们俩是否匹配。所以这就是用站来实现括号匹配的一个啊,大体的思路,





好,那如果用代码实现的话,就是这样的啊,这个函数里边传入了两个参数,这个参数是一个字符型的数组,里边就是存储了啊,什么左括号右括号这一串的字符。然后第二个参数lenth是表示我的这个数组,它的长度有多少好,另外我们这在这定义了一个顺序栈,这个栈里边它的数据元素是不是都是char类型的?然后还有一个站顶指针top考试的时候,大家是可以直接使用和数据结构相对应的,这些基本操作的,但是个人建议是要简要的说明一下这些接口分别是什么?就是用这种注释的方式呃,把各个接口进行一个说明,那这样的话,即便你的这个基本操作接口的名字,你命名的不太规范。但是只要你用中文把它注释讲明白了,那改卷老师肯定也不会算你的错,所以这是给大家的一个小建议。
好回到算法本身,首先是定义一个栈,并且初始化这个栈接下来用一个for循环从左往右啊,依次扫描这些字符。如果此次扫描到的字符,它是某一种左括号的话,那么我们就把这个字符给它push,给它压入栈中。而如果此次扫描到的是右括号,那么就首先需要检查啊栈是否为空。如果栈为空的话,那么就说明右括号单身匹配失败。而如果栈不空的话,我们就用呃pop,也就是出站的操作,把栈顶元素弹出,然后用top Elem这个变量来存储,接下来是不是要检查此次扫描到的这个右括号和当前栈点的左括号是否匹配?
如果此次扫描到的是右小括号,而栈顶的这个元素,它不是左小括号的话,那么就说明配对失败就可以直接return FALSE。算法就到此结束,那中括号和大括号也是一样的好,所以用这样的方式处理完所有的括号之后,是不是还需要检查?最后,这个栈是否为空?如果栈此时为空,那么就说明匹配成功。而如果最后这个栈是非空的,也就这个基本操作,它的返回值是FALSE的话。那就说明有单身的左括号,这样也是匹配失败
好,那这个地方我们是用顺序栈,也就是用一个静态数组来存储啊,栈里边的各个数据元素。之前我们说过,这种顺序栈的容量是固定不变的,所以如果给的这个括号串它很长很长的话,那么就有可能出现栈的溢出。因此,在实际开发的过程中,如果要实现这个代码的话,那其实可以用链栈的方式来实现。不过在考试中,我们用顺序战的这种方式实现,
相对来说会更简单一些。所以考试的时候用这种方式也是没问题的,好这个地方给大家留一个小小的练习,如果在这个代码当中并不是直接定义了一个栈。而是在里边定义了一个这样的数组,还有一个top指针,那么大家可以尝试着把这些基本操作给去掉。把相应的这些逻辑换成啊,对数组还有top指针直接的判断和操作好,这个一定要动手练习一下,特别是基础不太好的同学

好,那这一小节中我们学习了如何用栈来解决括号匹配的问题?概括来讲,算法思路就是啊,
从左到右依次扫描所有的字符,遇到左括号入栈,遇到右括号的话,弹出栈顶的左括号。检查是否匹配,如果所有的括号都检查完了,但是最终栈是非空的话,那么说明有左括号单身。然后如果扫描到右括号,但是此时栈已经空的话,那说明有右括号单身,而如果此时弹出的这个栈顶左括号和当前的右括号不匹配的话,也会出现匹配失败的情况,其实只要理解这个算法的大体思想之后。
啊,具体的代码应该是大家能够在考场上临场把它写出来的东西。










相关文章:
数据结构day05
一 栈的应用(括号匹配) 各位同学大家好,在之前的小结中,我们学习了栈和队列这两种数据结构,那从这个小节开始,我们要学习几种栈和队列的典型应用。这个小节中,我们来看一下括号匹配问题…...
windows中搭建Ubuntu子系统
windows中搭建虚拟环境 1.配置2.windows中搭建Ubuntu子系统2.1windows配置2.1.1 确认启用私有化2.1.2 将wsl2设置为默认版本2.1.3 确认开启相关配置2.1.4重启windows以加载更改配置 2.2 搭建Ubuntu子系统2.2.1 下载Ubuntu2.2.2 迁移位置 3.Ubuntu子系统搭建docker环境3.1安装do…...
ImgTool_0.8.0:图片漂白去底处理优化工具
ImgTool_0.8.0 是一款专为Windows设计的免费、绿色便携式图片处理工具,支持 Windows 7/8/10/11 系统。其核心功能为漂白去底,可高效去除扫描件或手机拍摄图片中的泛黄、灰底及阴影,同时提供智能纠偏、透视校正等辅助功能࿰…...
BGP路由协议之对等体
IGP 可以通过组播报文发现直连链路上的邻居,而 BGP 是通过 TCP:179 来实现的。BGP 需要手工的方式去配置邻居。不需要直连,只要路由能通就可以建立邻居 IBGP 与 EBGP IBGP :(Internal BGP) :位于相同自治系统的 BGP 路由器之间的 BGP 邻接关…...
Python代码相关关系矩阵的三种展示热力图-条形图
本文将深入探讨三种常用的展示技巧:corr()函数、热力图和条形图。通过这些技术,可以更直观地理解数据中的关联性,为进一步的分析和决策提供有力支持。 一、corr()函数:基础相关性分析 1. corr()函数的基本用法 corr()函数是Pandas库中用于计算数据帧(DataFrame)中两两…...
esp32cam远程图传:AI Thinker ESP32-CAM -》 服务器公网 | 服务器 -》 电脑显示
用AI Thinker ESP32-CAM板子访问公网ip的5112端口并上传你的摄像头拍摄的图像视频数据,并写一段python程序打开弹窗接受图像实现超远程图像传输教程免费 1. 首先你要有一个公网ip也就是去买一台拥有公网的服务器电脑,我买的是腾讯云1年38元的服务器还可…...
CSI-PVController-claimWorker
claimWorker() claim worker中循环执行workFunc() claim worker从claimQueue中取数据,也就是取出的都是PVCworkFunc首先从队列中取出一个obj,然后拿name去informer缓存中尝试获取 如果在informer缓存。说明不是删除事件,执行updateClaim()函…...
【家政平台开发(40)】功能测试全解析:从执行到报告撰写
本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析,剖析家政行业现状、挖掘用户需求与梳理功能要点,到系统设计阶段的架构选型、数据库构建,再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化,测试阶段多维度保障平台质量,…...
[特殊字符] 第十七讲 | 随机森林:变量重要性识别与建模实战
📌 关键词:随机森林、变量重要性、建模、分类、回归、R语言、可解释性 🎯 一、随机森林到底是什么? 随机森林(Random Forest)是由 Breiman 于 2001 年提出的集成学习方法,本质是由多个决策树模型组成的“森林”,通过投票或平均的方式提高预测精度和泛化能力。 ✅ 支…...
AIDD-人工智能药物-pyecharts-gallery
给大家安利一个NSC期刊级别的图-pyecharts-gallery 网址 https://gallery.pyecharts.org pyecharts-gallery 英文文档在这 - English Introduction is Here 项目简介 项目基于 pyecharts 2.0.3 版本进行展示Apache ECharts (incubating) 官方实例 项目须知 项目代码结构…...
ARM裸机开发——交叉编译器
交叉编译器: 下载: 链接: https://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/arm-linux-gnueabihf/ 根据核心板的单片机架构进行下载 解压: 首先交叉编译器的压缩包先下载到家目录下的某一个目录中&am…...
WPF轮播图动画交互 动画缩放展示图片
WPF轮播图动画交互 动画缩放展示图片 效果如下图: XAML代码: <Window x:Class"Caroursel.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/20…...
开启深度学习之旅
深度学习作为人工智能领域最激动人心的分支之一,正在改变我们与科技互动的方式。本文将为您提供深度学习的入门指南,帮助您踏上这一充满可能性的旅程。 一、深度学习基础概念 深度学习是机器学习的一个子集,它使用多层神经网络来模拟人脑的…...
TDengine 语言连接器(Go)
简介 driver-go 是 TDengine 的官方 Go 语言连接器,实现了 Go 语言 database/sql 包的接口。Go 开发人员可以通过它开发存取 TDengine 集群数据的应用软件。 Go 版本兼容性 支持 Go 1.14 及以上版本。 支持的平台 原生连接支持的平台和 TDengine 客户端驱动支持…...
【AI大模型】大模型RAG技术Langchain4j 核心组件深入详解
目录 一、前言 二、Langchain4j概述 2.1 Langchain4j 是什么 2.2 Langchain4j 主要特点 2.3 Langchain4j 核心组件 2.4 Langchain4j 核心优势 三、Langchanin4j组件应用实战 3.1 前置准备 3.1.1 导入如下依赖 3.1.2 获取apikey 3.1.3 获取官方文档 3.2 聊天组件 3.…...
汉化进度100%
P3834 #include<bits/stdc.h> #define int long long #define 定义整型变量 int #define 这是一个常量 const #define 无返回值函数 void #define 这是一个循环条件在后面 for #define 定义结构体 struct #define 如果 if #define 否则 else #define 定义无返回值的 sig…...
最新如何在服务器中解决FFmpeg下载、安装和配置问题教程(Linux|Windows|Mac|Ubuntu)
最新如何在服务器中解决FFmpeg下载、安装和配置问题教程(Linux|Windows|Mac|Ubuntu) 摘要: FFmpeg是一个强大的开源工具,广泛应用于音视频处理,支持格式转换、视频剪辑、流媒体推送…...
Tkinter图像和多媒体处理
Tkinter不仅支持图形界面的构建,还能处理图像和多媒体内容。通过Canvas控件、PIL(Python Imaging Library)库和tkinter的内置功能,您可以在Tkinter应用中展示图像、处理图像并播放简单的多媒体内容。掌握这些技术可以帮助您创建更丰富的图形界面。 10.1 显示图像 Tkinter…...
【C语言】结构体 (深入)
前言: 在上一张讲解了结构体的基本知识,在本章深入讲解一下结构体。 如内存对齐,传参,实现尾段。 首先提一个问题吧,如下的代码结果输出是多少? #include <stdio.h> struct s1 {char name;int id…...
苍穹外卖day03
店铺状态接口 引入Redis,因为像存储店铺状态这种只有一个字段(没必要存储在数据库),且登录后台就要被访问的数据(加快查询速度,减少数据库压力) 使用步骤:导入相关maven依赖、配置…...
文件流---------获取文件的内容到控制台
总流程:先创建一个文本文件------->里面写入一些内容(纯字母和字母加文字)-----------> 然后通过输入流获取文件里面的内容,两种方式。 1.第一种,获取单个的字符 ,先创建文件 ,java.txt…...
【PyTorch项目实战】反卷积(Deconvolution)
文章目录 一、卷积(Convolution)二、反卷积(Deconvolution) —— 又称去卷积1. 反卷积(Richardson-Lucy,RL) —— —— 通过不断迭代更新图像估计值2. 转置卷积(Transpose Convoluti…...
SpringBoot无法访问静态资源文件CSS、Js问题
在做一个关于基于IDEASpringBootMaveThymeleaf的系统实现实验时候遇到了这个问题一直无法解决 后来看到一篇博客终于解决了。 springboot项目在自动生成的时候会有两个文件夹,一个是static,一个是templates,如果我们使用 <dependency><groupI…...
powerbi制作中国式复杂报表
今天主要想实现的功能是使用powerbi制作一个中国式的复杂报表,其中需要多表头,另外需要多个度量值如图我们最终要实现的样式是这样的: 错误示范 因为这些作为多表头的维度需要在同一行上作为不同的列显示所以他们需要来自于同一个字段&#…...
CMake中set_property接口及属性作用详解
在 CMake 中,set_property 是一个用于设置 属性(Property) 的核心命令。属性是 CMake 中用于控制构建过程的核心机制之一,可以理解为与特定对象(如目标、目录、源文件等)关联的键值对,用于存储配…...
设计模式——抽象工厂模式总结
理解了前面的工厂模式后,再理解抽象工厂模式就很容易了。 工厂模式:https://blog.csdn.net/inside802/article/details/147170118?spm1011.2415.3001.10575&sharefrommp_manage_link 抽象工厂模式就是工厂模式的更加抽象化,父类不仅不承…...
ChatGPT-如何让AI写作不那么生硬!
在使用聊天机器人撰写文章时,可能会遇到频繁使用“首先”、“其次”、“再次”等转折连接词,这会让文章显得呆板和机械,降低了阅读体验。 解决这个问题可以尝试以下方式! 多样化连接词: 使用更多多样的连接词和过渡短…...
禁止页面滚动的方法-微信小程序
在微信小程序中,有几种方法可以禁止页面滚动: 一、通过页面配置禁止滚动 在页面的JSON配置文件中设置,此方法完全禁止页面的滚动行为: {"disableScroll": true }二、通过 CSS 样式禁止滚动 在页面的WXSS文件中添加&…...
C++——继承、权限对继承的影响
目录 继承基本概念 编程示例 1.基类(父类)Person 代码特点说明 权限对类的影响 编辑 编程示例 1. 公有继承 (public inheritance) 2. 保护继承 (protected inheritance) 3. 私有继承 (private inheritance) 重要规则 实际应用 继承基本概…...
js中 剩余运算符(Rest Operator )(...)和展开运算符(Spread Operator)(...)的区别及用法
1、基本说明 在JavaScript中,剩余运算符(Rest Operator)和展开运算符(Spread Operator)虽然在某些方面有相似之处,但它们各自有不同的用途和功能。下面详细解释这两种运算符的区别: 1.1. 剩余…...
