表达式求值
-
描述
-
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
运用到了一个atof()函数,是将字符串转化成double,包含在#include<stdlib.h>中。
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<stack> using namespace std; char judge(char op1,char op2) //算符间的优先关系 { if(op1=='+'||op1=='-') { if(op2=='*'||op2=='/'||op2=='(')return '<'; else return '>'; } else if(op1=='*'||op1=='/') { if(op2=='(')return '<'; else return '>'; } else if(op1=='('||op1=='=') { if(op2==')'||op2=='=') return '='; else return '<'; } } double cal(double x1,char op,double x2) //计算结果,注意返回值是x2-x1,x2/x1 { switch(op) { case'+': return x1+x2; case'-': return x2-x1; case'*': return x1*x2; case'/': return x2/x1; } } int main() { stack<double> opnd; //运算数栈 stack<char> optr; //运算符栈 int t,len,i,l; char s[1050],a[1050],c; double ans,x,x1,x2; scanf("%d",&t); while(t--) { l=0; getchar(); optr.push('='); c=getchar(); while(c!='='||optr.top()!='=') //当‘=’=‘=’表示整个表达式求值完毕 { //printf("%c\n",c); if(c>='0'&&c<='9'||c=='.') { a[l++]=c; c=getchar(); continue; } else { a[l]='\0'; x=atof(a); if(l!=0) opnd.push(x); l=0; switch(judge(optr.top(),c)) { case'<': //栈顶优先权低 optr.push(c); c=getchar(); break; case'=': //脱括号并接收下一字符 optr.pop(); c=getchar(); break; case'>': //退栈并将运算结果入栈 char op=optr.top(); optr.pop(); x1=opnd.top(); opnd.pop(); x2=opnd.top(); opnd.pop(); ans=cal(x1,op,x2); opnd.push(ans); // printf("%lf\n",ans); break; } } } // printf("%lf %lf\n",x1,x2); printf("%.2lf\n",ans); } return 0; }
-
第一行输入一个整数n,共有n组测试数据(n<10)。