括号匹配问题:
给一个字符串,其中包含小括号、中括号、大括号,求该字符串中的括号是否匹配。
例如:
()()[]{} 匹配
([{()}]) 匹配
[]( 不匹配
[(]) 不匹配
利用堆栈的思路:
建立一个堆栈,然后遍历字符串,如果是'(','{'.'[',则入栈,否则判断当前字符串和栈顶元素是否是一对括号;要注意的是,需要提前判断栈是否为空,为空的时候取top是违法的的,所以只要为空就入栈,然后执行下一次循环,而且,只要循环过程中出现一次栈顶元素和当前元素不匹配的情况,就可以跳出循环返回false了。
1 int isBracket(char left,char right) 2 { 3 if(left == '(' && right == ')') return 1; 4 if(left == '[' && right == ']') return 1; 5 if(left == '{' && right == '}') return 1; 6 7 return 0; 8 } 9 int isValidParentheses( char *str ) 10 { 11 int len; 12 int i; 13 T_Stack stack; 14 int buf[100]; 15 int tmp; 16 17 StackInit( &stack, buf, sizeof(buf)/sizeof(buf[0])); 18 19 len = strlen( str ); 20 21 for( i = 0; i < len; i++ ) 22 { 23 if( StackIsEmpty( &stack ) ) 24 { 25 StackPush( &stack, str[i] ); 26 continue; 27 } 28 29 StackTop( &stack, &tmp ); 30 31 if( str[i] == '(' || str[i] == '[' || str[i] == '{') 32 { 33 StackPush( &stack, str[i]); 34 } 35 else if( isBracket( tmp, str[i] ) ) 36 { 37 StackPop( &stack, &tmp ); 38 } 39 else 40 { 41 return 0; 42 } 43 } 44 45 return ( StackIsEmpty( &stack ) ); 46 } 47 48 int main( void ) 49 { 50 char *str[] = { 51 "()()[][]{}", "[(])", "[]( ", "([{()}])", "(([{()}]) " 52 }; 53 int i; 54 55 for( i = 0; i < sizeof(str)/sizeof(str[0]); i++ ) 56 { 57 printf("%s ", isValidParentheses(str[i]) ? "match" : "not match"); 58 } 59 60 system("pause"); 61 62 return 0; 63 }
参考引用:
https://www.jianshu.com/p/be1dc368200d
https://www.cnblogs.com/hedeyong/p/7841548.html