以下代码基于栈结构,判断一串表达式中括号匹配是否正确。
例如:((x+y)[x+(y+z)(y-z)](10-(z-xy)])
上述表达式括号匹配错误。
#include <stdio.h>
#include<string.h>
typedef int T;
typedef struct
{
T *data;
int size, top;
} CStack;
CStack CreateStack(int size);
void FreeStack(CStack *S);
void Push(CStack *S, T x);
T Peek(CStack S);
T Pop(CStack *S);
T GetPrior(char a);
int main(){
char str[100];//=(char*)malloc(100*sizeof(char));
T i=0,len,flag=1;
printf("请输入表达式(以#结尾):\n");
scanf("%s",str);
len=strlen(str);
CStack Soperator=CreateStack(len); //创建运算符栈
Push(&Soperator,'#'); //#入栈
while(str[i]!='#'||Peek(Soperator)!='#'){
if(str[i]=='('||str[i]==')'||str[i]=='['||str[i]==']'){ //非数字
if(GetPrior(str[i])-GetPrior(Peek(Soperator))>=0){ //比较运算符优先级
Push(&Soperator,str[i++]); //优先级高或相等的入栈
}else{ //优先级低
if(str[i]==']'&&Peek(Soperator)=='['||str[i]==')'&&Peek(Soperator)=='(') {//匹配,出栈,i++
Pop(&Soperator);
i++;
}else{ //不匹配,报错,终止循环
flag=0;
break;
}
}
}else{
i++;
}
}
if(flag==1) printf("\n括号匹配\n");
else printf("\n括号不匹配\n");
return 0;
}
T GetPrior(char a){ //优先级函数
T k;
switch(a){
case ')':
k=1;
break;
case '(':
k=2;
break;
case ']':
k=1;
break;
case '[':
k=2;
break;
case '#':
k=0;
break;
default:k=0;
}
return k;
}
CStack CreateStack(int size){ //创建栈
CStack S;
S.data = (T*)malloc(size * sizeof(T));
S.size = size;
S.top =0;
return S;
}
void FreeStack(CStack *S){ //释放栈
free(S->data);
}
void Push(CStack *S, T x){ //入栈
S->data[++S->top] = x;
}
T Peek(CStack S){ //得到栈顶元素
return S.data[S.top];
}
T Pop(CStack *S){ //出栈
return S->data[S->top--];
}
该程序为栈的应用之一,为新手熟悉栈的创建和使用,巩固栈“先入后出”的思想提供了很好的帮助。
小白入门。若有错误,请指正!