题目:
对给出得表达式进行括号匹配,若成功输出“匹配成功”,若不成功则输出“缺少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;
}
同时注意一定要时刻留意在访问指针前,判断指针是否为空,不能对空指针进行访问,否则运行超时