表达式求值
表达式求值
时间限制:3000 ms | 内存限制:65535 KB
难度:4
- 描述
- ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。
比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数)
- 输入
- 第一行输入一个整数n,共有n组测试数据(n<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。
数据保证除数不会为0 - 输出
- 每组都输出该组运算式的运算结果,输出结果保留两位小数。
- 样例输入
-
2 1.000+2/4= ((1+2)*5+1)/4=
- 样例输出
-
1.50 4.00
-
#include <stack> #include <string> #include <math.h> #include <stdio.h> #include <iostream> using namespace std; string str; double shu[510],mn; char fh[1002]; int last,lst; double st_doub(int &i) { int k=0; double num=0; for(;;i++) { if(str[i]>='0'&&str[i]<='9') num=num*10+(str[i]-'0'); else if(str[i]=='.') k=i; else break; } if(k!=0) num/=pow(10,i-k-1); return num; } double cal(int l,int r) { char ffh[510]; int i,fl=0,ss=lst; double ans,fshu[510]; i=l+1; fshu[fl]=shu[ss++]; while(i<r) { ffh[fl++]=fh[i++]; fshu[fl]=shu[ss++]; if(ffh[fl-1]=='*') { ans=fshu[fl]*fshu[fl-1]; fl--; fshu[fl]=ans; } if(ffh[fl-1]=='/') { ans=fshu[fl-1]/fshu[fl]; fl--; fshu[fl]=ans; } } ans=fshu[0]; for(i=0;i<fl;i++) { if(ffh[i]=='+') ans+=fshu[i+1]; if(ffh[i]=='-') ans-=fshu[i+1]; } return ans; } double calcu() { int i,n,l,r; cin>>str; n=str.length(); str[n-1]=')'; lst=0;r=0;i=0; while(i<n) { for(;fh[r-1]!=')'&&i<n;i++) { if(str[i]>='0'&&str[i]<='9') shu[lst++]=st_doub(i); fh[r++]=str[i]; } l=r-2; int cont=0; while(fh[l]!='('&&l>=0) { if(fh[l]=='*'||fh[l]=='/'||fh[l]=='-'||fh[l]=='+') cont++;l--; } lst=lst-cont-1; shu[lst++]=cal(l,r-1); r=l; } return shu[0]; } int main() { int n,i,k,mx,l,r,j,l1,r1; bool flg; double num1,num2; scanf("%d",&mx); while(mx--) { printf("%.2lf\n",calcu()); } return 0; }