表达式求值 35

来源:互联网 发布:mysql 渗透 编辑:程序博客网 时间:2024/05/18 05:36

表达式求值

时间限制:3000 ms  |  内存限制:65535 KB
难度:4
描述
ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。
比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数)
输入
第一行输入一个整数n,共有n组测试数据(n<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。
数据保证除数不会为0
输出
每组都输出该组运算式的运算结果,输出结果保留两位小数。
样例输入
1.000+2/4=((1+2)*5+1)/4=
样例输出
1.504.00
2 #include <stdio.h>#include <string.h>#include <math.h>#define M 1001char a[M];char b[M];double c[M];int main(){int n,top1,top2,i;scanf("%d",&n);while(n--){scanf("%s",&a[1]);int len=strlen(&a[1]);a[0]='(';a[len]=')';top1=-1;top2=-1;for(i=0;i<=len;i++){if(a[i]=='('){top1++;b[top1]=a[i];}else if(a[i]==')'){while(b[top1]!='('){double e=c[top2];top2--;double f=c[top2];top2--;double g=0;switch(b[top1]){case '+':g=f+e;break;case '-':g=f-e;break;case '*':g=f*e;break;case '/':g=f/e;break;}top2++;c[top2]=g;top1--;}top1--;}else if(a[i]=='+'||a[i]=='-'){while(b[top1]!='('){double e=c[top2];top2--;double f=c[top2];top2--;double g=0;switch(b[top1]){case '+':g=f+e;break;case '-':g=f-e;break;case '*':g=f*e;break;case '/':g=f/e;break;}top2++;c[top2]=g;top1--;}top1++;b[top1]=a[i];}else if(a[i]=='*'||a[i]=='/'){if(b[top1]=='*'){double e=c[top2];top2--;double f=c[top2];top2--;top2++;c[top2]=f*e;top1--;}else if(b[top1]=='/'){double e=c[top2];top2--;double f=c[top2];top2--;top2++;c[top2]=f/e;top1--;}top1++;b[top1]=a[i];}else if(a[i]<='9'&&a[i]>='0'){double v=0;int b=i;bool flag=false;while(a[i]<='9'&&a[i]>='0'||a[i]=='.'){if(a[i]=='.'){b=i;flag=true;}else{v=v*10+a[i]-'0';}++i;}--i;if(flag==true){top2++;c[top2]=v/pow(10,i-b);}else{top2++;c[top2]=v;}}}printf("%.2lf\n",c[top2]);    top2--;}return 0;}        





0 0
原创粉丝点击