总时间限制: 2000ms 单个测试点时间限制: 500ms 内存限制: 65536kB
描述
求一个可以带括号的小学算术四则运算表达式的值
输入
一行,一个四则运算表达式。*
表示乘法,/
表示除法
输出
一行,该表达式的值,保留小数点后面两位
样例输入
输入样例1:
3.4
输入样例2:
7+8.3
输入样例3:
3+4.5*(7+2)*(3)*((3+4)*(2+3.5)/(4+5))-34*(7-(2+3))
样例输出
输出样例1:
3.40
输出样例2:
15.30
输出样例3:
454.75
思路
表达式的定义:
- 表达式由一个
项
或项 + 项
或项 - 项
构成 - 一个
项
由因子
或因子 * 因子
或因子 / 因子
构成 - 一个
因子
由( 表达式 )
或一个整数
构成
可以看出定义本身是递归的. 第3条定义就是它的递归边界.
代码
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
double factorValue();
double termValue();
double expressionValue();
int main() {
printf("%.2f\n", expressionValue());
return 0;
}
double expressionValue() { // 求一个表达式的值
double result = termValue(); // 求第一项的值
while(true) {
char op = cin.peek(); // 看输入流的第一个字符,不取走
if( op == '+' || op == '-' ) {
cin.get(); // 从输入流中取走一个字符
double value = termValue();
if( op == '+' ) result += value;
else result -= value;
}
else break;
}
return result;
}
double termValue() { // 求一个项的值
double result = factorValue(); // 求第一个因子的值
while(true) {
char op = cin.peek();
if( op == '*' || op == '/' ) {
cin.get();
double value = factorValue();
if( op == '*' ) result *= value;
else result /= value;
}
else break;
}
return result;
}
double factorValue() { // 求一个因子的值
double result = 0;
char c = cin.peek();
if( c == '(' ) {
cin.get();
result = expressionValue();
cin.get();
} else {
while( isdigit(c) ) {
result = 10 * result + c - '0';
cin.get();
c = cin.peek();
}
if( c == '.' ) { // 小数部分
double value = 0;
double base = 0.1;
cin.get(); // 读掉小数点
c = cin.peek();
while( isdigit(c) ) {
cin.get();
value += (c - '0') * base;
base = base * 0.1;
c = cin.peek();
}
result += value;
}
}
return result;
}