思索三夜也未得思路的递归算法题,向各位大侠求助!
写出识别字符串内括号匹配问题的递归解决方案,使表达式可以包含三种类型的界定符:(),[]和{}。例如:{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; }}