描述
读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
输入描述:
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
输出描述:
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
示例1
输入:
1 + 2
4 + 2 * 5 - 7 / 11
0
输出:
3.00
13.36
#define _CRT_SECURE_NO_WARNINGS 1
#include <bits/stdc++.h>
using namespace std;
/*
之前计算表达式的题,不需要处理空格。两者的区别就在于怎么处理输入顺序
无空格版本:先输入数字, 之后就按照运算符+数字的顺序反复。直到输入的运算符为换行符为止
空格版本:先输入数字+空格符,再输入运算符,空格,数字,之后就按照空格,运算符,空格,数字的顺序输入,直到第一个空格为换行符为止
*/
int main()
{
double t, term;//测试数据默认先输入数字。如果存在先输入符号的情况,可以用if语句,比如-5
char c;//紧接着数字输入运算符号,空格
double a[150];//保存结果的栈
double sum;//保存最终结果
int i;//i表示栈的高度,从0开始计算
int j;
//先输入数字,空格
while (scanf("%lf%c", &t, &c) != EOF)
{
sum = 0;
i = 0;
a[0] = t;//输入的第一个数字压栈
if (t != 0 && c == '\n') {
printf("%0.2f\n", t);
continue;
}
if (t == 0 && c == '\n')
break;
//之后的节奏是:符号 空格 或者 数字,空格,或者 数字,换行
do {
//这时候输入运算符,空格,数字
scanf("%c %lf", &c, &term);
//计算逻辑:加法直接压栈,减法压栈相反数,乘法取出一个数相乘后压栈,除法取出一个数相除后压栈
//最关键的就是这个加法的处理,两个操作数都要压栈
if (c == '+')
a[++i] = term;
else if (c == '-')
a[++i] = 0 - term;
else if (c == '*')
a[i] *= term;
else if (c == '/')
a[i] /= term;
} while (scanf("%c", &c) != EOF && c != '\n');//此时又输入空格
for (j = 0; j <= i; j++)
sum += a[j];
printf("%0.2f\n", sum);
}
return 0;
}