uTank-木头
每一个你不满意的现在,都有一个你没有努力的曾经。

括号匹配问题:

给一个字符串,其中包含小括号、中括号、大括号,求该字符串中的括号是否匹配。

例如:
()()[]{}    匹配
([{()}])    匹配
[](               不匹配
[(])              不匹配

利用堆栈的思路:
建立一个堆栈,然后遍历字符串,如果是'(','{'.'[',则入栈,否则判断当前字符串和栈顶元素是否是一对括号;要注意的是,需要提前判断栈是否为空,为空的时候取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\r\n", 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

 

posted on 2020-03-20 14:12  uTank  阅读(468)  评论(0编辑  收藏  举报