1、算法描述

在括号匹配算法中定义int flag = 1变量来标记匹配结果是成功还是失败!

利用数据结构栈,从左到右依次扫描字符串:若是遇到左括号入栈;若是遇到右括号:若栈非空,使用Pop(s,topElem)操作得到栈顶元素,与当前的右括号进行匹配。若是当前的右括号与栈顶元素不匹配,那么修改flag的值为0,匹配失败,并且打印错误信息!若栈为空,则说明当前所有扫描的右括号均无法没有左括号与之匹配,修改flag为0,匹配失败,并且打印错误信息!  从左到右扫描完整个字符串之后:若栈为空且 flag的值为1,即为匹配成功!(因为若是没有flag,那么(]这种情况也是匹配成功!所以算法的逻辑将会产生错误!)否则其余情况均是匹配失败!

2、具体代码如下

//括号匹配算法#include<stdio.h>
#include<stdlib.h> //malloc函数的头文件
#define MaxSize 20
#include<iostream>
using namespace std;
#define OK 1;
#define ERROR 0; //结构体定义
typedef struct{char *data;  //存储空间的基地址 int top;     //栈顶指针记录下标
}SqStack;//初始化栈
void InitStack(SqStack &s){s.data = (char *) malloc(sizeof(char)*MaxSize); s.top = -1;
} //判断栈是否为空
int SqStackIsEmpty(SqStack s) {if (s.top == -1)return OK; //栈空return ERROR;  //栈不为空
}//入栈操作
void Push(SqStack &s,char c){if(s.top == MaxSize - 1)   //栈满 printf("栈满!\n");s.top = s.top + 1;s.data[s.top] = c;
} //出栈操作
void Pop(SqStack &s, char &c){if(SqStackIsEmpty(s))printf("栈空!\n");c = s.data[s.top];s.top = s.top - 1;
} //括号匹配函数
void bracketCheck(char str[], int length){SqStack s;InitStack(s); int flag = 1; //标志是否匹配成功 for(int i = 0; i<length;i++){if(str[i] == '(' || str[i] == '[' || str[i] == '{'){Push(s,str[i]); //从左到右扫描,遇见左括号就执行入栈操作 }else if(str[i] == ')' || str[i] == ']' || str[i] == '}'){ //遇见右括号判断栈中符号 if(!SqStackIsEmpty(s)){char topElem;Pop(s,topElem);if(str[i] == ')' && topElem != '('){flag = 0; printf("匹配失败,第 %d 个右括号 %c 与栈顶符号 %c 不匹配\n",i+1,str[i],topElem); }  if(str[i] == ']' && topElem != '['){flag = 0; printf("匹配失败,第 %d 个右括号 %c 与栈顶符号 %c 不匹配\n",i+1,str[i],topElem);}if(str[i] == '}' && topElem != '{'){flag = 0; printf("匹配失败,第 %d 个右括号 %c 与栈顶符号 %c 不匹配\n",i+1,str[i],topElem);}}else  {printf("\n匹配失败,第 %d 个是单身右括号 %c \n",i+1,str[i]); //栈空,存在单身右括号flag = 0;}}}if(SqStackIsEmpty(s) && flag == 1){printf("\n匹配成功!!!!!!!\n");} else printf("\n匹配失败!!!!!!!\n");
}//主函数
int main(){char str[MaxSize] = "\0"; //字符数组初始化\0//puts(str);printf("请输入您要判断的表达式:\t");gets(str);printf("\n");bracketCheck(str,MaxSize);
} 

3、核心代码

//括号匹配函数
void bracketCheck(char str[], int length){SqStack s;InitStack(s); int flag = 1; //标志是否匹配成功 for(int i = 0; i<length;i++){if(str[i] == '(' || str[i] == '[' || str[i] == '{'){Push(s,str[i]); //从左到右扫描,遇见左括号就执行入栈操作 }else if(str[i] == ')' || str[i] == ']' || str[i] == '}'){ //遇见右括号判断栈中符号 if(!SqStackIsEmpty(s)){char topElem;Pop(s,topElem);if(str[i] == ')' && topElem != '('){flag = 0; printf("匹配失败,第 %d 个右括号 %c 与栈顶符号 %c 不匹配\n",i+1,str[i],topElem); }  if(str[i] == ']' && topElem != '['){flag = 0; printf("匹配失败,第 %d 个右括号 %c 与栈顶符号 %c 不匹配\n",i+1,str[i],topElem);}if(str[i] == '}' && topElem != '{'){flag = 0; printf("匹配失败,第 %d 个右括号 %c 与栈顶符号 %c 不匹配\n",i+1,str[i],topElem);}}else  {printf("\n匹配失败,第 %d 个是单身右括号 %c \n",i+1,str[i]); //栈空,存在单身右括号flag = 0;}}}if(SqStackIsEmpty(s) && flag == 1){printf("\n匹配成功!!!!!!!\n");} else printf("\n匹配失败!!!!!!!\n");
}

如果不使用c语言,上面的入栈、退栈等各种操作可以使用c++、java中自定义好的栈来直接操作,简化代码!

4、代码演示



5、算法分析

此算法从头到尾扫描整个算式表达式中的每一个字符,若算式表达式的字符串长度是n,该算法的时间复杂度为O(n)。算法在运行时所占用的辅助空间主要取决于OPTR栈和OPAD栈的大小,显然他们的空间大小之和不会超过n,所以该算法的空间复杂度也是O(n)

栈的应用-括号匹配的检验相关推荐

  1. 栈的应用--括号匹配的检验

    算法中设置一个栈,每次读入一个括号,若是右括号,则或者与置于栈顶的括号匹配,或者是不合法的情况,若是左括号,则入栈.若算法结束,栈是空的,则括号合法. 括号匹配函数 Status bracket_ma ...

  2. c语言括号匹配的检验,检验括号匹配的算法

    用栈实现检验括号匹配的算法没啥具体描述,数据结构的知识,急用,有重赏 思想是 先进栈,获取第一个半边括号,标记一下,继续进栈直到获取到第二个与之匹配的另一外括号,然后出栈,取出内容.就这样.. 数据结 ...

  3. 字符串括号匹配c语言,数据结构C语言括号的检验源程序 , 数据结构(C) 请用类C语言实现括号匹配的检验这个算法...

    问题标题 数据结构C语言括号的检验源程序 , 数据结构(C) 请用类C语言实现括号匹配的检验这个算法 2019-8-21来自ip:13.149.196.77的网友咨询 浏览量:270 手机版 问题补充 ...

  4. 栈应用之 括号匹配问题(Python 版)

    栈应用之 括号匹配问题(Python 版) 检查括号是否闭合 循序扫描被检查正文(一个字符)里的一个个字符 检查中跳过无关字符(所有非括号字符都与当前处理无关) 遇到开括号将其压入栈 遇到闭括号时弹出 ...

  5. 数据结构实验之栈四:括号匹配

     数据结构实验之栈四:括号匹配 Description 给你一串字符,不超过50个字符,可能包括括号.数字.字母.标点符号.空格,你的任务是检查这一串字符中的( ) ,[ ],{ }是否匹配. Inp ...

  6. sdut 数据结构实验之栈四:括号匹配

    数据结构实验之栈四:括号匹配 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description ...

  7. c语言栈训练题目:括号匹配

    c语言栈训练题目:括号匹配 基本思路: 当前字符不是括号,不做处理: 当前字符是左括号,则进栈: 当前字符是右括号:若栈空,则表明该"右括号"多余,不匹 配,结束:否则和栈顶元素比 ...

  8. 栈的应用 括号匹配 c++

    在算术表达式中,除了加.减.乘.除等运算外,往往还有括号.包括有大括号{},中括号[],小括号(),尖括号<>等. 对于每一对括号,必须先左边括号,然后右边括号:如果有多个括号,则每种类型 ...

  9. 栈应用之括号匹配(C语言)

    { ( hey! )[不管是电子表还是劳力士,他们的指针都是一样转动的.] } ) 宁是否发现了不舒服的地方,oh这种事是无法让强迫症忍受的,没错,这里的括号是不匹配的,就像C语言中,如果你输入的括号 ...

最新文章

  1. LeetCode 316. Remove Duplicate Letters--贪心--Java,C++,Python解法
  2. 实例详解 DB2 排序监控和调优
  3. 【转】FFmpeg获取DirectShow设备数据(摄像头,录屏)
  4. 中国大陆开源镜像站汇总
  5. UnicodeEncodeError: 'ascii' codec can't encode character
  6. revit2019 导出obj_revit、3dmax导出object文件软件操作说明.doc
  7. 查看 SAP Kyma 上一个 pod 的运行日志
  8. java环境classpath_Java开发环境配置之Path和classpath
  9. 如何将dataset中的值赋值给datatable_金融行业实战项目:如何理解业务?
  10. win7右键没有新建文件夹了
  11. SharedPreferences的使用,android
  12. 小米手机修改imei教程_小米手机imei码和s/n码以及测试调试界面唤起代码
  13. video-js rtmp直播、this .el_vjs_getproperty问题、多个rtmp播放、可用rtmp地址
  14. webp格式怎么改png?如何将webp转换格式?
  15. 手机通过RNDIS共享网络
  16. 电脑桌面图标文字有蓝底怎么去掉?
  17. 在linux系统下忘记了root密码,在linux系统下,忘记了root密码,可以到()模式下修改找回root密码()...
  18. 笨办法学Python笔记2(ex18~ex40)
  19. 4.Nginx优化,谁用谁说好
  20. 天大的本事,顶不上一张会说话的嘴

热门文章

  1. 实用分屏软件 Acer GridVista
  2. linux top 源码,在Linux系统中下载源码包安装Topgrade的方法,附Topgrade选项说明
  3. 在ipad上刷android系统更新,全自动刷安卓4.0 索尼SGPT111刷机教程
  4. 高数 |【23数一 李林六套卷】卷二 自用思路 及 知识点 整理
  5. Linux运维学习教程
  6. Dom解析器使用实例
  7. php网站统一登录,php新浪通行证、新浪微博模拟统一登录(后台网页抓取版)2016
  8. 基于STM32的单片2KW+全数控移相全桥开关电源研发记录
  9. 209-希尔排序算法的思想和性能分析
  10. Arduino ESP32 flash数据存储结构