括号匹配
算法描述
检验表达式中括号是否合法
代码描述
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
//定义一个栈
typedef struct Stack{
char *top;
char *bottom;
int size;
}Stack,*PStack;
void initStack(PStack x,int s){
x->size=s;
x->bottom=(char*)malloc(sizeof(char)*(s+1));
if(!x->bottom)
exit(0);
x->top=x->bottom;
}
int judgeEmpty(PStack x){
if(x->bottom==x->top)
return 1;
return 0;
}
int judgeFilled(PStack x){
if(x->bottom-x->top==x->size)
return 1;
return 0;
}
int push(PStack x,char in){
if(judgeFilled(x)==1)
return 1;
*(x->top)=in;
x->top++;
return 0;
}
int pop(PStack x){
if(judgeEmpty(x)==1)
return 1;
--(x->top);
return 0;
}
int bracketMatch(char *x){
PStack stack=(PStack)malloc(sizeof(Stack));
initStack(stack,50);
int i=0,level=-1;
while(x[i]!='\0'&&judgeFilled(stack)==0){
switch(x[i])
{
case '(':
push(stack,'(');
level=2;
break;
case '[':
if(level>1)
return 0;
level=1;
push(stack,'[');
break;
case '{':
if(level>0)
return 0;
level=0;
push(stack,'{');
break;
case ')':
if(judgeEmpty(stack)==1||*(stack->top-1)!='(')
return 0;
pop(stack);
switch(*stack->top-1)
{
case '(':
level=2;
break;
case '[':
level=1;
break;
case '{':
level=0;
break;
}
break;
case ']':
if(judgeEmpty(stack)==1||*(stack->top-1)!='[')
return 0;
pop(stack);
switch(*stack->top-1)
{
case '(':
level=2;
break;
case '[':
level=1;
break;
case '{':
level=0;
break;
}
break;
case '}':
if(judgeEmpty(stack)==1||*(stack->top-1)!='{')
return 0;
pop(stack);
switch(*stack->top-1)
{
case '(':
level=2;
break;
case '[':
level=1;
break;
case '{':
level=0;
break;
}
break;
default:
printf("o\n");
break;
}
i++;
}
if(judgeEmpty(stack)==0)
return 0;
free(stack);
return 1;
}
int main(){
printf("请输入表达式:");
char c[50];
scanf("%s",c);
if(bracketMatch(c)==1)
printf("YES!\n");
else
printf("NO!\n");
return 0;
}