计算表达式 栈
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
Input
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
Sample Input
1 + 2
4 + 2 * 5 - 7 / 11
0
Sample Output
3.00
13.36
#include<iostream>
#include<algorithm>
#include<stack>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{
double a,b,c;
char e,f,g;
while(scanf("%lf%c",&a,&e))
{
if(a==0&&e=='\n') //用来统计是否为结束标志
break;
stack<double>as;
as.push(a);
while(scanf("%c %lf",&f,&b))//输入 字符 数字 中间空格
{
if(f=='+') //判断字符为 + 直接入栈
as.push(b);
else if(f=='-') //字符为 - 将输入的数字 改为 -的入栈
as.push(-b);
else if(f=='*') // 字符为 * 根据运算优先级 先算 * 所以 将上一个数出栈 与 *后面输入的数进行运算
{
c=b*as.top();
as.pop();
as.push(c);
}
else if(f=='/') // 同乘法
{
c=as.top()*1.0/b;
as.pop();
as.push(c);
}
g=getchar(); // 根据输入的格式 吃掉数字后的空格 并进行判断如果是 回车键 就输入结束
if(g=='\n')
break;
}
double sum=0.0;
while(!as.empty()) //将栈中的数字 全部依次取出相加
{
sum+=as.top();
as.pop();
}
printf("%.2lf\n",sum);
}
return 0;
}