用链栈实现字符串表达式括号匹配算法
2017-07-29 19:27
417 查看
字符串表达式括号匹配算法思路:
1、遍历字符串中的字符,遇到左括号字符先压入栈,遇到右括号,栈顶字符出栈与之进行比较,如果配对则继续循环遍历下一字符,否则就返回不匹配。例如:(6*3]
2、遍历过程中,若栈为空,但当前字符是右括号时,则返回匹配失败。例如:(7-1))
3、遍历完字符串后,若发现栈不为空,则返回不匹配。例如:(5/2
4、从第二个字符遍历开始,如果当前字符是数字,则前一个字符如果是右括号,则返回不匹配。例如:(6+)5
5、如字符串中没有括号时,返回匹配失败。例如:5+3
注意:要是这些条件都不满足,就返回匹配成功。匹配成功打印yes,匹配失败打印no。虽然感觉思路正确,但有时输入正确的括号也会打印no,原因是刚开始在每次输入字符串前没有把栈清空,这在代码中已修改。
1、遍历字符串中的字符,遇到左括号字符先压入栈,遇到右括号,栈顶字符出栈与之进行比较,如果配对则继续循环遍历下一字符,否则就返回不匹配。例如:(6*3]
2、遍历过程中,若栈为空,但当前字符是右括号时,则返回匹配失败。例如:(7-1))
3、遍历完字符串后,若发现栈不为空,则返回不匹配。例如:(5/2
4、从第二个字符遍历开始,如果当前字符是数字,则前一个字符如果是右括号,则返回不匹配。例如:(6+)5
5、如字符串中没有括号时,返回匹配失败。例如:5+3
注意:要是这些条件都不满足,就返回匹配成功。匹配成功打印yes,匹配失败打印no。虽然感觉思路正确,但有时输入正确的括号也会打印no,原因是刚开始在每次输入字符串前没有把栈清空,这在代码中已修改。
#include "linkstack.h" #include <stdio.h> int main() { LinkStack ls; InitStack(&ls); char str[100] = {0}; while (1) { gets(str); //当输入end时结束 if (strcmp(str,"end")==0) { break; } int flag = 1,i; int len = strlen(str); for(i=0;i < len;i++) { if (i != 0) { if (str[i] >= '0' && str[i] <= '9') { //如果当前符号是数字,且它的前一个字符是右括号时,则返回不匹配 if (str[i-1]==')' || str[i-1]=='}' || str[i-1]==']') { flag = 0; break; } } } if(str[i]=='{'||str[i]=='('||str[i]=='[') { Push(&ls,str[i]); } else { //如果栈为空,则匹配 if(StackEmpty(ls) && (str[i]==')' || str[i]=='}' || str[i]==']')) { flag = 0; } else if((str[i]=='}'&&Top(ls)=='{')||(str[i]==')'&&Top(ls)=='(')||(str[i]==']'&&Top(ls)=='[')) //判断当前字符是否和栈顶元素配对,若配对,则将栈顶符号弹栈 { Pop(&ls); } else { flag = 1; } } } //判断字符串中是否有左括号 if (strchr(str,'(') == NULL && strchr(str,'[') == NULL && strchr(str,'{') == NULL) { flag = 0; } //如果栈不为空,则返回匹配失败 if (!StackEmpty(ls)) { //每次输入字符串前先把栈清空。 ClearStack(&ls); flag = 0; } if(flag==0) { printf("No\n"); } else { printf("Yes\n"); } } return 0; }
相关文章推荐
- C语言实现括号匹配,中缀表达式转后缀表达式并计算的算法
- 实现一个比较高级的字符匹配算法,即一串很长的字符,要求找到符合要求字符的字符串
- <仅是自己做笔记。。。系列15>实现一个挺高级的字符匹配算法: 给一串很长字符串,要求找到符合要求的字符串,例如目的串:123 1******3***2 ,12*****3这些都要找出来
- 使用boost库的正则表达式regex实现从一篇文档中找出所有匹配的字符串
- java 算法实现字符串的匹配
- java实现字符串的一般和KMP模式匹配算法
- 实现一个挺高级的字符匹配算法: 给一串很长字符串,要求找到符合要求的字符串,例如目的串:123 1******3***2 ,12*****3 这些都要找出来
- C++实现算术表达式的括号匹配
- 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
- [算法]简单的字符串近似匹配算法实现
- Java堆栈的应用1----------堆栈的自定义实现以及括号匹配算法的Java实现
- (1.2.2.1)栈和队列的应用:数制转换、括号匹配、后缀表达式求解,中缀表达式求解、双栈实现队列,min函数栈
- 基于PHP实现栈数据结构和括号匹配算法示例
- KMP字符串模式匹配算法实现
- 常见算法题:判断表达式括号是否匹配
- 使用栈实现括号匹配算法-java
- #牛客#代码实现:字符串的匹配、字符串的交错组成、纸牌博弈、表达式组合
- 简单算法——使用栈实现括号匹配检验
- 正则表达式实现——匹配括号中的A 以及 匹配非括号中的A
- C/C++数据结构通过顺序栈实现括号()匹配算法