{ ( hey! )[不管是电子表还是劳力士,他们的指针都是一样转动的。] } )

宁是否发现了不舒服的地方,oh这种事是无法让强迫症忍受的,没错,这里的括号是不匹配的,就像C语言中,如果你输入的括号不能匹配,那么编译就会出错,如何检测括号是否匹配就是我们今天的任务。

谈谈思路吧,首先是将数据输入,我打算将括号作为字符一个个的存入栈中,那怎样检测括号是否匹配呢?我想这不简单嘛,既然字符都在栈中,那我就先从第一个字符开始,遍历整个栈寻找与其匹配的字符,若没有那就看下一个栈,再遍历,再看下一个再遍历,直到最后的栈。好嘛,这一趟下来算法复杂度为O(N2),不可不可,严格(fang)要求(zong)自己的小橘子决定优化算法。

算法如下:粗略的说,一个一个将括号入栈,左括号直接入栈,右括号就判段栈顶的左括号是否和它匹配,不配,就把右括号入栈,配,就把栈顶元素出栈。
详细的解析如下:

Created with Raphaël 2.2.0输入判断括号是否为左括号进栈首先检查栈是否空进栈和栈顶元素比较是否匹配左括号出栈进栈yesnoyesnoyesno

结束循环后,判断栈是否为空,栈空则表示括号匹配。

#include<stdio.h>
#include<stdlib.h>typedef struct
{char * base;char * top;int stacksize;
}stack;void initstack(stack*s)//栈的初始化函数
{s->base = (char*)malloc(sizeof(char));if (!s->base)//检测内存是否分配成功{exit(0);}s->base = s->top;s->stacksize = 10;
}void push(stack*s, char x)//入栈函数
{if (s->top - s->base >= s->stacksize)//先检测是否发生上溢{s->base = (char*)realloc(s->base, (s->stacksize + 10) * sizeof(char));//若发生,则增加10个内存空间(动态扩容)if (!s->base)//检测内存是否分配成功{exit(0);}s->stacksize = s->stacksize + 10;s->top = s->base + 10;}*s->top = x;s->top++;
}int main()
{stack * s = (stack*)malloc(sizeof(stack));initstack(s);char c;printf("请输入测试用例(如{[]()}#,#标志输入结束):");c=getchar();push(s,c);while (c != '#'){c=getchar();if (c == '{'||c == '('||c == '['){push(s, c);}if (c == '}'||c == ')'||c == ']'){if (s->base == s->top){push(s, c);}if (c == '}'){if (*--(s->top) == '{')//这里解释下,*--(s->top)很明显是栈顶元素,但是这个操作已经实现了top--。变相的实现了pop功能。所以实际上是没有删除栈中的元素,只是移动top指针,不断的覆盖元素。{//top--已经实现,这里不需要任何操作}else{push(s, c);}}if (c == ')'){if (*--(s->top) == '('){}else{push(s, c);}}if (c == ']'){if (*--(s->top) == '['){}else{push(s, c);}}}}if (s->base == s->top){printf("你是个正常人");}else{printf("你可能眼睛不太好");}return 0;
}

have a look please

栈应用之括号匹配(C语言)相关推荐

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

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

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

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

  3. JAVA栈应用之括号匹配

    JAVA栈应用之括号匹配 在数据处理中,常常要判断数据中的括号,应用栈来处理及其方便. 当用户输入一个字符串时,遇到左括号时,将其入栈,如'(' '["'{,而遇到右括号时,如')" ...

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

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

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

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

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

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

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

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

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

    1.算法描述 在括号匹配算法中定义int flag = 1变量来标记匹配结果是成功还是失败! 利用数据结构栈,从左到右依次扫描字符串:若是遇到左括号入栈:若是遇到右括号:若栈非空,使用Pop(s,to ...

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

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

最新文章

  1. 老司机带你深入浅出 Collection
  2. FineUI(开源版)v6.0中FState服务器端验证的实现原理
  3. centos 推荐使用epel源
  4. URAL - 1114-Boxes (分步乘法原理)
  5. 【Java】基于注解开发初探
  6. 高级转录组分析和R数据可视化第十一期(报名线上课还可免费参加线下课)
  7. 2.3线性表的链式表示和实现
  8. 赋予用户最高权限的一点“挫折”
  9. 原生js导出excel,并保留样式
  10. LayaAir 2.9.0的3D渲染效果大幅提升(支持CommandBuffer、反射探针等众多3D功能)、插件功能大幅升级...
  11. 《波西亚时光》为配音员未付薪金提供补偿
  12. 苹果真的老了!iphone XR降价跌至6500,与iphone X有很大差距
  13. 华硕飞行堡垒7代笔记本电脑开机键盘亮黑屏解决办法
  14. 《纽约时报》发文评选掀起区块链革命的10位代表性人物,吴忌寒上榜
  15. 2022年,软件测试还能学吗?别学了,软件测试岗位饱和了...
  16. 股神巴菲特忠告中国股民及巴菲特忠告中国股民把控风险
  17. 为什么你的抖音号涨粉慢,粉丝上不去的关键原因
  18. 创龙TI KeyStone C66x多核定点/浮点TMS320C6678 DSP开发板处理器、NAND FLASH、NOR FLASH
  19. Unity Render Texture 的使用
  20. EACCES: access denied‘ does your client key have mgr caps

热门文章

  1. java对象内存布局及大小
  2. java中super的用途
  3. 用Toolkit 高效集成HMS Core,程序员下班都早一点
  4. 功夫熊猫经典台词:退出,不退出。做面条,不做面条。
  5. LTE学习笔记:模三干扰
  6. npm ERR code ELIFECYCLE解决方案
  7. 高德地图POI信息获取——爬虫小实验
  8. 数据字典的QUAN DEC类型与ABAP P型转换
  9. 如何用javascript api for arcgis调用有参数的GP服务
  10. 五个最新的CSS特性以及如何使用它们