仅供参考:#include
#include
#include
#defineSTACK_INIT_SIZE10
#defineSTACK_GROW_SIZE5
#defineELEMTYPEchar
#defineOK1
#defineERROR0
typedefstruct{/*建立一个栈的首结点*/
ELEMTYPE*base;
ELEMTYPE*top;
intstacksize;
}SpStack;
intInitStack(SpStack*s){/*建立空的栈并返回首地址*/
s->base=((ELEMTYPE*)malloc(STACK_INIT_SIZE*sizeof(ELEMTYPE)));
if(!s->base)returnERROR;
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
returnOK;
}
intStackEmpty(SpStack*s){/*判断栈是否为空*/
if(s->top==s->base)returnOK;
elsereturnERROR;
}
intPush(SpStack*s,ELEMTYPEe){/*往栈顶插入元素即进栈*/
if(s->top-s->base>=s->stacksize){/*判断是否栈满*/
s->base=((ELEMTYPE*)realloc(s->base,(s->stacksize+STACK_GROW_SIZE)*sizeof(ELEMTYPE)));
if(!s->base)returnERROR;
s->stacksize+=STACK_GROW_SIZE;
s->top=s->base+s->stacksize;
}
*s->top++=e;
returnOK;
}
intPop(SpStack*s,ELEMTYPE*e){/*让栈顶元素依次输出即出栈*/
if(StackEmpty(s))returnERROR;
*e=*(--s->top);
returnOK;
}
intComp(ELEMTYPEa,ELEMTYPEb){
if((a=='('&&b!=')')
||(a=='['&&b!=']')
||(a=='{'&&b!='}')){
returnERROR;
}elsereturnOK;
}
intCount(SpStack*s){
ELEMTYPEe[STACK_INIT_SIZE*2];
ELEMTYPEe1;
inti;
InitStack(s);
fgets(e,STACK_INIT_SIZE*2,stdin);
if('\n'==e[strlen(e)-1])e[strlen(e)-1]=0;
printf("%s\n",e);
for(i=0;e!='\0';i++){
switch(e){
case'(':
case'[':
case'{':
Push(s,e);
break;
case')':
case']':
case'}':
if(StackEmpty(s)){
printf("%*s↖右括号多余\n",i+1,"");
return(ERROR);
}elsePop(s,&e1);
if(!Comp(e1,e)){
printf("%*s↖左右匹配出错\n",i+1,"");
return(ERROR);
}
}
}
if(!StackEmpty(s)){
printf("%*s↖左括号多余\n",i,"");
return(ERROR);
}else{
printf("匹配正确\n");
return(OK);
}
}
voidmain(){
SpStacks;
Count(&s);
free(s.base);
} |