栈在括号匹配中的应用(C语言)
类型定义
typedef char ElemType;
typedef struct{ //顺序栈类型定义
ElemType data[MaxSize];
int top;
}SqStack;
使用基本操作
接口说明
void InitStack(SqStack *S){ //初始化栈
S->top==-1;
}
int StackEmpty(SqStack S){ //判断栈是否为空
if(S.top==-1)
return 1;
else
return 0;
}
int Push(SqStack *S,ElemType x){ //新元素入栈
if(S->top==MaxSize-1)
return 0;
S->data[++S->top]=x;
return 1;
}
int Pop(SqStack *S,ElemType *x){ //栈顶元素出栈,用X返回
if(S->top==-1)
return 0;
*x=S->data[S->top--];
return 1;
}
括号匹配算法
int BraketCheck(char str[],int lenth){
SqStack S; //定义顺序栈S
InitStack(&S); //初始顺序栈
for(int i=0;i<lenth;i++){
if(str[i]=='{' || str[i]=='(' || str[i]=='['){ //判断是否为左括号
Push(&S,str[i]); //将左括号压入栈中
}
else{
if(StackEmpty(S)) //判断栈是否为空
return 0;
char x; //变量x存储栈顶元素
Pop(&S,&x);
if(str[i]=='}' && x!='{') //判断当前的右括号是否与栈顶的左括号匹配
return 0;
if(str[i]==')' && x!='(')
return 0;
if(str[i]==']' && x!='[')
return 0;
}
}
return StackEmpty(S); //检索完所有括号后,栈为空代表匹配成功
}
不使用基本操作
括号匹配算法
int BraketCheck2(char str[],int lenth){
char S[MaxSize];
int top=-1; //初始顺序栈
for(int i=0;i<lenth;i++){
if(str[i]=='{' || str[i]=='(' || str[i]=='['){ //判断是否为左括号
S[++top]=str[i]; //将左括号压入栈中
}
else{
if(top==-1) //判断栈是否为空
return 0;
char x; //变量x存储栈顶元素
x=S[top--];
if(str[i]=='}' && x!='{') //判断当前的右括号是否与栈顶的左括号匹配
return 0;
if(str[i]==')' && x!='(')
return 0;
if(str[i]==']' && x!='[')
return 0;
}
}
return top==-1 ; //检索完所有括号后,栈为空代表匹配成功
}