版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Mind_programmonkey/article/details/85256477
1.计算中缀表达式
//判断运算符优先级
int getPriority(char op)
{
if(op=='+'||op=='-')
return 0;
else
return 1;
}
//计算表达式
int calsub(float opnd1,char op,float opnd2,float &result)
{
if(op=='+')
result=opnd1+opnd2;
if(op=='-')
result=opnd1-opnd2;
if(op=='*')
result=opnd1*opnd2;
if(op=='\')
{
if(fabs(opnd2)<MIN)
return 0;
else
result=opnd1/opnd1;
}
return 1;
}
//计算栈
int calstack(float s1[],int &top1,float s2[],int &top2)
{
float opnd1,opnd2;char op;
int flag;
op=s1[top1--];
opnd2=s2[top2--];
opnd1=s2[top2--];
flag=calsub(opnd1,op,opnd2,result);
s2[++top2]=result;
return flag;
}
float calinfix(char exp[])
{
char s1[maxsize];int top1=-1;
char s2[maxsize];int top2=-1;
int i=0;
while(exp[i]!='\0')
{
if(exp[i]>='0'&&exp[i]<='9')
{
s2[++top2]=exp[i];
i++;
}
else if(exp[i]=='(')
{
s1[++top1]=exp[i];
i++;
}
else if(exp[i]=='+'||exp[i]=='-'||exp[i]=='*'||exp[i]=='\')
{
if(top1==-1||s1[top1]=='('||getPriority(exp[i])>getPriority(s1[top1]))
{
s1[++top1]=exp[i];
i++;
}
else
{
//计算
int flag=calstack(s1,top1,s2,top2);
if(flag==0)
return 0;
}
}
else if(exp[i]==')')
{
while(s1[top1]!='(')
{
//计算
int flag=calstack(s1,top1,s2,top2);
if(flag==0)
return 0;
}
--top1;
++i;
}
}
while(top1!=-1)
{
//计算
int flag=calstack(s1,top1,s2,top2);
if(flag==0)
return 0;
}
return s2[top2];
}
2.计算后缀表达式(次顶 op 栈顶)
float calPostFix(char exp[])
{
float s[maxsize];int top=-1;
for(int i=0;exp[i]!='\0';i++)
{
if('0'<=exp[i]&&exp[i]<='9')
s[++top]=exp[i]-'0';
else
{
float opnd1,opnd2,result;
char op;int flag;
opnd2=s[top--];op=exp[i];
opnd1=s[top--];
flag=calsub(opnd1,op,opnd2,result);
if(flag==0)
{
cout<<"error"<<endl;
break;
}
s[++top]=result;
}
}
return s[top];
}
3.计算前缀表达式(栈顶op次顶)
float calPreFix(char exp[],int len)
{
float s[maxsize];int top=-1;
for(i=len-1;i>=0;i--)
{
if('0'<=exo[i]&&exp[i]<='9')
s[++top]=exp[i]-'0';
else
{
float opnd1,opnd2,result;
char op;
int flag;
opnd1=s[top--];
opnd2=s[top--];
flag=calsub(opnd1,op,opnd2,result);
if(flag==0)
{
cout<<"error"<<endl;
break;
}
s[++top]=result;
}
}
return s[top];
}