03-3.3.1 栈在括号匹配中的应用

  • 👋 Hi, I’m @Beast Cheng
  • 👀 I’m interested in photography, hiking, landscape…
  • 🌱 I’m currently learning python, javascript, kotlin…
  • 📫 How to reach me --> 458290771@qq.com

喜欢《数据结构》部分笔记的小伙伴可以订阅专栏,今后还会不断更新。🧑‍💻
此外,《程序员必备技能》专栏和《程序员必备工具》专栏(该专栏暂未开设)日后会逐步更新,感兴趣的小伙伴可以点一下订阅、收藏、关注!🚀
谢谢大家!🙏

括号示例

void test(){int a[10][10];int x = 10*(20*(1+1)-(3-2));printf("加油!奥里给!");
}

流程应该为:

  • 遇到左括号就入栈
  • 遇到右括号,就“消耗”一个左括号
  • 处理完所有括号后,栈非空——左括号单身
  • 因此写代码的时候,扫描完所有的括号后,还要检查是否栈空
  • 如果栈非空,则匹配失败

算法实现

#define MaxSize 10
typedef struct{char data[MaxSize];int top;
}SqStack;/*
* 考试中可以直接使用栈的这些基本操作
* 但是建议要写上简短的说明接口分别是什么
*///初始化栈
void InitStack(SqStack &S)
//判断栈是否为空
bool StackEmpty(SqStack S)
//新元素入栈
bool Push(SqStack &S, char x)
//栈顶元素出栈,用x返回
bool Pop(SqStack &S, char &x)bool bracketCheck(char str[], int length){SqStack S;                  //声明一个栈InitStack(S);               //初始化一个栈for(int i=0; i>length; i++){if(str[i] == '(' || str[i] == ')' || str[i] == '{'){Push(S, str[i]);    //扫描到左括号,入栈}else{if(StackEmpty(S))   //扫描到右括号,且当前栈空return false;   //匹配失败char topElem;Pop(S, topElem);    //栈顶元素出栈if(str[i] == ')' && topElem != '(')return false;if(str[i] == ']' && topElem != '[')return false;if(str[i] == '}' && topElem != '{')return false;}}return StackEmpty(S);   //检索完所有括号后,栈空说明匹配成功
}

需要注意的是,当前定义的最大长度是10,如果长度不够了怎么办?
答:可以用链栈的方式来实现,不过在考试中用顺序栈来实现更方便,所以用顺序栈就可以了


练习:去掉代码中的基本操作,把相对应的逻辑换成对数组top指针直接的判断和操作,动手实现完整代码!
答案

  • 先将基本操作替换一下
//首先,初始化栈
//将栈的top指针初始化为 -1,表示栈为空
S.top = -1;//判断栈是否为空
//也就是判断top是否为 -1,如果是,表示栈空
if(S.top == -1)//新元素入栈,将元素放在top指针所指位置的下一位,并将top指针 +1
if(S.top < MaxSize - 1){S.data[++S.top] = str[i];
}else{return false;
}//栈顶元素出栈,获取top指针所指位置的元素,并将top指针 -1
if(S.top != -1){topElem = S.data[S.top--];
}else{return false;
}
  • 最终完整代码
#include <stdbool.h>
#include <stdio.h>#define MaxSize 10typedef struct{char data[MaxSize];int top;
}SqStack;bool bracketCheck(char str[], int length){SqStack S;    //声明一个栈S.top = -1;   //初始化栈for(int i = 0; i < length; i++){if(str[i] == '(' || str[i] == '[' || str[i] == '{'){if(S.top < MaxSize - 1){S.data[++S.top] = str[i];  //扫描到左括号,入栈}else{return false;  //栈满,匹配失败}}else if(str[i] == ')' || str[i] == ']' || str[i] == '}'){if(S.top == -1)    //扫描到右括号,且当前栈空return false;  //匹配失败char topElem;if(S.top != -1){topElem = S.data[S.top--];  //栈顶元素出栈}else{return false;  //栈空,匹配失败}if((str[i] == ')' && topElem != '(') ||(str[i] == ']' && topElem != '[') ||(str[i] == '}' && topElem != '{'))return false;  //匹配失败}}return S.top == -1;  //检索完所有括号后,栈空说明匹配成功
}int main(){char str[] = "{[()]}";int length = sizeof(str) / sizeof(str[0]) - 1;bool result = bracketCheck(str, length);if(result)printf("括号都是成对的\n");elseprintf("括号不是成对的\n");return 0;
}

以上代码的问题解答

  1. 为什么用S.top == MaxSize - 1这个条件来判断是否栈满?为什么MaxSize要-1 ?
    • 在使用数组实现栈的情况下,我们需要知道数组的最大容量。假设数组的最大长度为 MaxSize,那么数组的索引范围是从 0MaxSize - 1。也就是说,数组中最后一个位置的索引是 MaxSize - 1
    • S.top:栈顶指针,指向当前栈顶元素的位置;MaxSize - 1:数组的最大索引。
    • 如果 S.top 正好等于 MaxSize - 1,说明栈顶已经在数组的最后一个位置,因此栈中已经没有空余的空间可以容纳更多的元素,栈已经满了。
  2. S.data[++S.top] = str[i]; // 入栈时,是先将指针+1,还是先压入数据?
    • 在这条语句中,++S.top 是一个前置自增操作。这意味着:
      • S.top先增加 1,然后新值会被用作索引来存放新元素 str[i]
      • 也就是说,S.top会先增加一,然后指向下一个位置,然后在指向的这个位置里面插入元素str[i]
  3. str[i]是什么意思?其中的i又是什么意思?
    • str:是一个字符数组(字符串),它包含了需要被检查的括号字符。
    • i:是一个整数,作为循环变量,表示当前在数组 str 中的索引。循环遍历 str 数组中的每一个字符,通过 str[i] 来访问 str 数组在第 i 个位置的字符
  4. 在这个for循环中,只要有任意一次匹配失败,就会中断循环,并且返回false

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

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

相关文章

echarts的使用

一 echarts的使用 引入 echarts.js 文件 <script src"https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js"></script> 准备一个呈现图表的盒子 <div class"container"><div class"t_header"><span>端午…

东方博宜1760 - 整理抽屉

题目描述 期末考试即将来临&#xff0c;小T由于同时肩负了学习、竞赛、班团活动等多方面的任务&#xff0c;一直没有时间好好整理他的课桌抽屉&#xff0c;为了更好地复习&#xff0c;小T首先要把课桌抽屉里的书分类整理好。 小T的抽屉里堆着 N 本书&#xff0c;每本书的封面上…

智能视频监控平台LntonCVS视频融合共享平台保障露营安全解决方案

在当今社会&#xff0c;都市生活的快节奏和压力使得越来越多的人渴望逃离城市的喧嚣&#xff0c;寻求一种短暂的慢生活体验。他们向往在壮丽的山河之间或宁静的乡村中露营&#xff0c;享受大自然的宁静与美好。随着露营活动的普及&#xff0c;露营地的场景也变得更加丰富多样&a…

使用python绘制核密度估计图

使用python绘制核密度估计图 核密度估计图介绍效果代码 核密度估计图介绍 核密度估计&#xff08;Kernel Density Estimation&#xff0c;KDE&#xff09;是一种用于估计数据概率密度函数的非参数方法。与直方图不同&#xff0c;KDE 可以生成平滑的密度曲线&#xff0c;更好地…

Mybatis使用缓存的配置总结

1.全局变量配置cacheEnabled&#xff1a; ture&#xff08;默认&#xff09;&#xff1a;开启二级缓存&#xff0c; false&#xff1a;关闭二级缓存&#xff0c;但一级缓存不受影响 2.映射文件中mapper标签下&#xff1a; 配置有&#xff1a;开启二级缓存 没配置有&#x…

LeetCode62不同路径

题目描述 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。问总共有多少条不同的路径&#xff1f; …

大模型参加高考,同写2024年高考作文,及格分(通义千问、Kimi、智谱清言、Gemini Advanced、Claude-3-Sonnet、GPT-4o)

大家好&#xff0c;我是章北海 今天高考&#xff0c;上午的语文结束&#xff0c;市面上又要来一场大模型参考的文章了。 我也凑凑热闹&#xff0c;让通义千问、Kimi、智谱清言一起来写一下高考作文。 公平起见&#xff0c;不加任何其他prompt&#xff0c;直接把题目甩过去。…

网络基础_02

1.ARP协议 地址解析协议&#xff08;Address Resolution Protocol&#xff09; 已知对方的三层ip地址&#xff0c;需要二层mac地址 当一台设备&#xff08;请求方&#xff09;需要知道某个 IP 地址对应的 MAC 地址时&#xff0c;会使用 ARP封装一个数据帧。这台设备的网络层以…

华为RH2288H V3服务器iBMC的SSL证书续期

本文对华为RH2288H V3服务器iBMC的SSL证书续期&#xff0c;以避名登录告警提示及主机状态异常。 一、检查现网服务器iBMC的SSL证书到期时间 登录iBMC&#xff0c;点击配置--SSL证书&#xff0c;如下&#xff1a; 可以看到本服务器SSL证书将于今年7月22日到期。 二、联系厂家…

【第四节】C/C++数据结构之树与二叉树

目录 一、基本概念与术语 二、树的ADT 三、二叉树的定义和术语 四、平衡二叉树 4.1 解释 4.2 相关经典操作 4.3 代码展示 一、基本概念与术语 树(Tree)是由一个或多个结点组成的有限集合T。其中: 1 有一个特定的结点&#xff0c;称为该树的根(root)结点&#xff1b; 2 …

【Linux】进程2——管理概念,进程概念

1.什么是管理&#xff1f; 那在还没有学习进程之前&#xff0c;就问大家&#xff0c;操作系统是怎么管理进行进程管理的呢&#xff1f; 很简单&#xff0c;先把进程描述起来&#xff0c;再把进程组织起来&#xff01; 我们拿大学为例子 最典型的管理者——校长最典型的被管理…

来自工业界的知识库 RAG 服务(三),FinGLM 竞赛获奖项目详解

背景介绍 前面介绍过工业界的 RAG 服务 QAnything 和 RagFlow 的详细设计&#xff0c;也介绍过来自学术界的 一些优化手段。 前一阵子刚好看到智谱组织的一个金融大模型比赛 FinGLM&#xff0c;主要做就是 RAG 服务的竞赛&#xff0c;深入研究了其中的几个获奖作品&#xff…

Pyramid Vision Transformer, PVT(ICCV 2021)原理与代码解读

paper&#xff1a;Pyramid Vision Transformer: A Versatile Backbone for Dense Prediction without Convolutions official implementation&#xff1a;GitHub - whai362/PVT: Official implementation of PVT series 存在的问题 现有的 Vision Transformer (ViT) 主要设计…

C++结合ffmpeg获取声音的分贝值

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、分贝是什么&#xff1f;1.功率量2.场量 二、实际操作1.分析wav文件2.读取麦克风 总结 前言 最近面对一个需求&#xff0c;就是需要传递声音文件到模型里推…

链表的回文结构OJ

链表的回文结构_牛客题霸_牛客网对于一个链表&#xff0c;请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法&#xff0c;判断其是否为。题目来自【牛客题霸】https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?tpId49&&tqId29370&rp1&a…

CodeMeter助力Hilscher,推动实现全球智能制造连接解决方案

Hilscher的旗舰店为开放工业4.0联盟&#xff08;OI4&#xff09;社区提供了应用商店的便捷和开放性&#xff0c;将这一概念引入工业领域。该商店依托CodeMeter的许可证管理和加密保护&#xff0c;为工业用户提供了丰富的应用和解决方案库&#xff0c;满足他们在车间自动化和连接…

2020年06月C语言二级真题

计算矩阵边缘元素之和 题目描述 输入一个整数矩阵&#xff0c;计算位于矩阵边缘的元素之和。 所谓矩阵边缘的元素&#xff0c;就是第一行和最后一行的元素以及第一列和最后一列的元素。 输入格式 第一行分别为矩阵的行数n和列数m&#xff0c;两者之间以一个空格分开。 接下来输…

WPF中读取Excel文件的内容

演示效果 实现方案 1.首先导入需要的Dll(这部分可能需要你自己搜一下) Epplus.dll Excel.dll ICSharpCode.SharpZipLib.dll 2.在你的解决方案的的依赖项->添加引用->浏览->选择1中的这几个Dll点击确定。(添加依赖) 3.然后看代码内容 附上源码 using Excel; usi…

计网复习资料

一、选择题&#xff08;每题2分&#xff0c;共40分&#xff09; 1. Internet 网络本质上属于&#xff08; &#xff09;网络。 A.电路交换 B.报文交换 C.分组交换 D.虚电路 2.在 OSI 参考模型中,自下而上第一个提供端到端服务的是( )。 A.数据链路层 B.传输…

Thinkphp使用Elasticsearch查询

在Thinkphp中调用ES&#xff0c;如果自己手写json格式的query肯定是很麻烦的。我这里使用的是ONGR ElasticsearchDSL 构建 ES 查询。ongr ElasticsearchDSL 的开源项目地址&#xff1a;GitHub - ongr-io/ElasticsearchDSL: Query DSL library for Elasticsearch。ONGR Elastics…