//操作数 s1
//左括号 s2
//运算符准备 s2
//s2 NULL 或栈顶是左括号,直接入s2
//s2 not null且 栈顶不是左括号,当前的运算符大于栈顶 ,入s2
//小于等于,对s2出栈。从s1出栈两个操作数,和刚才的运算符进行运算,将结果入S1
//右括号 ,出栈
int calStackTopTwo(float s1[],int &top1,char s2[],int &top2)
{
float opnd1,opnd2,result;
char op;
int flag;
opnd2=s1[top1--];
opnd1=s1[top--];
op=s2[top--];
flag=calSub(opnd1,op,opnd2,result);
if(flag==0)
std::cout<<"ERROR"<<std::endl;
s1[++top1]=result;
return flag;
}
int getPriority(char op)
{
if(op=='+'||op=='-')
return 0;
else
return 1;
}
it 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 calInfix(char exp[])
{
float s1[maxsize];
int top1=-1;
char s2[maxsize];
int top2=-1;
int i=0;
while(exp[i]!='\0')
{
if('0'<=exp[i]&&exp[i]<'9')
{
s1[top++]=exp[i]-'0';
++i;
}
else if(exp[i]=='(')
{
s2[++top2]='(';
++i
}
else if(exp[i]=='+'||exp[i]=='-'||exp[i]=='*'||exp[i]=='/')
{
if(top2==-1||s2[top2]=='('||getPriority(exp[i]))>getPriority(s2[top2]))
{
s2[top++]=exp[i];
++i;
}
else
{
int flag=calStackTopTwo(s1,top1,s2,top2);
if(flag==0)
return 0;
}
}
else if(exp[i]==')')
{
while(s2[top2]!='(')
{
int flag=calStackTopTwo(s1,top1,s2,top2);
if(flag==0)
return 0;
}
--top2;
++i;
}
}
while(top2!=-1)
{
int flag=calStackTopTwo(s1,top1,s2,top2);
if(flag==0)
return 0;
}
return s1[top1];
}