您的位置:首页 > 其它

表达式求值

2013-11-02 22:52 302 查看
#include "stdio.h"
#include "string.h"
#include "math.h"
const int NO=105;
struct OP{
char s[NO];
int top;
}op;
struct DA{
double s[NO];
int top;
}da;

char comp(char ch1,char ch2)
{
char s[]={'+','-','*','/','(',')','#','^'};
char ss[8][8]={
'>','>','<','<','<','>','>','<',
'>','>','<','<','<','>','>','<',
'>','>','>','>','<','>','>','<',
'>','>','>','>','<','>','>','<',
'<','<','<','<','<','=','E','<',
'>','>','>','>','E','>','>','>',
'<','<','<','<','<','E','=','<',
'>','>','>','>','<','>','>','<',
};
int aaa[256];
for(int i=0;i<8;i++)
aaa[s[i]]=i;
return ss[aaa[ch1]][aaa[ch2]];
}

double cal(double a,char ch,double b)
{
switch(ch)
{
case '+':return a+b; break;
case '-':return a-b; break;
case '*':return a*b; break;
case '/':return a/b; break;
case '^':return pow(a,b);break;
}
}

double expresion(char s[])
{
char temp[105];
double result,n;
op.top=0;
da.top=0;
op.s[++op.top]='#';
int i=0,j=0;
while(s[i]!='#' || op.s[op.top]!='#')
{
if(i==0 && s[0]=='-' || (s[i]=='-' && s[i-1]=='('))
da.s[++da.top]=0;
if(s[i]>='0' && s[i]<='9' ||s[i]=='.')
{
int k=0;
while(s[i]>='0' && s[i]<='9' ||s[i]=='.')
{

temp[k++]=s[i++];
}
temp[k]='\n';
sscanf(temp,"%lf",&da.s[++da.top]);
}
else switch(comp(op.s[op.top],s[i]))
{
case '>': n=cal(da.s[da.top-1],op.s[op.top--],da.s[da.top]);
da.top-=2;
da.s[++da.top]=n;
break;
case '<': op.s[++op.top]=s[i]; i++; break;
case '=': op.top--; i++; break;
}
}

return da.s[da.top];
}

int main()
{
char s[NO];
gets(s);
strcat(s,"#");
printf("%.3f\n",expresion(s));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: