表达式求值
时间限制:
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
来源
- 数据结构课本例题改进 上传者
- 张云聪
-
第一行输入一个整数n,共有n组测试数据(n<10)。
一点测试数据:
3
1.000+2/4=
((1+2)*5+1)/4=
0+3*(1+2*3/2-1)/3/3=
优先级 括号大于乘除 大于加减 两个栈 一个存放操作数 一个存放操作符 当前操作符小于等于栈顶操作符的优先级时要取出两个操作数(注意顺序)和一个栈中的操作符进行计算将计算结果入栈 之后不要将当前操作符入栈
#include <iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<stack>
#define maxn 1010
using namespace std;
stack<double>num;
stack<char>op;
void cal()
{
double s,a,b;
char o;
s=0;
b=num.top();
num.pop();
a=num.top();
num.pop();
o=op.top();
op.pop();
if(o=='+')
s=a+b;
else if(o=='-')
s=a-b;
else if(o=='*')
s=a*b;
else
s=a/b;
num.push(s);
}
int main()
{
int t;
double f,r;
char c,s[maxn];
scanf("%d",&t);
while(t--)
{
scanf("%s",s);
int lens=strlen(s);
r=-1,f=0;
for(int i=0;i<lens;++i)
{
c=s[i];
if(c>='0'&&c<='9')
{
if(r==-1)
r=0;
if(f)
{
r+=(c-'0')*pow(10,f);
f=f-1;
}
else
r=r*10+c-'0';
}
else if(c=='.')
f=-1;
else
{
if(r!=-1)
num.push(r);
r=-1,f=0;
if(c=='=')
{
while(!op.empty())
cal();
printf("%.2lf\n",num.top());
num.pop();
}
else if(c=='(')
op.push(c);
else if(c==')')
{
while(op.top()!='(')
cal();
op.pop();
}
else
{
if(op.empty())
op.push(c);
else if(c=='*'||c=='/')
{
while(!op.empty()&&op.top()!='+'&&op.top()!='-'&&op.top()!='(')
cal();
op.push(c);
}
else
{
while(!op.empty()&&op.top()!='(')
cal();
op.push(c);
}
}
}
}
}
return 0;
}