读书人

思索三夜也未得思路的递归算法题向各

发布时间: 2012-04-25 19:32:32 作者: rapoo

思索三夜也未得思路的递归算法题,向各位大侠求助!
写出识别字符串内括号匹配问题的递归解决方案,使表达式可以包含三种类型的界定符:(),[]和{}。例如:{ab(c[d]){e}}是正确的,而{a[(b]c)则不是。

要求:空串是匹配的,对非界定符忽略,必须是递归算法,最好是用C/C++代码或伪代码描述。

望出手相助,感激不尽!!

[解决办法]
既然要求是递归解决

想必是要分出子问题的

正则匹配外层难,平衡组不是所有语言都支持的
但是匹配最里层的却非常容易
[解决办法]

C/C++ code
// mytree.cpp : 定义控制台应用程序的入口点。//#include<iostream>int function(char a[]){    int i=0,leap = 0;//the length of     char type = a[0];    for(i =1 ;a[i];i++)        {            switch (a[i])            {            case '(':case '{':    case '['://get a bracket                //only int the case that we bracket                //we call the function()                if(leap = function(a+i))                    {                        i += leap;                        break;                }//leap over the string that scanf in  recursive function                else                    return 0;//bad            case ')':                if(type != '(')                    return 0;                 else                    goto LOOP;            case '}':                if('{' != type)                    return 0;                else                    goto LOOP;            case ']':                if('[' != type)                    return 0;                else                    goto LOOP;             }        }    LOOP:return i;}int _tmain(int argc, _TCHAR* argv[]){    char a[100] = "(sd{()dj({)}fklsakfj})";    if(function(a))        std::cout<<"good";    else        std::cout<<"bad";    return 0;}
[解决办法]
我有一个想法,在每一层递归处理一对括号匹配。
C/C++ code
bool match(char *str, int &pos){    while (还有下一个字符)    {        取得下一个字符;        if (该字符是左边括号)        {            if (没有保存过左边括号)                保存该左边括号;            else            {                            match(str, pos); //递归处理括号,若匹配,继续处理当前层,若不匹配,直接返回. 注意pos值不变                if (返回false)                    return false;             }        }        else if (该字符是右边括号) // 处理当前层是否匹配        {            if (已保存了一个左边括号)            {                与保存的左边括号比较;                if (匹配)                     return true;                else (不匹配)                    return false;            }            else (先前没有保存左边括号)                return false;        }        else if (不是界定符)            跳过;                    }    return true;}
[解决办法]
每一层递归调用处理一对匹配括号,这对括号里面的字符串又下一层递归调用处理。
伪代码算法:
bool match(char *str, int &pos)
{
while (还有下一个字符)
{
取得下一个字符;
if (该字符是左边括号)
{
if (没有保存过左边括号)
保存该左边括号;
else
{
match(str, pos); //递归处理括号,若匹配,继续处理当前层,若不匹配,直接返回. 注意pos值不变
if (返回false)
return false;
}
}
else if (该字符是右边括号) // 处理当前层是否匹配
{
if (已保存了一个左边括号)
{
与保存的左边括号比较;
if (匹配)
return true;
else (不匹配)
return false;
}
else (先前没有保存左边括号)
return false;
}
else if (不是界定符)
跳过;
}
return true;
}
[解决办法]
C/C++ code
boolmatch_braces(char *braces_str){    char ch;    for (int i = 0; i < strlen(braces_str); i++)    {        if ((ch = braces_str[i]) == '(' || ch == '[' || ch == '{')            AddToStack(ch);        else if (ch == ')' || ch == ']' || ch == '}')            if (final_brace != NULL && ispair(final_brace->ch, ch))                pop();            else                return false;    }    if (final_brace == NULL)        return true;    return false;}voidAddToStack(char ch) {    braces_stack *tmp = (braces_stack *) malloc(sizeof(braces_stack));    tmp->ch = ch;     tmp->prior = final_brace;    final_brace=tmp;}voidpop(void){    braces_stack *tmp = final_brace;    final_brace = final_brace->prior;    free(tmp);}boolispair(char ch1, char ch2){    switch (ch1)    {        case '[': return ch2 == ']'; break;        case '{': return ch2 == '}'; break;        case '(': return ch2 == ')'; break;        default:  return false;      break;    }} 

读书人网 >软件架构设计

热点推荐