表达式求值
时间限制:
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
-
-
用两个栈,一个sta1用于储存符号,另一个sta2是储存数值。读取一个字符ch,若ch是符号,则与sta1.top()比较,若ch的优先性高则压入栈,否则取出sta1的栈顶元素,运算数值是sta2的栈顶的前两个元素;
-
难点主要是遇到符号时的判定,包括"(",")"时该怎么判断;
-
#include<iostream> #include<cstdio> #include<stdlib.h> #include<string.h> #include<stack> using namespace std; char s[1010]; char t[1010]; int fuhao(char ch1,char ch2){ if(ch2==')'&&ch1=='('){ return 0; } else if(ch1=='('||ch2=='('||(ch2=='*'||ch2=='/')&&(ch1=='-'||ch1=='+')){ return 1; } else{ return -1; } } double oper(double a,double b,char c){ if(c=='-'){ return a-b; } else if(c=='+'){ return a+b; } else if(c=='*'){ return a*b; } else{ return a/b; } } int main(){ int T; scanf("%d",&T); getchar(); while(T--){ stack<double> q; stack<char> p; char ch; int i,j,k; i=0; ch='0'; while(ch!='='||!p.empty()){ if(ch!='='){ cin>>ch; } if(ch<='9'&&ch>='0'||ch=='.'){ t[i++]=ch; continue; } if(i!=0){ t[i]='\0'; q.push(atof(t));//cout<<"a"<<atof(t)<<endl; i=0; } // else{ while(1){ if(ch!='='&&p.empty()){ p.push(ch);//cout<<"b"<<ch<<endl; break; } else if(p.empty()){ break; } char ch2=p.top(); int l=fuhao(ch2,ch); if(l==0){ char u=p.top(); p.pop();//cout<<"d"<<u<<endl; break; } else if(l>0){//cout<<"c"<<ch<<endl; p.push(ch); break; } else{ //cout<<-1<<endl; double a,b,c; a=q.top(); q.pop(); b=q.top(); q.pop(); //cout<<"*"<<b<<endl<<a<<"*"<<endl; c=oper(b,a,p.top()); //cout<<c<<endl; char u=p.top(); p.pop();//cout<<"d"<<u<<endl; q.push(c); } } // } } printf("%.2lf\n",q.top()); } return 0; }
-
第一行输入一个整数n,共有n组测试数据(n<10)。