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

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

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

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

核心代码:

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;
    }

}

结果显示:

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
问题描述:假设表达式允许两种括号圆括号方括号,其嵌套顺序随意,即CC或[([ ] [ ])]等为正确格式,[( ))或((()均为不正确的格式。检验括号是否匹配的方法可用“期待的紧迫程度”这个概念来描述。例如:考虑下列的括号序列:    [ ( [ ] [ ] ) ]    1 2 3 4 5 6 7 8 当计算机接受了第1个括号以后,他期待着与其匹配的第8个括号出现,然而等来的却是第2个括号,此时第1个括号“[”只能暂时靠边,而迫切等待与第2个括号相匹配的 第7个括号“]”的出现,类似的,因只等来了第3个括号“[”,此时,其期待的紧迫程度较第2个括号更紧迫,则第2个括号只能靠边,让位于第3个括号,显然第3个括号的期待紧迫程度高于第2个括号,而第2个括号的期待紧迫程度高于第1个括号;在接受了第4个括号之后,第3个括号的期待得到了满足,消解之后,第2个括号的期待匹配就成了最急迫的任务了,…… ,依次类推。可见这个处理过程正好和的特点相吻合。 要求:设置一个,每读入一个括号,若是左括号,则作为一个新的更急迫的期待压入,若是右括号,则或者是和当前顶的括号相匹配,或者是不合法的情况,输出“此串括号匹配不合法”。在初始和结束时,应该是空的。 测试数据:输入 #([ ]())#,结果“匹配”  输入 #[( )]#,结果“此串括号匹配不合法”  #为起始和结束标志。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值