【问题描述】
利用栈的基本操作,完成表达式括弧匹配的检测。(假设表达式中只有()、[]、{}三类括弧)
【输入形式】
输入若干个表达式(字符串形式)。(提示:使用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 ERROR;
s->top=s->base;
s->stacksize=STACK_INT_SIZE;
return OK;
}
//判断栈空
int emptyStack(SqStack *s)
{
if (s->top==s->base){
return OK;
}else {
return ERROR;
}
}
//入栈
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 ERROR;
s->top=s->base+s->stacksize;
s->stacksize+=STACKINCREMENT;
}
*s->top++=e;
return OK;
}
//出栈
int popStack(SqStack *s,ElemType *e)
{
if (s->top==s->base)return ERROR;
--s->top;
*e=*s->top;
return OK;
}
//判断表达式括弧匹配
int isMatching(char a[])
{
SqStack s;
initStack(&s);
ElemType e;
char *p;
p=a;
while(*p!='\0'){
switch(*p){
case '{':
case '[':
case '(':
pushStack(&s,*p);
p++;
break;
case '}':
case ']':
case ')':
if (!emptyStack(&s)){
popStack(&s,&e);
if ((e=='{' && *p=='}') || (e=='[' && *p==']') || (e=='(' && *p==')')){
p++;
}else{
return 0;
}
}else{
return 0;
}
break;
default:
p++;
}
}
if(!emptyStack(&s))return 0;
return 1;
}
int main()
{
char a[1000];
//循环读取若干表达式,并输出判断结果
while(scanf("%s",a)==1){
if(isMatching(a)){
printf("match\n");
}else {
printf("not match\n");
}
}
return 0;
}