括号匹配问题
刚起床看微博,陈利人又发了个题:
“括号匹配:给定字符串,输出括号是否匹配,例如,"()" yes;")(" no;"(abcd(e)" no;"(a)(b)" yes。要求必须用递归写,整个实现不可以出现一个循环语句。"
很多人都说用栈实现,太麻烦了吧,直接用递归自然堆栈就行了:
#include <stdio.h>
#include <string.h>
//gcc -std=c99 bracket.c
int bracket( char *p, int count){
//返回为0匹配,否则不匹配
if(*p == '\0') return count ;
else if(*p == '(') return bracket( p+1, count+1) ;
else if(count > 0 && *p == ')') return bracket( p+1, count-1) ;
else if(count <= 0 && *p == ')') return -1 ;
return bracket( p+1, count);
}
int main(int argc, char* argv[]) {
char *str = "aaa(bb(()c))";
int tmp = bracket(str, 0) ;
printf("bracket result:%s\n", tmp==0?"yes":"no");
return 0 ;
}
gcc bracket.c
./a.out
bracket result:yes
然后扩展到【(【】【】)】这种有多个单元符号的,也可以类推。

count 其实不用传的,一个局部变量初始化为0就行;
最后的return bracket( p+1, count);貌似是悬空的吧?
@kulv
呵呵,就是嘛,我想代码看上去好像也没有问题,怎么会出来一个no的结果。
@passinger
囧···下面的结果粘贴错了,谢谢哥们了!已修正
aaa(bb(()c))的测试结果不是应该是true,吗?