总时间限制: 2000ms 单个测试点时间限制: 500ms 内存限制: 65536kB

描述

求一个可以带括号的小学算术四则运算表达式的值

输入

一行,一个四则运算表达式。*表示乘法,/表示除法

输出

一行,该表达式的值,保留小数点后面两位

样例输入

  1. 输入样例1
  2. 3.4
  3. 输入样例2:
  4. 7+8.3
  5. 输入样例3:
  6. 3+4.5*(7+2)*(3)*((3+4)*(2+3.5)/(4+5))-34*(7-(2+3))

样例输出

  1. 输出样例1:
  2. 3.40
  3. 输出样例2:
  4. 15.30
  5. 输出样例3
  6. 454.75

思路

表达式的定义:

  1. 表达式由一个 项 + 项项 - 项 构成
  2. 一个 因子因子 * 因子因子 / 因子 构成
  3. 一个 因子( 表达式 )一个整数 构成

可以看出定义本身是递归的. 第3条定义就是它的递归边界.

代码

  1. #include <iostream>
  2. #include <cmath>
  3. #include <cstring>
  4. using namespace std;
  5. double factorValue();
  6. double termValue();
  7. double expressionValue();
  8. int main() {
  9. printf("%.2f\n", expressionValue());
  10. return 0;
  11. }
  12. double expressionValue() { // 求一个表达式的值
  13. double result = termValue(); // 求第一项的值
  14. while(true) {
  15. char op = cin.peek(); // 看输入流的第一个字符,不取走
  16. if( op == '+' || op == '-' ) {
  17. cin.get(); // 从输入流中取走一个字符
  18. double value = termValue();
  19. if( op == '+' ) result += value;
  20. else result -= value;
  21. }
  22. else break;
  23. }
  24. return result;
  25. }
  26. double termValue() { // 求一个项的值
  27. double result = factorValue(); // 求第一个因子的值
  28. while(true) {
  29. char op = cin.peek();
  30. if( op == '*' || op == '/' ) {
  31. cin.get();
  32. double value = factorValue();
  33. if( op == '*' ) result *= value;
  34. else result /= value;
  35. }
  36. else break;
  37. }
  38. return result;
  39. }
  40. double factorValue() { // 求一个因子的值
  41. double result = 0;
  42. char c = cin.peek();
  43. if( c == '(' ) {
  44. cin.get();
  45. result = expressionValue();
  46. cin.get();
  47. } else {
  48. while( isdigit(c) ) {
  49. result = 10 * result + c - '0';
  50. cin.get();
  51. c = cin.peek();
  52. }
  53. if( c == '.' ) { // 小数部分
  54. double value = 0;
  55. double base = 0.1;
  56. cin.get(); // 读掉小数点
  57. c = cin.peek();
  58. while( isdigit(c) ) {
  59. cin.get();
  60. value += (c - '0') * base;
  61. base = base * 0.1;
  62. c = cin.peek();
  63. }
  64. result += value;
  65. }
  66. }
  67. return result;
  68. }