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


    括号匹配问题:

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

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

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

  • 相关阅读:
    20201304杨淑钰+快速浏览教材
    20201304 自我介绍
    熟悉编程语言
    俄罗斯方块游戏代码的改写
    2020 -2021-1 20201319 《信息安全专业导论》第八周学习总结
    如何学好编程
    2020-2021-1 20201319 《信息安全专业导论》第七周学习总结
    2020-2021-1 20201319 《信息安全专业导论》第六周学习总结
    实现进制转换伪代码
    斐波那契数列递归实现
  • 原文地址:https://www.cnblogs.com/utank/p/12531389.html
Copyright © 2020-2023  润新知