1
-
2
-
3
1
## 题目地址(150. 逆波兰表达式求值)
2
+
4
3
https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
5
4
6
5
## 题目描述
@@ -32,7 +31,7 @@ https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
32
31
33
32
输入: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]
34
33
输出: 22
35
- 解释:
34
+ 解释:
36
35
该算式转化为常见的中缀算术表达式为:
37
36
((10 * (6 / ((9 + 3) * -11))) + 17) + 5
38
37
= ((10 * (6 / (12 * -11))) + 17) + 5
@@ -66,11 +65,12 @@ https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
66
65
- 腾讯
67
66
68
67
## 思路
68
+
69
69
逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为` 中缀表示 ` 。
70
70
71
- 波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法 ,按此方法,每一运算符都置于其运算对象之后,故称为` 后缀表示 ` 。
71
+ 波兰逻辑学家 J.Lukasiewicz 于 1929 年提出了另一种表示表达式的方法 ,按此方法,每一运算符都置于其运算对象之后,故称为` 后缀表示 ` 。
72
72
73
- > 逆波兰表达式是一种十分有用的表达式,它将复杂表达式转换为可以依靠简单的操作得到计算结果的表达式。例如(a+b)* (c+d)转换为ab +cd+*
73
+ > 逆波兰表达式是一种十分有用的表达式,它将复杂表达式转换为可以依靠简单的操作得到计算结果的表达式。例如(a+b)_ (c+d)转换为 ab +cd+_
74
74
75
75
思路就是:
76
76
@@ -84,15 +84,15 @@ https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
84
84
85
85
1 . 栈的基本用法
86
86
87
- 2 . 如果你用的是JS的话 ,需要注意/ 和 其他很多语言是不一样的
87
+ 2 . 如果你用的是 JS 的话 ,需要注意/ 和 其他很多语言是不一样的
88
88
89
- 3 . 如果你用的是JS的话 ,需要先将字符串转化为数字。否则有很多意想不到的结果
89
+ 3 . 如果你用的是 JS 的话 ,需要先将字符串转化为数字。否则有很多意想不到的结果
90
90
91
91
4 . 操作符的顺序应该是 先出栈的是第二位,后出栈的是第一位。 这在不符合交换律的操作中很重要, 比如减法和除法。
92
92
93
93
## 代码
94
94
95
- 代码支持:JS,Python,Java
95
+ 代码支持:JS,Python,Java, CPP
96
96
97
97
JS Code:
98
98
@@ -101,7 +101,7 @@ JS Code:
101
101
* @param {string[]} tokens
102
102
* @return {number}
103
103
*/
104
- var evalRPN = function (tokens ) {
104
+ var evalRPN = function (tokens ) {
105
105
// 这种算法的前提是 tokens是有效的,
106
106
// 当然这由算法来保证
107
107
const stack = [];
@@ -121,7 +121,7 @@ var evalRPN = function(tokens) {
121
121
if (token === " *" ) {
122
122
stack .push (b * a);
123
123
} else if (token === " /" ) {
124
- stack .push (b / a >> 0 );
124
+ stack .push (( b / a) >> 0 );
125
125
} else if (token === " +" ) {
126
126
stack .push (b + a);
127
127
} else if (token === " -" ) {
@@ -132,10 +132,8 @@ var evalRPN = function(tokens) {
132
132
133
133
return stack .pop ();
134
134
};
135
-
136
135
```
137
136
138
-
139
137
Python Code:
140
138
141
139
``` python
@@ -163,7 +161,6 @@ class Solution:
163
161
return int (tokens[- 1 ])
164
162
```
165
163
166
-
167
164
Java Code:
168
165
169
166
``` java
@@ -189,10 +186,35 @@ class Solution {
189
186
}
190
187
```
191
188
189
+ CPP Code:
190
+
191
+ ``` cpp
192
+ class Solution {
193
+ public:
194
+ int evalRPN(vector<string >& tokens) {
195
+ stack<int > s;
196
+ for (string t : tokens) {
197
+ if (isdigit(t.back())) s.push(stoi(t));
198
+ else {
199
+ int n = s.top();
200
+ s.pop();
201
+ switch(t[ 0] ) {
202
+ case '+': s.top() += n; break;
203
+ case '-': s.top() -= n; break;
204
+ case '* ': s.top() * = n; break;
205
+ case '/': s.top() /= n; break;
206
+ }
207
+ }
208
+ }
209
+ return s.top();
210
+ }
211
+ };
212
+ ```
192
213
193
214
## 扩展
194
215
195
216
逆波兰表达式中只改变运算符的顺序,并不会改变操作数的相对顺序,这是一个重要的性质。另外逆波兰表达式完全不关心操作符的优先级,这在中缀表达式中是做不到的,这很有趣,感兴趣的可以私下查找资料研究下为什么会这样。
196
217
218
+ ```
197
219
198
-
220
+ ```
0 commit comments