表达式求值
时间限制:
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
-
-
<pre name="code" class="cpp"><span style="color:#009900;">//程序代码如下: #include<stdio.h> #include<string.h> #include<stdlib.h> #include<stack> using namespace std; stack<float> Ps; //定义float型数据栈 stack<char> Cs; //定义字符栈 char str[20]; char Prio[7] [7]= {///* + - * / ( ) = //算术优先级表 /*+*/ {'>', '>', '<', '<', '<', '>', '>',}, /*-*/ {'>', '>', '<', '<', '<', '>', '>',}, /***/ {'>', '>', '>', '>', '<', '>', '>',}, /*/*/ {'>', '>', '>', '>', '<', '>', '>',}, /*(*/ {'<', '<', '<', '<', '<', '=', '0',}, /*)*/ {'>', '>', '>', '>', '0', '>', '>',}, /*=*/ {'<', '<', '<', '<', '<', '0', '=',} }; int getNum(char c){ switch(c){ case '+':return 0; case '-':return 1; case '*':return 2; case '/':return 3; case '(':return 4; case ')':return 5; case '=':return 6; } } bool isChar(char c){ //判断输入的字符是否为0~9或‘.’ if(c>='0'&&c<='9'||c=='.') return true; return false; } float jisuan(float a,char str,float b){ //计算a*b switch(str){ case '+':return a+b; case '-':return a-b; case '*':return a*b; case '/':return a/b; } } int main(){ int ncase; char c; char str[20]; float a,b; int i=0;int flag=0;; scanf("%d",&ncase); while(ncase--){ Cs.push('='); //printf("%d",Cs.empty()); getchar(); c=getchar(); while(!(c == '=' && Cs.top() == '=')) { //c=getchar(); if(isChar(c)){ flag=1; str[i++]=c; //用字符数组str记录输入的数字字符,解决当 c=getchar(); } else{ if(flag==1){ //flag用来判断是否向PS压入数据,解决当输入完毕时atof(str)为0时, str[i++]='\n'; // 可能出现的一直向PS栈压入0的情况 Ps.push(atof(str)); // printf("*****%.2f*****\n",atof(str)); i=0; flag=0; } switch(Prio[getNum(Cs.top())][getNum(c)]) //获取CS栈顶字符与 当前输入字符c的优先级 { case '>':a=Ps.top();Ps.pop(); b=Ps.top();Ps.pop(); Ps.push(jisuan(b,Cs.top(),a)); Cs.pop();//printf("****%c****\n",Cs.top()); break; case '=':Cs.pop(); c=getchar(); break; case '<':Cs.push(c); c=getchar(); break; default: break; } } //printf("****%c %d****\n",Cs.top(),Ps.top()); } //Cs.pop(); printf("%.2f\n",Ps.top()); Ps.pop(); //清空PS栈 } } </span>
-
第一行输入一个整数n,共有n组测试数据(n<10)。
Ps.push(atof(str));