括号匹配问题
刚起床看微博,陈利人又发了个题:
“括号匹配:给定字符串,输出括号是否匹配,例如,"()" yes;")(" no;"(abcd(e)" no;"(a)(b)" yes。要求必须用递归写,整个实现不可以出现一个循环语句。"
很多人都说用栈实现,太麻烦了吧,直接用递归自然堆栈就行了:
5 | int bracket( char *p, int count){ |
7 | if (*p == '\0' ) return count ; |
8 | else if (*p == '(' ) return bracket( p+1, count+1) ; |
9 | else if (count > 0 && *p == ')' ) return bracket( p+1, count-1) ; |
10 | else if (count <= 0 && *p == ')' ) return -1 ; |
11 | return bracket( p+1, count); |
14 | int main( int argc, char * argv[]) { |
15 | char *str = "aaa(bb(()c))" ; |
16 | int tmp = bracket(str, 0) ; |
17 | printf ( "bracket result:%s\n" , tmp==0? "yes" : "no" ); |
gcc bracket.c
./a.out
bracket result:yes
然后扩展到【(【】【】)】这种有多个单元符号的,也可以类推。
count 其实不用传的,一个局部变量初始化为0就行;
最后的return bracket( p+1, count);貌似是悬空的吧?
@kulv
呵呵,就是嘛,我想代码看上去好像也没有问题,怎么会出来一个no的结果。
@passinger
囧···下面的结果粘贴错了,谢谢哥们了!已修正
aaa(bb(()c))的测试结果不是应该是true,吗?