数据结构栈的应用——括号匹配问题

Posted utank

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构栈的应用——括号匹配问题相关的知识,希望对你有一定的参考价值。

括号匹配问题:

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

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

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

 

以上是关于数据结构栈的应用——括号匹配问题的主要内容,如果未能解决你的问题,请参考以下文章

数据结构 栈的实例应用,括号匹配

数据结构_栈的应用

栈的应用(括号匹配算法实战)

王道数据结构与算法栈的应用

数据结构(C语言) 栈的应用之括号匹配

栈的应用(Boolan)