2694:逆波兰表达式,考点:递归

原题:http://bailian.openjudge.cn/practice/2694/

描述

逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4。本题求解逆波兰表达式的值,其中运算符包括+ - * /四个。

输入

输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数。

输出

输出为一行,表达式的值。
可直接用printf("%f\n", v)输出表达式的值v。

样例输入

* + 11.0 12.0 + 24.0 35.0

样例输出

1357.000000

解法

思路:递归调用,坑——最后输出的精度问题

一开始自己写的版本,比较冗余,整体输入再递归,主要是为了熟悉一下字符串的各种操作。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cmath>
 4 #include <iomanip>
 5 using namespace std;
 6 int n;
 7 char input[10000][100];
 8 double calculate()
 9 {
10     if (strcmp(input[n], "*")==0) {
11         n++;
12         double factora = calculate();
13         n++;
14         double factorb = calculate();
15         return factora * factorb;
16     }
17     else if (strcmp(input[n], "+")==0) {
18         n++;
19         double factora = calculate();
20         n++;
21         double factorb = calculate();
22         return factora + factorb;
23     }
24     else if (strcmp(input[n], "/") == 0) {
25         n++;
26         double factora = calculate();
27         n++;
28         double factorb = calculate();
29         return factora / factorb;
30     }
31     else if (strcmp(input[n], "-") == 0) {
32         n++;
33         double factora = calculate();
34         n++;
35         double factorb = calculate();
36         return factora - factorb;
37     }
38     else
39         return atof(input[n]);
40 }
41 int main()
42 {
43     memset(input, 0, sizeof(input));
44     char strings[10000];
45     cin.getline(strings, 10000);
46     int len = strlen(strings);
47     int i = 0, indexi = 0;
48     for (int j = 0; j < len; j++)
49     {
50         if (strings[j] != ' ')
51         {
52             input[i][indexi++] = strings[j];
53         }
54         else {
55             input[i++][indexi] = '\0';
56             indexi = 0;
57         }
58     }
59     input[i][indexi] = '\0';
60     n = 0;
61     cout << fixed << setprecision(6) << calculate() << endl;
62     return 0;
63 }

最后提交的版本,边递归边读输入,非常简短

 1 #include <iostream>
 2 #include <iomanip>
 3 using namespace std;
 4 double cal() {
 5     char temp[10];
 6     cin >> temp;
 7     if (temp[0] <= '9'&&temp[0] >= '0')
 8         return atof(temp);
 9     else {
10         double factora = cal();
11         double factorb = cal();
12         switch (temp[0]) {
13         case '*':return factora * factorb;
14         case '/':return factora / factorb;
15         case '+':return factora + factorb;
16         case '-':return factora - factorb;
17         }
18     }
19 }
20 int main()
21 {
22     cout << fixed << setprecision(6) << cal() << endl;
23 }

 

posted @ 2021-07-08 21:14  永远是个小孩子  阅读(87)  评论(0)    收藏  举报