递归应用之括号匹配检验

来源:互联网 发布: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
0 0
原创粉丝点击