#include"Sqstack.h"
#include"other.h"
double EvluateExpression(char str[],LinkStack &OPTR,LinkStack1 &OPND)
{
int i=0,t,j,falg=0;
double a,b,sum,s;
char theta,x;
InitStack(OPND);
InitStack(OPTR);
Push(OPTR,'#');
if(str[0]=='-')
{
Push(OPND,0);
}
while(str[i] !='#' || GetTop(OPTR)!='#')
{
if(str[i]>='0' && str[i]<='9')
{
sum=0;
while(str[i]>='0' && str[i]<='9') //将整数保存到sum中
{
sum=sum*10+str[i++]-'0';
}
if(str[i]=='.') //如果有小数点,将j移动下一个运算符之前的字符,从那个字符开始往后依次除10,直到小数点之后的那一位字符,与sum相加
{
s=0;
j=i+1;
while(str[j]>='0' && str[j]<='9')
{
j++;
}
for(t=j-1;t>i;t--)
{
s=s/10+str[t]-'0';
}
s=s/10;
//printf("%lf\n",s);
sum=sum+s;
i=j;
}
Push(OPND,sum);
}
else
{
if(str[i]=='-' && str[i-1]=='(')
{
Push(OPND,0);
}
switch(Precede(GetTop(OPTR),str[i]))
{
case '<':
Push(OPTR,str[i]);
i++;
break;
case '>':
Pop(OPTR,theta);
Pop(OPND,b);Pop(OPND,a);
Push(OPND,Operate(a,theta,b));
break;
case '=':
Pop(OPTR,x);
i++;
break;
}
}
}
return GetTop(OPND);
}
char Precede(char a, char b)
{
int i,j;
char Ns[7]={'+','-','*','/','(',')','#'};
char str[7][7]={'>','>','<','<','<','>','>',
'>','>','<','<','<','>','>',
'>','>','>','>','<','>','>',
'>','>','>','>','<','>','>',
'<','<','<','<','<','=',' ',
'>','>','>','>',' ','>','>',
'<','<','<','<','<',' ',' '};
for(i=0;i<7;i++)
{
if(Ns[i]==a)
break;
}
for(j=0;j<7;j++)
{
if(Ns[j]==b)
break;
}
return str[i][j];
}
double Operate(double a,char op,double b)
{
switch(op)
{
case '+':return a+b;break;
case '-':return a-b;break;
case '*':return a*b;break;
case '/':return a/b;break;
}
}