Problem Description
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 2 4 + 2 * 5 - 7 / 11 0
Sample Output
3.00 13.36
Source
Recommend
这个题困扰我几天了,看了别人的博客,这个方法太厉害了,居然不保存 字符数组
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define MID(x,y) ((x+y)>>1)
#define eps 1e-8
using namespace std;
#define N 10005
int main()
{
int i;
char c,cc;
double a,b;
while(~scanf("%lf%c",&a,&c))
{
if(fabs(a-0)<eps&&c=='\n')
break;
if(c=='\n')
{
printf("%.2lf\n",a);
continue;
}
stack<double>q;
q.push(a);
scanf("%c%lf",&c,&a);
if(c=='+')
q.push(a);
else
if(c=='-')
q.push(a*(-1));
else
{
double cur=q.top();
q.pop();
if(c=='*')
q.push(cur*a);
else
q.push(cur/a);
}
while(scanf("%c",&c))
{
if(c=='\n') break;
scanf("%c%lf",&c,&a) ;
if(c=='+')
q.push(a);
else
if(c=='-')
q.push(a*(-1));
else
{
double cur=q.top();
q.pop();
if(c=='*')
q.push(cur*a);
else
q.push(cur/a);
}
}
double ans=0;
while(!q.empty())
{
ans+=q.top();
q.pop();
}
printf("%.2lf\n",ans);
}
return 0;
}