括号匹配问题
刚起床看微博,陈利人又发了个题:
“括号匹配:给定字符串,输出括号是否匹配,例如,"()" 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,吗?