栈 括号匹配问题(C语言)

栈 括号匹配问题

问题描述:

假设一个算术表达式中可以包含三种括号:圆括号“(”和“)”,方括号“[”和“]”和花括号“{”和“ }”,且这
三种括号可按任意的次序嵌套使用(如:…[…{… …[…]…]…[…]…(…)…)。编写判别给定表达式
中所含括号是否正确配对出现的算法。输出结果YES 或者 NO。

解法:

   先定义一个char型的数组,空间大小根据实际情况定义
char arr[100];

输入字符串
开始循环,直到arr为空;

检测每一个字符,如果字符为’ ( ’ 、‘ { ’或者’ [ ’,将字符入栈;如果不是这三个字符,先获取栈顶元素,赋值给x(如下),如果栈顶元素为’ ( ’同时arr[i]为‘ ) ’或者栈顶元素为’ { ’同时arr[i]为‘ } ’或者栈顶元素为’ [ ’同时arr[i]为‘ ] ’,将栈顶元素出栈。

for(i = 0;arr[i]!='\0';i++){if(arr[i] == '('||arr[i] == '{'||arr[i] == '['){push(s,arr[i]);}top(s,&x);if((arr[i]==')'&&x == '(')||arr[i]=='}'&&x == '{'||arr[i]==']'&&x == '['){pop(s);}}

循环完数组之后,如果栈为空,说明括号全都可以匹配,输出YES;如果栈不为空,就说明有不能匹配的括号,输出NO;

完整代码

#include <stdio.h>
#include <stdlib.h>
#define true 1
#define false 0
#define INIT_SIZE 100
#define STACK_INCREASE 10char arr[100];
typedef struct Stack
{int *base;int *top;int stackSize;
} Stack;//初始化栈
int InitStack(Stack *s)
{s->base = (int*)malloc(sizeof(int) * INIT_SIZE);if(!s->base){return false;}s->top = s->base;s->stackSize = INIT_SIZE;return true;
}//插入数据
int push(Stack *s,int data)
{if(s->top - s->base == s->stackSize){s->top = s->base + s->stackSize;s->base = (int *)realloc(s->base,s->stackSize + STACK_INCREASE*sizeof(int));if(!s->base){return false;}}*s->top = data;s->top++;return true;
}//弹出栈
int pop(Stack *s)
{if(s->top == s->base){return false;}s->top--;//*x = *s->top;return true;
}//判断是否为空
int IsEmpty(Stack *s)
{if(s->top == s->base){return true;}else{return false;}
}int top(Stack *s,int*x)
{if(s->top == s->base){return false;}*x = *(s->top-1);return true;
}
int mate(Stack *s)
{int i;int x;for(i = 0; arr[i]!='\0'; i++){if(arr[i] == '('||arr[i] == '{'||arr[i] == '['){push(s,arr[i]);  //如果是左括号,入栈;}top(s,&x);if((arr[i]==')'&&x == '(')||arr[i]=='}'&&x == '{'||arr[i]==']'&&x == '['){pop(s);}}if(IsEmpty(s)==1){printf("YES");}else{printf("NO");}return true;
}
int main()
{Stack *s = (Stack *)malloc(sizeof(Stack));InitStack(s);scanf("%s",&arr);    //输入字符串mate(s);     //括号匹配return 0;
}

栈 括号匹配问题(C语言)相关推荐

  1. 利用栈进行数制转换和括号匹配(C语言)

    数制转换:将十进制数转换为任意进制数.由数制转换的计算公式 N = (N / d) × d + N % d (其中N为想转换的十进制数,d为想转换的进制) 我们可以知道其转换后的结果是逆序输出,故可以 ...

  2. 括号匹配openjudge c语言,OpenJudge计算概论-扩号匹配问题【这个用到了栈的思想】...

    /*====================================================================== 扩号匹配问题 总时间限制: 1000ms 内存限制: ...

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

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

  4. 括号匹配检查c语言,c 语言 检查括号匹配 不能运行 ????

    各位请帮我看一下这个东西, 我要在c语言中实现括号匹配,设计思路:把从链栈中扫描得到的'}',']',')'先存储到动态申请的内存空间中,当扫描到'{','[','('时 在弹出先前存储的')','] ...

  5. 括号匹配编码c语言,用c语言实现括号匹配算法

    /*括号匹配算法*/ #include #define FALSE 0 #define TRUE 1 #define MAXSIZE 100 typedef char DataType; //定义栈 ...

  6. 栈——括号匹配(洛谷 Uva673)

    题目选自洛谷Uva673 括号匹配是和栈有关的经典算法问题 每次入栈的时候判断栈的顶部是不是这个符号的另一半,如果是就pop并且这个符号也不入栈,如果不是就入栈.最后判断栈是否为空,如果为空,说明正确 ...

  7. 括号配对c语言,括号匹配(c语言实现)

    1要求 编写程序检查该字符串的括号是否成对出现,而且不能交叉出现. 输入: 一个字符串,里边可能包含"()"."{}"."[]"三种括号,& ...

  8. SWUST OJ 962: 括号匹配问题(C语言实现)

    看了网上一些关于这道题的解法,发现许多都写得很繁琐,简单的题当然简单做啦,所以码了一个比较简洁没有任何技术含量的解法~~ 大的思路当然是一样的,'(' 和 '[' 进栈,遇到 ')' 和 ']' 就判 ...

  9. 括号匹配编码c语言,括号匹配(c语言实现)

    1要求 编写程序检查该字符串的括号是否成对出现,而且不能交叉出现. 输入: 一个字符串,里边可能包含"()"."{}"."[]"三种括号,& ...

最新文章

  1. 【AI白身境】Linux干活三板斧,shell、vim和git
  2. boost::outcome模块comparison相关的测试程序
  3. 经典算法(5)- 用二进制方法实现扩展的最大公约数(Extended GCD)
  4. 漫画:什么是布隆算法
  5. 智能工单处理,达观数据助力运营商实现业务流程智能化改造
  6. 25马5跑道,求最快的五匹马的需要比赛的次数
  7. 开发实践丨用小熊派STM32开发板模拟自动售货机
  8. Elasticsearch head插件
  9. 算法概论第八章课后习题8.3
  10. HTML转义字符大全(转)
  11. C++11 实现线程池
  12. 考研计算机网络复试题目整理
  13. java打包apk_APK打包流程
  14. AAAI2020论文列表(中英对照)
  15. 【Android学习】图片
  16. 基于WiFi的人体感知
  17. 丢手帕问题(约瑟夫问题)
  18. win10 3D查看器glb和3mf格式模型
  19. 「深圳二手房」成交激增会不会是楼市转机的标志?
  20. 360网站卫士推出风行计划 号称速度提升5倍

热门文章

  1. jforum无法发布帖子问题
  2. maven多模块依赖导入失败以及私服下载包卡死
  3. 最近发现一个很全面的历史网站,包含世界各国各个时代内容
  4. 【生态环境保护】绿水青山就是金山银山——生态环保篇
  5. RTL-SDR 学习——什么是RTL-SDR(1)
  6. cad怎样转换成pdf格式?四个步骤完成
  7. Android 什么是Hook
  8. Win10安装 sql2008 R2
  9. 【泛函分析】平衡集和吸收集
  10. 网络舆情分析的三个步骤及具体实施方案