目录
这个题目比较复杂,分很多种情况,传入返回的值的类型也不一样,代码只能当作思路来看,在编译器上跑不出相应的结果。函数存在内存泄漏,传参混乱等问题。
1.将中缀表达式转化为后缀表达式函数
void Trans(SqStack *Optr,char *exp,char postxp[]){
ElemType e;
int i = 0;
while (*exp != '\0'){
switch (*exp) {
case '(':
Push(Optr,'(');
exp++;
break;
case ')':
e = Pop(Optr,e);
while (e != '('){
postxp[i++] = e;
e = Pop(Optr,e);
}
exp++;
break;
case '+':
case '-':
while (EmptyStack(Optr)){
e = GetTop(Optr,e);
if(e == '*' || e == '/'){
postxp[i++] = e;
Pop(Optr,e);
}
else
break;
}
Push(Optr,*exp);
exp++;
break;
case '*':
case '/':
while (EmptyStack(Optr)){//栈不为空时循环
e = GetTop(Optr,e);//取栈顶元素e
if(e == '*' || e == '/'){//栈顶'*'或者'/'出栈存放到postxp中
postxp[i++] = e;
Pop(Optr,e);
}
else //e条件不满足直接退出
break;
}
Push(Optr,*exp);
exp++;
break;
default:
while (*exp >= '0' && *exp <= '9'){
postxp[i++] = *exp;
exp++;
}
postxp[i++] = '#'; //用#表示一个数字串结束
}
}
while (EmptyStack(Optr)){
e = Pop(Optr,e);
postxp[i++] = e;
}
postxp[i] = '\0';//给postxp添加结束标识
DestroyStack(Optr);
}
2.对后缀表达式求值函数
double compvalue(SqStack1 *Opnd,char * postxp){
ElemType l;
Opnd -> top = -1;
double d,a,b,c,e;
while (*postxp != '\0'){
switch (*postxp) {
case '+':
a = Pop1(Opnd,a);
b = Pop1(Opnd,b);
c = b + a;
Push1(Opnd,c);
break;
case '-':
a = Pop1(Opnd,a);
b = Pop1(Opnd,b);
c = b - a;
Push1(Opnd,c);
break;
case '*':
a = Pop1(Opnd,a);
b = Pop1(Opnd,b);
c = b * a;
Push1(Opnd,c);
break;
case '/':
a = Pop1(Opnd,a);
b = Pop1(Opnd,b);
if(a != 0){
c = b / a;
Push1(Opnd,c);
break;
} else{
printf("分母为0,发生错误\n");
exit(0);
}
break;
}
postxp++;
}
e = GetTop1(Opnd,e);
printf("%lf\n",e);
DestroyStack(Opnd);
return e;
}