数据结构day05

news2025/4/15 19:12:27

一 栈的应用(括号匹配)

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

好,那我们先用手算的方式捋一下这个括号匹配的过程。那这几个括号是不是很简单,大家可以下意识的看出中间的这两个是一对,然后这两个是一对,这两个是一对,最外侧的两个是一对。那这是我们人脑的反应,

如果要用计算机来匹配这些括号的话,那只能一个一个依次扫描,对吧?也就是从左到右扫描,那不难发现这样的一个规律。越往后出现的左括号会越先被匹配,比如当我们从左往右扫描,扫描到这个右括号的时候。寻找与它匹配的左括号,应该是找到这个对吧?而这个左括号是最后出现的左括号,那扫描到再往后的一个右括号的时候。下一个被匹配的就是这个组合好,对吧?那算法的这种特性是不是就和栈的后进先出,其实是异曲同工的?我们是不是可以把这些左括号依次压入栈中,然后越往后压入栈的左括号越先被弹出栈,越先被匹配对吧?

来看另一个例子,从左往右依次扫描这些括号,那前面几个都是左括号,当扫描到第一个右括号的时候,是不是需要检查最近出现的一个左括号是哪一个?好发现是这个与它匹配,那就可以继续往后扫描后一个还是右括号,那是不是同样的,我们依然是往前找,最近出现的,并且没有被匹配的括号是这个好,

所以它们俩进行了配对。好,那再往后的过程都是类似的,总之每当出现一个右括号的时候,就需要消耗一个左括号,那这儿的消耗其实是不是就对应了出栈的一个操作?当我们遇到左括号的时候,就把它压入栈中,当我们遇到右括号的时候,就把栈顶的那个左括号给弹出,然后检查它们俩是否匹配。所以这就是用站来实现括号匹配的一个啊,大体的思路,

 

 

好,那如果用代码实现的话,就是这样的啊,这个函数里边传入了两个参数,这个参数是一个字符型的数组,里边就是存储了啊,什么左括号右括号这一串的字符。然后第二个参数lenth是表示我的这个数组,它的长度有多少好,另外我们这在这定义了一个顺序栈,这个栈里边它的数据元素是不是都是char类型的?然后还有一个站顶指针top考试的时候,大家是可以直接使用和数据结构相对应的,这些基本操作的,但是个人建议是要简要的说明一下这些接口分别是什么?就是用这种注释的方式呃,把各个接口进行一个说明,那这样的话,即便你的这个基本操作接口的名字,你命名的不太规范。但是只要你用中文把它注释讲明白了,那改卷老师肯定也不会算你的错,所以这是给大家的一个小建议。

好回到算法本身,首先是定义一个栈,并且初始化这个栈接下来用一个for循环从左往右啊,依次扫描这些字符。如果此次扫描到的字符,它是某一种左括号的话,那么我们就把这个字符给它push,给它压入栈中。而如果此次扫描到的是右括号,那么就首先需要检查啊栈是否为空。如果栈为空的话,那么就说明右括号单身匹配失败。而如果栈不空的话,我们就用呃pop,也就是出站的操作,把栈顶元素弹出,然后用top Elem这个变量来存储,接下来是不是要检查此次扫描到的这个右括号和当前栈点的左括号是否匹配?

如果此次扫描到的是右小括号,而栈顶的这个元素,它不是左小括号的话,那么就说明配对失败就可以直接return FALSE。算法就到此结束,那中括号和大括号也是一样的好,所以用这样的方式处理完所有的括号之后,是不是还需要检查?最后,这个栈是否为空?如果栈此时为空,那么就说明匹配成功。而如果最后这个栈是非空的,也就这个基本操作,它的返回值是FALSE的话。那就说明有单身的左括号,这样也是匹配失败

好,那这个地方我们是用顺序栈,也就是用一个静态数组来存储啊,栈里边的各个数据元素。之前我们说过,这种顺序栈的容量是固定不变的,所以如果给的这个括号串它很长很长的话,那么就有可能出现栈的溢出。因此,在实际开发的过程中,如果要实现这个代码的话,那其实可以用链栈的方式来实现。不过在考试中,我们用顺序战的这种方式实现,

相对来说会更简单一些。所以考试的时候用这种方式也是没问题的,好这个地方给大家留一个小小的练习,如果在这个代码当中并不是直接定义了一个栈。而是在里边定义了一个这样的数组,还有一个top指针,那么大家可以尝试着把这些基本操作给去掉。把相应的这些逻辑换成啊,对数组还有top指针直接的判断和操作好,这个一定要动手练习一下,特别是基础不太好的同学

 

好,那这一小节中我们学习了如何用栈来解决括号匹配的问题?概括来讲,算法思路就是啊,

从左到右依次扫描所有的字符,遇到左括号入栈,遇到右括号的话,弹出栈顶的左括号。检查是否匹配,如果所有的括号都检查完了,但是最终栈是非空的话,那么说明有左括号单身。然后如果扫描到右括号,但是此时栈已经空的话,那说明有右括号单身,而如果此时弹出的这个栈顶左括号和当前的右括号不匹配的话,也会出现匹配失败的情况,其实只要理解这个算法的大体思想之后。

啊,具体的代码应该是大家能够在考场上临场把它写出来的东西。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

相关文章

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 系统‌。其核心功能为‌漂白去底‌,可高效去除扫描件或手机拍摄图片中的泛黄、灰底及阴影,同时提供智能纠偏、透视校正等辅助功能&#xff0…

BGP路由协议之对等体

IGP 可以通过组播报文发现直连链路上的邻居,而 BGP 是通过 TCP:179 来实现的。BGP 需要手工的方式去配置邻居。不需要直连,只要路由能通就可以建立邻居 IBGP 与 EBGP IBGP :(Internal BGP) :位于相同自治系统的 BGP 路由器之间的 BGP 邻接关…

esp32cam远程图传:AI Thinker ESP32-CAM -》 服务器公网 | 服务器 -》 电脑显示

用AI Thinker ESP32-CAM板子访问公网ip的5112端口并上传你的摄像头拍摄的图像视频数据,并写一段python程序打开弹窗接受图像实现超远程图像传输教程免费 1. 首先你要有一个公网ip也就是去买一台拥有公网的服务器电脑,我买的是腾讯云1年38元的服务器还可…

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轮播图动画交互 动画缩放展示图片 效果如下图&#xff1a; XAML代码&#xff1a; <Window x:Class"Caroursel.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/20…

【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.…

最新如何在服务器中解决FFmpeg下载、安装和配置问题教程(Linux|Windows|Mac|Ubuntu)

最新如何在服务器中解决FFmpeg下载、安装和配置问题教程&#xff08;Linux&#xff5c;Windows&#xff5c;Mac&#xff5c;Ubuntu&#xff09; 摘要&#xff1a; FFmpeg是一个强大的开源工具&#xff0c;广泛应用于音视频处理&#xff0c;支持格式转换、视频剪辑、流媒体推送…

【C语言】结构体 (深入)

前言&#xff1a; 在上一张讲解了结构体的基本知识&#xff0c;在本章深入讲解一下结构体。 如内存对齐&#xff0c;传参&#xff0c;实现尾段。 首先提一个问题吧&#xff0c;如下的代码结果输出是多少&#xff1f; #include <stdio.h> struct s1 {char name;int id…

文件流---------获取文件的内容到控制台

总流程&#xff1a;先创建一个文本文件------->里面写入一些内容&#xff08;纯字母和字母加文字&#xff09;-----------> 然后通过输入流获取文件里面的内容&#xff0c;两种方式。 1.第一种&#xff0c;获取单个的字符 &#xff0c;先创建文件 &#xff0c;java.txt…

【PyTorch项目实战】反卷积(Deconvolution)

文章目录 一、卷积&#xff08;Convolution&#xff09;二、反卷积&#xff08;Deconvolution&#xff09; —— 又称去卷积1. 反卷积&#xff08;Richardson-Lucy&#xff0c;RL&#xff09; —— —— 通过不断迭代更新图像估计值2. 转置卷积&#xff08;Transpose Convoluti…

SpringBoot无法访问静态资源文件CSS、Js问题

在做一个关于基于IDEASpringBootMaveThymeleaf的系统实现实验时候遇到了这个问题一直无法解决 后来看到一篇博客终于解决了。 springboot项目在自动生成的时候会有两个文件夹&#xff0c;一个是static,一个是templates&#xff0c;如果我们使用 <dependency><groupI…

powerbi制作中国式复杂报表

今天主要想实现的功能是使用powerbi制作一个中国式的复杂报表&#xff0c;其中需要多表头&#xff0c;另外需要多个度量值如图我们最终要实现的样式是这样的&#xff1a; 错误示范 因为这些作为多表头的维度需要在同一行上作为不同的列显示所以他们需要来自于同一个字段&#…

ChatGPT-如何让AI写作不那么生硬!

在使用聊天机器人撰写文章时&#xff0c;可能会遇到频繁使用“首先”、“其次”、“再次”等转折连接词&#xff0c;这会让文章显得呆板和机械&#xff0c;降低了阅读体验。 解决这个问题可以尝试以下方式&#xff01; 多样化连接词&#xff1a; 使用更多多样的连接词和过渡短…

C++——继承、权限对继承的影响

目录 继承基本概念 编程示例 1.基类&#xff08;父类&#xff09;Person 代码特点说明 权限对类的影响 ​编辑 编程示例 1. 公有继承 (public inheritance) 2. 保护继承 (protected inheritance) 3. 私有继承 (private inheritance) 重要规则 实际应用 继承基本概…

js中 剩余运算符(Rest Operator )(...)和展开运算符(Spread Operator)(...)的区别及用法

1、基本说明 在JavaScript中&#xff0c;剩余运算符&#xff08;Rest Operator&#xff09;和展开运算符&#xff08;Spread Operator&#xff09;虽然在某些方面有相似之处&#xff0c;但它们各自有不同的用途和功能。下面详细解释这两种运算符的区别&#xff1a; 1.1. 剩余…

华为手机清理大数据的方法

清理手机最大的问题是&#xff0c;手动和自动清理了多次&#xff0c;花费了很长时间&#xff0c;但是只腾挪出来了一点点空间&#xff0c;还是有很大空间无法使用&#xff0c;这篇文章就告诉你怎样做&#xff0c;以花瓣剪辑为例&#xff0c;如下&#xff1a; 删除数据&#xff…

单元测试原则之——不要过度模拟

什么是过度模拟? 过度模拟(over-mocking)是指在单元测试中,模拟了太多依赖项,甚至模拟了本不需要模拟的简单对象或行为。过度模拟会导致: 测试代码变得复杂,难以阅读和维护。测试逻辑偏离了实际业务逻辑,无法验证真实代码的行为。忽略了被测单元与依赖项之间的真实交互…

操作系统基础:07 我们的任务

课程回顾与后续规划 上节课我们探讨了操作系统的历史。了解历史能让我们明智&#xff0c;从操作系统的发展历程中&#xff0c;我们总结出两个核心的里程碑式图像&#xff1a;多进程&#xff08;多任务切换&#xff09;图像和文件操作图像 。Unix和Windows等系统的成功&#xf…