递归应用之括号匹配检验
来源:互联网 发布:fw190d13数据 编辑:程序博客网 时间:2024/06/06 21:41
括号匹配检验还可以用栈来解决,参见我的另一篇文章《栈的应用之括号匹配检验》
这里给出一个C++程序,结合注释来看是如何实现的。
#include <iostream>using namespace std;bool judge(char* str);//括号检验主体函数bool match(char *,char,int &);//递归调用的匹配检验函数//判断是否为左、右括号,是否为一对括号bool isLeft(char);bool isRight(char);bool isPair(char,char);int main(){ char str[30]; cin>>str; cout<<(judge(str)? "Succeeded":"Failed")<<endl; return 0;}bool isLeft(char c){ if(c=='(' || c=='[' || c=='{') return true; else return false;}bool isRight(char c){ if(c==')' || c==']' || c=='}') return true; else return false;}//括号匹配检验主体函数bool judge(char * str){ bool tag = true; int i = 0; //trim(str); while(str[i]!='\0') {//遇到左括号,字符串右移一位,调用match函数 if(isLeft(str[i])) { if(!match(str,str[i++],i)) {//匹配失败,结束while循环 tag = false; break; } ++i;//匹配成功,字符串右移一位,直接进入下次循环 continue; }//在主体函数不应该遇到右括号,匹配失败,结束循环 else if(isRight(str[i])) { tag = false; break; } else ++i;//遇到非括号字符,跳过 } return tag;}//判断是否成对bool isPair(char l, char r){ if(l=='(') return r==')'? true:false; else return r==l+2 ? true:false;}//递归调用的匹配检验函数bool match(char *str,char left, int &i){start: //在这个函数中遇到结束符,说明字符串结束时,仍有未被匹配的左括号 if(str[i]=='\0') return false; //遇到新的左括号,字符串右移一位,递归 else if(isLeft(str[i])) {//匹配失败,返回false if(!match(str,str[i++],i)) return false; else { //新括号匹配成功,则继续寻求匹配原(外层)括号 i++; goto start;//需要回到函数起始部分 } } else if(isRight(str[i])) {//用新遇到的右括号匹配当前的左括号 if(isPair(left,str[i])) return true; else return false; } else//遇到其他字符,忽略 { ++i; goto start; } //return true; //这个return应该不需要,暂时注释掉}
测试:
输入:( ( ( ) ) ) { [ [ ] [ ] ] } 输出:Succeeded
输入:{ 2 * [1+3*(1+9) ] } 输出:Succeeded
输入:{ [ [ [ ] ( ) ] } 输出:Failed
输入:{ [ [ [ ] ( ) ] } 输出:Failed
0 0
- 递归应用之括号匹配检验
- 栈的应用之括号匹配检验
- 栈的应用之括号匹配的检验
- 栈的应用之括号匹配的检验
- 栈的应用之二----------括号匹配的检验
- 栈应用--括号匹配的检验
- 数据结构应用-----------括号匹配的检验
- 栈的应用--括号匹配的检验
- 8、数据结构笔记之八栈的应用之括号匹配检验实现
- 括号匹配的检验
- 堆栈--括号匹配检验
- 括号的匹配检验
- 括号匹配的检验
- 括号匹配的检验
- 括号匹配检验
- 括号匹配的检验
- 8586 括号匹配检验
- 括号匹配检验 c++
- 第16题
- 完整版的Socket服务器端
- 2010年哈尔滨工业大学计算机研究生机试真题
- DELPHI获得系统当前时间日期和格式化时间
- jvm内存使用情况
- 递归应用之括号匹配检验
- AIDL实现跨进程通信
- 在Visual Studio中使用AnkhSVN和Beyond Compare
- 第五周项目1 体验常成员函数
- vim 命令总结(持续更新)
- 《Java程序设计》第一次作业:简单的JAVA源代码之计算器
- C++变量类型的那些事
- Nginx 实时生成缩略图
- linux下进程的最大线程数、进程最大数、进程打开的文件数