总时间限制: 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;}
