#include "sqstack.cpp" //这行与下面那行都是sqstack.cpp文件中栈的基本运算,只是这行ElemType是char
#include "sqstack1.cpp" //而这行文件ElemType是double型,为了区分,这行文件中sqstack类型和函数后面加1加以区分
#include <stdlib.h>
void trans(char *exp,char postexp[]) //把表达式exp转化为后缀表达式postexp
{ char e;
SqStack *Optr;
InitStack(Optr);
int i=0;
while(*exp!='\0')
{ switch(*exp)
{ case '(':
Push(Optr,'(');
exp++;
break;
case ')':
Pop(Optr,e);
while(e!='(')
{ postexp[i++]=e;
Pop(Optr,e);
}
exp++;
break;
case '+':
case '-':
while(!StackEmpty(Optr))
{ GetTop(Optr,e);
if(e!='(')
{ postexp[i++]=e;
Pop(Optr,e);
}
else
break;
}
Push(Optr,*exp);
exp++;
break;
case '*':
case '/':
while(!StackEmpty(Optr))
{ GetTop(Optr,e);
if(e=='*'||e=='/')
{ postexp[i++]=e;
Pop(Optr,e);
}
else
break;
}
Push(Optr,*exp);
exp++;
break;
default:
while(*exp>='0'&&*exp<='9')
{ postexp[i++]=*exp;
exp++;
}
postexp[i++]='#';
}
}
while(!StackEmpty(Optr))
{ Pop(Optr,e);
postexp[i++]=e;
}
postexp[i]='\0';
DestroyStack(Optr);
}
double compvalue(char *postexp) //后缀表达式求值
{ double d,a,b,c,e;
SqStack1 *Opnd;
InitStack1(Opnd);
while(*postexp!='\0')
{ switch(*postexp)
{ case '+':
Pop1(Opnd,a);
Pop1(Opnd,b);
c=b+a;
Push1(Opnd,c);
break;
case '-':
Pop1(Opnd,a);
Pop1(Opnd,b);
c=b-a;
Push1(Opnd,c);
break;
case '*':
Pop1(Opnd,a);
Pop1(Opnd,b);
c=b*a;
Push1(Opnd,c);
break;
case '/':
Pop1(Opnd,a);
Pop1(Opnd,b);
if(a!=0)
{ c=b/a;
Push1(Opnd,c);
break;
}
else
{ printf("\n\t除零错误!\n");
exit(0);
}
break;
default:
d=0;
while(*postexp>='0'&&*postexp<='9')
{ d=10*d+*postexp-'0';
postexp++;
}
Push1(Opnd,d);
break;
}
postexp++;
}
GetTop1(Opnd,e);
DestroyStack1(Opnd);
return e;
}
int main()
{ char exp[50]; //"(56-20)/(4+2)"
char postexp[MaxSize];
printf("请输入表达式:");
scanf("%s",exp);
trans(exp,postexp);
//printf("中缀表达式:%s\n",exp);
//printf("后缀表达式:%s\n",postexp);
printf("表达式的值:%g\n",compvalue(postexp));
return 1;
}