【问题描述】假设一算术表达式中包括三种括号:圆括号’(‘和’)’; 方括号’[’ 和’]’; 花括号’{’ 和’}’,且三种括号可按任意次序嵌套使用,试编写程序判定输入的表达式所含的括号是否正确配对出现(已知表达式已存入数据元素为字符的顺序表中)。所有括号均为半角符号。
若匹配,则返回1,否则返回0。
【输入形式】含括号的算数表达式
【输出形式】1或0
【样例输入】3+(44*[5-{6*[7*(45-10)]}])
【样例输出】1
【样例说明】判断括号是否匹配涉及两方面,括号个数和出现次序的判定。
【评分标准】
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct
{
char *base;
char *top;
int stacksize;
}SqStack;
int InitStack(SqStack &S)
{
S.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
if(!S.base) exit(-1);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return 1;
}
int Push(SqStack &S,char e)
{
if(S.top-S.base>=S.stacksize)
{
S.base=(char *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char));
if(!S.base) exit(-1);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return 1;
}
int Pop(SqStack&S,char &e)
{
if(S.top==S.base)
return -1;
e=*--S.top;
return 1;
}
int match(char ch1,char ch2)
{
if((ch1=='('&&ch2==')')||(ch1=='{'&&ch2=='}')||(ch1=='['&&ch2==']'))
return 1;
else return 0;
}
int main()
{
SqStack S;
InitStack(S);
char c,s[100];
int k=0,i=0,flag=1;//k用来记录括号的个数
scanf("%s",s);
while(s[i]!='\0')
{
if(s[i]=='('||s[i]=='{'||s[i]=='[')
{ Push(S,s[i]);
k++;
}
i++;
}
i=0;
while(s[i]!='\0'&&S.base!=S.top)
{
if(s[i]==')'||s[i]=='}'||s[i]==']')
{
Pop(S,c);
if(!match(c,s[i]))
{
flag=0;
break;
}
k++;
}
i++;
}
if(k%2!=0)
flag=0;
if(flag)
printf("%d",1);
else
printf("%d",0);
return 0;
}