表达式括弧匹配的检测
【问题描述】
利用栈的基本操作,完成表达式括弧匹配的检测。(假设表达式中只有()、[]、{}三类括弧)
【输入形式】
输入若干个表达式(字符串形式)。(提示:使用scanf("%s",a)==1)
【输出形式】
若表达式括弧匹配,则输出“match”;否则输出"not match"
【样例输入】
1*(3+4)/4
((3+4)*7-(8-9)
((1+2)*(3_4)-(5+6)*3)
{[}]()
【样例输出】
match
not match
match
not match
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define ERROR 0
#define OK 1
#define STACK_INT_SIZE 10
#define STACKINCREMENT 5
typedef char ElemType;
typedef struct
{
ElemType *base;
ElemType *top;
int stacksize;
} SqStack;
int initStack(SqStack *s);
int emptyStack(SqStack *s);
int pushStack(SqStack *s, ElemType e);
int popStack(SqStack *s,ElemType *e);
//初始化
int initStack(SqStack *s)
{
s->base=(ElemType*)malloc(STACK_INT_SIZE*sizeof(ElemType));
if(!s->base)
return 0;
s->top=s->base;
s->stacksize=STACK_INT_SIZE;
return 1;
}
//判断栈空
int emptyStack(SqStack *s)
{
if(s->top==s->base)
return 1;
else
return 0;
}
//入栈
int pushStack(SqStack *s, ElemType e)
{
if(s->top-s->base>=s->stacksize)
{
s->base=(ElemType*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(ElemType));
if(!s->base)
return 0;
s->top=s->base+s->stacksize;
s->stacksize+=STACKINCREMENT;
}
*s->top++=e;
return 1;
}
//出栈
int popStack(SqStack *s,ElemType *e)
{
if(s->top==s->base)
return 0;
--s->top;
*e=*s->top;
return 1;
}
//判断表达式括弧匹配
int isMatching(char a[])
{
int i=0;
SqStack s;
initStack(&s);
while(a[i]!='\0')
{
if(a[i]=='('||a[i]=='['||a[i]=='{')
pushStack(&s,a[i]);
else if(a[i]==')'&&*(s.top-1)=='(')
{
popStack(&s,&a[i]);
}
else if(a[i]==']'&&*(s.top-1)=='[')
{
popStack(&s,&a[i]);
}
else if(a[i]=='}'&&*(s.top-1)=='{')
{
popStack(&s,&a[i]);
}
else if(a[i]==')'||a[i]==']'||a[i]=='}')
return 0;
i++;
}
return emptyStack(&s);
}
int main()
{
char a[1000];
//循环读取若干表达式,并输出判断结果
while(scanf("%s",a)==1)
{
if(isMatching(a))
printf("match\n");
else
printf("not match\n");
}
return 0;
}