solution.md 1.7 KB
Newer Older
每日一练社区's avatar
每日一练社区 已提交
1 2 3
# 逆波兰表达式

正常的表达式称为中缀表达式,运算符在中间,主要是给人阅读的,机器求解并不方便。  
每日一练社区's avatar
每日一练社区 已提交
4

每日一练社区's avatar
每日一练社区 已提交
5
例如:3 + 5 * (2 + 6) - 1  
每日一练社区's avatar
每日一练社区 已提交
6

每日一练社区's avatar
每日一练社区 已提交
7
而且,常常需要用括号来改变运算次序。  
每日一练社区's avatar
每日一练社区 已提交
8

每日一练社区's avatar
每日一练社区 已提交
9
相反,如果使用逆波兰表达式(前缀表达式)表示,上面的算式则表示为:  
每日一练社区's avatar
每日一练社区 已提交
10

每日一练社区's avatar
每日一练社区 已提交
11 12 13
```
- + 3 * 5 + 2 6 1
```
每日一练社区's avatar
每日一练社区 已提交
14

每日一练社区's avatar
每日一练社区 已提交
15
不再需要括号,机器可以用递归的方法很方便地求解。
每日一练社区's avatar
每日一练社区 已提交
16

每日一练社区's avatar
每日一练社区 已提交
17
为了简便,我们假设:
每日一练社区's avatar
每日一练社区 已提交
18

每日一练社区's avatar
每日一练社区 已提交
19
*  只有 $ + - * $ 三种运算符
每日一练社区's avatar
每日一练社区 已提交
20

每日一练社区's avatar
每日一练社区 已提交
21
*  每个运算数都是一个小于10的非负整数  
每日一练社区's avatar
每日一练社区 已提交
22 23

下面的程序对一个逆波兰表示串进行求值。  
每日一练社区's avatar
每日一练社区 已提交
24

每日一练社区's avatar
每日一练社区 已提交
25
其返回值为一个数组:其中第一元素表示求值结果,第二个元素表示它已解析的字符数。 
每日一练社区's avatar
每日一练社区 已提交
26

每日一练社区's avatar
每日一练社区 已提交
27
请你补全代码:
每日一练社区's avatar
每日一练社区 已提交
28

每日一练社区's avatar
每日一练社区 已提交
29
```c
每日一练社区's avatar
每日一练社区 已提交
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
#include <bits/stdc++.h>
using namespace std;

struct EV
{
    int result;
    int n;
};

struct EV evaluate(char *x)
{
    struct EV ev = {0, 0};
    struct EV v1;
    struct EV v2;

    if (*x == 0)
        return ev;

    if (x[0] >= '0' && x[0] <= '9')
    {
        ev.result = x[0] - '0';
        ev.n = 1;
        return ev;
    }

    v1 = evaluate(x + 1);
    __________________

    if (x[0] == '+')
        ev.result = v1.result + v2.result;
    if (x[0] == '*')
        ev.result = v1.result * v2.result;
    if (x[0] == '-')
        ev.result = v1.result - v2.result;
    ev.n = 1 + v1.n + v2.n;

    return ev;
}

int main(int argc, char **argv)
{
    string str = "-+3*5+261";
    const EV &ev = evaluate((char *)(str.c_str()));
    cout << ev.result << endl;
    return 0;
}
```

## 答案

每日一练社区's avatar
每日一练社区 已提交
80
```c
每日一练社区's avatar
每日一练社区 已提交
81 82 83 84 85 86 87
v2 = evaluate(x + v1.n + 1);
```

## 选项

### A

每日一练社区's avatar
每日一练社区 已提交
88
```c
每日一练社区's avatar
每日一练社区 已提交
89 90 91 92 93
v2 = evaluate(x + v1.n);
```

### B

每日一练社区's avatar
每日一练社区 已提交
94
```c
每日一练社区's avatar
每日一练社区 已提交
95 96 97 98 99
v2 = evaluate(v1.n);
```

### C

每日一练社区's avatar
每日一练社区 已提交
100
```c
每日一练社区's avatar
每日一练社区 已提交
101 102
v2 = evaluate(v1.n + 1);
```