【数据结构】【栈】括号匹配算法(可直接运行)
文章目录
- 1.算法问题
- 2.算法思路
- 3.算法实现
- 4.完整代码
- 5.运行结果
1.算法问题
假设表达式中允许包含三种括号:()、[]、{},其嵌套的顺序任意,即([]{})或[()[]{}]等均为正确的格式,实现一个算法,完成对表达式中括号的检验。
2.算法思路
考虑以下括号序列:
[ ( [ ] [ ] ) ]
分析如下:
(1)计算机接收第一个括号 [
后,等待与之匹配的 ]
出现。
(2)接收第二个括号 (
后,第一个括号放置一边,等待与之匹配的 )
出现。
(3)接收第三个括号 [
后,第二个括号暂时放置一边,等待能与之匹配的 ]
出现。
(4)直至第四个括号出现,发现其能与最近的第三个括号匹配,那第三个括号匹配完成,退出等待。
(5)以此类推,第五个等待,第六个与第五个匹配完成后,第五个退出等待;第七个与第二个匹配完成后,第二个退出等待;第八个与第一个匹配完成后,扫描完成,且等待序列中没有了数据,匹配成功。
可以发现,此算法与栈的特性类似,后出现的左括号先匹配。
综上所述,可以得出大致算法如下:
(1)初始创立一个空栈。
(2)逐个读入括号。
(3)如果是左括号,那么就压入栈中。
(4)如果是右括号,则先检查栈是否为空,如果栈为空,则表示无左括号与之匹配,匹配失败。如果栈不为空,则进入下一步。
(5)从栈顶取出元素,检测此左括号与读入右括号是否匹配,如果不匹配,则返回匹配失败。如果匹配成功,则回到第二步,直至不满足循环条件。
(6)检测栈是否为空,如果栈为空,则表示匹配完成后还有多余的括号,匹配失败。若栈为空,则返回匹配成功。
3.算法实现
// 算法实现——括号匹配
bool bracketCheck(char str[], int length) {SeqStack 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);
}
4.完整代码
#include<stdio.h>#define MaxSize 10typedef struct { // 定义顺序栈int data[MaxSize]; // 静态数组存放栈中元素int top; // 栈顶指针:指向目前栈顶元素的位置
} SeqStack;// 初始化
void InitStack(SeqStack &S) {// 初始化栈顶指针,由于在顺序栈中,0表示栈底部的位置// 所以初始应赋小于0的值,常用 -1S.top = -1;
}// 判断栈空
bool StackEmpty(SeqStack S) {// 空栈条件:栈顶指针等于-1!!!// 说明栈中没有任何元素if(S.top == -1) {return true;} else {return false;}
}// 进栈操作
// 类似于线性表的插入操作,即“增”操作
// 但由于栈的特殊性,只允许在栈顶进行操作,所以可称为进栈操作
// 即在栈顶增加元素
bool Push(SeqStack &S, char x) {// 判断栈是否已满,由于top是静态数组最后一个元素的下标(栈顶元素下标)// 所以只需要判断top值是否已经达到静态数组最大长度-1即可if(S.top == MaxSize - 1) {return false;}// top指针+1-->下标加一,指向数组后一位S.top = S.top + 1;// 新元素入栈S.data[S.top] = x;// 以上操作等价于S.data[++S.top] = x;return true;
}// 出栈操作
// 类似于线性表的删除操作,即“删”操作
// 但由于栈的特殊性,只允许在栈顶进行操作,所以可称为出栈操作
// 即在栈顶弹出元素
bool Pop(SeqStack &S, char &x) {// 栈顶指针等于-1,栈为空,不可删除if(S.top == -1) {return false;}// 注意:虽然在此处出栈操作栈顶指针减一,可视为删除成功// 但实际上数据仍然保留在存储单元中,只是从逻辑上删除了// 将栈顶元素赋给x,x为引用变量,可从外部获取弹出的数据x = S.data[S.top];// 栈顶指针减一S.top = S.top - 1;// 以上操作等价于x= S.data[S.top--]return true;
}// 算法实现——括号匹配
bool bracketCheck(char str[], int length) {SeqStack 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);
}int main() {char a[] = "[([][])]";if(bracketCheck(a, 8)) {printf("The match is successful");}
}
5.运行结果
【数据结构】【栈】括号匹配算法(可直接运行)相关推荐
- JVM【带着问题去学习 02】数据结构栈+本地方法栈+虚拟机栈+JVM栈运行原理
1.数据结构栈 栈是一种比较简单的数据结构,后进先出.栈本身是一个线性表,但是这个表中只有一端允许数据的进出.栈的常用操作包括入栈push和出栈pop,对应于数据的压入和弹出.由于栈后进先出的特性,常 ...
- 数据结构——栈的应用
栈结构固有的"后进先出"特性,使得栈成为程序设计中的有用工具,下文将讨论几个栈应用的典型例子,本文各经典案例的代码实现均采用顺序栈的结构,如有需要,在理解算法思想的基础上,不难将其 ...
- 括号匹配算法 java_括号匹配算法
括号匹配算法 题目来自网络搜集和常考算法,如有侵权请联系我 题目描述 给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列 括号必须以正确的 ...
- java虚拟机栈帧_Java虚拟机,运行时栈帧结构
业余生活要有意义,不要越轨.--华盛顿 引导语 "虚拟机"是一个相对于"物理机"的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器. ...
- 数据结构栈队列链表数组
目录: 数据结构 栈(stack) 队列 链表 数组 数据结构 数据结构是什么 简单来说,数据结构就是设计数据以何种方式存储在计算机中 比如:列表,集合,与字典等都是一种数据结构 程序 = 数据结构 ...
- 括号匹配编码c语言,用c语言实现括号匹配算法
/*括号匹配算法*/ #include #define FALSE 0 #define TRUE 1 #define MAXSIZE 100 typedef char DataType; //定义栈 ...
- 怎么删除结构体数组中的一组数据_数据结构-栈
数据结构-栈 1)栈的定义. 栈是只能通过访问它的一端来实数据存储和检索的一种线性数据结构,逻辑结构和线性表相同.特点在于运算有所限制:即主要特征是"后进先出"(先进后出). 在栈 ...
- 数据结构栈和队列_使您的列表更上一层楼:链接列表和队列数据结构
数据结构栈和队列 When you want to store several elements somewhere in a program, the go-to data type is an a ...
- 数据结构栈的知识_数据知识栈
数据结构栈的知识 并发不适合胆小者 我们都知道并发编程很难正确实现. 这就是为什么在执行线程任务之后要进行大量的设计和代码审查会议. 您永远不会将并发问题分配给经验不足的开发人员. 仔细分析问题空间, ...
- 栈的top指针指向哪里_数据结构-栈
数据结构-栈 更简单的介绍,在<程序是怎样跑起来的>一书中有简要形象的说明 一.栈的基本概念 栈是一种特殊的线性表,其插入删除操作都只能在表的尾部进行. 栈中允许插入.删除操作的一端称为栈 ...
最新文章
- Python面向对象编程:深度认识类class
- 队列优化dijsktra(SPFA)的玄学优化
- linux 测试vim编译器_推荐几个好用的在线编译器
- 实战SSM_O2O商铺_38【商品类别】解除商品与商品类别的关联
- obs多推流地址_抖音obs推流直播怎么操作,抖音直播推流地址如何获取?
- MaxScript 学习笔记【有转载】
- ubuntu apt 相关命令
- E百科 | 基于MEC的边缘AI服务
- KR C 传统C语言的函数定义
- how to debug Opportunity change implementation - entry onOKParticipantDialog
- java版本号分段比较_Java实现比较版本号
- matlab fft函数说明_关于“如何使用FFT计算天线阵列方向图”学习资料总结
- 《Android安全技术揭秘与防范》——第2章,第2.1节钱从哪里来
- Salesforce Ventures为云初创公司Vlocity注资5000万美元
- 排序算法之——堆排序分析
- Project项目视图
- Linux网络编程和套接字
- arp包导致linux设备丢包,arp包导致的网络拥挤
- Qt三方库开发技术:二维码生成、识别以及条码识别
- mit计算机33门课程_550多门免费在线编程和计算机科学课程,您可以在本年十月开始...
热门文章
- C#联合Halcon用于判断图像前景/背景,若前景目标区域连通域个数超越某阈值,则展开评价;否则不计入评价
- 中国中药专利数据库检索系统(CTCMPD)
- 如何利用局域网的资源打内线IP电话
- 帮我综述一下人体步态协同分析的研究现状
- 更改tomcat文件导致项目无法启动记录org.apache.jasper.JasperException
- 为了方便调试程序 php提供了什么函数,下列关于整型的表示方式正确的是( )。...
- OpenCVSharp 4.5 光流
- Mysql 事务(标贝科技)
- Java 根据身份证号计算周岁年龄 工具类
- linux tcp setsockopt,linux网络编程系列(五)--setsockopt的经常使用选项