#include <stdio.h>
#include <stdlib.h>
#include <math.h>
# define maxSize 100
#define MIN 1e-5
typedef struct //顺序栈
{
int data[maxSize];
int top;
}SqStack;
int getPriority(char op)
{
if(op=='-'||op=='+')
return 0;
else
return 1;
}
int calSub(float opand1,char op,float opand2,float &result)
{
if(op=='+') result=opand1+opand2;
if(op=='-') result=opand1-opand2;
if(op=='*') result=opand1*opand2;
if(op=='/')
{
if(fabs(opand2)<MIN)
{
return 0;
}
else
result=opand1/opand2;
}
return 1;
}
后缀式求值
float calpostfix(char exp[]) //后缀式求值
{
float s[maxSize];
int top=-1;
int i=0;
while(exp[i]!='\0')
{
if(exp[i]>='0'&&exp[i]<='9')
{
s[++top]=exp[i]-'0'; //转换为数字
++i;
}
else
{
float operand1,operand2,result;
operand1=s[top--];
operand2=s[top--];
int flag=calSub(operand2,exp[i],operand1,result); //方向不能乱了!!先出为后!!!!!
if(flag==0)
{
printf("ERROR");
break;
}
s[++top]=result;
++i;
}
}
return s[top];
}
前缀式求值
float calprefix(char exp[],int len)
{
float s[maxSize];
int top=-1;
int i=len-1;
while(i>=0)
{
if(exp[i]>='0'&&exp[i]<='9')
{
s[++top]=exp[i]-'0'; //转换为数字
i--;
}
else
{
float operand1,operand2,result;
operand1=s[top--];
operand2=s[top--];
int flag=calSub(operand1,exp[i],operand2,result); //方向不能乱了!!先出为前!!!!!
if(flag==0)
{
printf("ERROR");
break;
}
s[++top]=result;
i--;
}
// printf("%f %f %f %f %f\n",s[0],s[1],s[2],s[3]); //验证每一步
}
return s[top];
}
主函数
int main()
{
char exp[]={"/++12*345"};//前缀 /++12*345,后缀1234*++5/,中缀(1+2+3*4)/5
// float answer=calpostfix(exp);
int len=9;
float answer=calprefix(exp,len);
printf("%f",answer);
}