链栈实现表达式括号匹配

题目: 

对给出得表达式进行括号匹配,若成功输出“匹配成功”,若不成功则输出“缺少X括号”;
用例1:输入:{a+[b*(d+c)]}
输出:匹配成功
用例2:输入:(a+b)*c]
输出:缺少[括号
用例3:输入:{[(a+b)*(c+d)]+e
输出:缺少}括号
用例4:输入:{[(a+b)*(c+d)]+e)
输出:缺少(括号缺少}括号

实现:

​
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct kuohao
{
    char a;
    struct kuohao *next;
} *stack;

stack push(stack top, char t)
{
    stack p2 = malloc(sizeof(struct kuohao));
    p2->next = top;
    p2->a = t;
    return p2;
}

stack pop(stack top)
{
    stack p=top;
    top = top->next;
    free(p);
    return top;
}

int search(stack top, char t)
{
    if (top==NULL) return 1;  //一定要先判断是否为空指针,若为空,则下面一句话将无法找到top,以至于程序运行超时
    else if (t - top->a <= 2 && top->a-t <= 2) return 0;//应该是'abs(t-top->a)<=2'!!!
    else return 1;
}

int main()
{
    char a[100];
    gets(a);
    int slen = strlen(a);
    int i;
    stack top = NULL;
    char t;
    int k = 0;

    for (i = 0; i < slen; i++)
    {
        t = a[i];
        if (t == '(' || t == '[' || t == '{')
        {
            top = push(top, t);
        }
        else if (t == ')' || t == ']' || t == '}')
        {
            if (search(top, t))
            {
                if (t == ')') 
                {printf("缺少(括号");}
                else if (t == ']') 
                {printf("缺少[括号");}
                else if (t == '}') 
                {printf("缺少{括号");}
                k++;
            }
            else if (search(top, t)==0)
            {
                top = pop(top);
            }
        }
    }
    while (top != NULL)
    {
        if (top->a == '(')
        {
            printf("缺少)括号");
            top = pop(top);
            k++;
        }
        else if (top->a == '[')
        {
            printf("缺少]括号");
            top = pop(top);
            k++;
        }
        else if (top->a == '{')
        {
            printf("缺少}括号");
            top = pop(top);
            k++;
        }
    }

    if (k == 0)
    {
        printf("匹配成功");
    }
    return 0;
}

​

push、pop部分

修改前:

stack push(stack top,char t)
{
    stack p1=top;
    stack p2=malloc(len);
    p2->next=p1;
    p2->a=t;
    p1=p2;
    return p1;
}
stack pop(stack top) 
{
    stack p1=top;
    p1=p1->next;
    return p1;
}

修改后:

stack push(stack top, char t)
{
    stack p2 = malloc(sizeof(struct kuohao));
    p2->next = top;
    p2->a = t;
    return p2;
}

stack pop(stack top)
{
    stack p=top;
    top = top->next;
    free(p);
    return top;
}

search部分判断条件注意ASCII码差值应为绝对值<=2

修改前:

int serch(stack top,char t)
{
    if(top->next==NULL) return 2;
    else if(t-top->a<=2) return 0;
    else return 1;
}

修改后:

int search(stack top, char t)
{
    if (top==NULL) return 1;  //一定要先判断是否为空指针,若为空,则下面一句话将无法找到top,以至于程序运行超时
    else if (t - top->a <= 2 && top->a-t <= 2) return 0;//应该是'abs(t-top->a)<=2'!!!
    else return 1;
}

同时注意一定要时刻留意在访问指针前,判断指针是否为空,不能对空指针进行访问,否则运行超时

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值