数据结构--栈的应用2括号匹配

该文描述了一种检查括号是否匹配的算法,使用链表栈来处理圆括号、方括号的嵌套。用户输入表达式后,程序遍历每个字符,遇到左括号入栈,遇到右括号则尝试出栈匹配。若不匹配则输出错误信息,遍历结束后栈为空则表示括号匹配正确。

假设表达式中允许出现两种括号:圆括号()和方括号[],其嵌套的顺序随意,即( [ ( ) ( ) ] )或者 [ ( [ ] [ ] ) ]等为正确的表达式,但是 ( [ ( ] ) 或者 [ ( [ ) ] 或者 ( [ ( ] ) )等为错误的表达式。检查括号是否匹配可以采用如下逻辑:

  • 遍历整个表达式
  • 如果是左括号入栈
  • 如果是右括号则从栈中出栈一个括号,如果与右括号匹配则继续往后遍历,如果不匹配则说明是错误的表达式
  • 如果表示遍历完毕,最后栈为空说明表达式正确否则说明表达式错误

核心代码:

int  brackets_match(void)
{
    //从堆上申请一段空间用于存放字符串
    char *str = (char *)malloc(str_size);

    //初始化一个链表栈
    LinkStack s = stack_init();

    printf("plz input A expression : ");
    scanf("%s",str);

    //遍历整个表达式
    int i = 0;
    char f;
    while(str[i]!='\0'){
        //如果左括号直接入栈
        if(str[i]=='('||str[i]=='{'||str[i]=='['){
            Push(&s,str[i]);
            i++;
            continue;
        }
            //如果是右括号,就出站
            switch (str[i]) {
                case ')':
                    pup(&s, &f);
                    if (f == '(') {
                        i++;
                        continue;
                    } else {
                        printf("The parentheses do not match correctly");
                        return FALSE;
                    }
                    break;
                case '}':
                    pup(&s, &f);
                    if (f == '{') {
                        i++;
                        continue;
                    } else {
                        printf("The parentheses do not match correctly");
                        return FALSE;
                    }
                    break;
                case ']':
                    pup(&s, &f);
                    if (f == '[') {
                        i++;
                        continue;
                    } else {
                        printf("The parentheses do not match correctly");
                        return FALSE;
                    }
                    break;
                default:

                    break;
            }

     i++;
    }
    if(s==NULL)
    {
        printf("Parentheses match correctly\r\n");
        return TRUE;
    } else
    {
        printf("The parentheses do not match correctly\r\n");
        return FALSE;
    }

}

结果显示:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值