1-
2-
31## 题目地址(150. 逆波兰表达式求值)
2+
43https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
54
65## 题目描述
@@ -32,7 +31,7 @@ https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
3231
3332输入: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]
3433输出: 22
35- 解释:
34+ 解释:
3635该算式转化为常见的中缀算术表达式为:
3736 ((10 * (6 / ((9 + 3) * -11))) + 17) + 5
3837= ((10 * (6 / (12 * -11))) + 17) + 5
@@ -66,11 +65,12 @@ https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
6665- 腾讯
6766
6867## 思路
68+
6969逆波兰表达式又叫做后缀表达式。在通常的表达式中,二元运算符总是置于与之相关的两个运算对象之间,这种表示法也称为` 中缀表示 ` 。
7070
71- 波兰逻辑学家J.Lukasiewicz于1929年提出了另一种表示表达式的方法 ,按此方法,每一运算符都置于其运算对象之后,故称为` 后缀表示 ` 。
71+ 波兰逻辑学家 J.Lukasiewicz 于 1929 年提出了另一种表示表达式的方法 ,按此方法,每一运算符都置于其运算对象之后,故称为` 后缀表示 ` 。
7272
73- > 逆波兰表达式是一种十分有用的表达式,它将复杂表达式转换为可以依靠简单的操作得到计算结果的表达式。例如(a+b)* (c+d)转换为ab +cd+*
73+ > 逆波兰表达式是一种十分有用的表达式,它将复杂表达式转换为可以依靠简单的操作得到计算结果的表达式。例如(a+b)_ (c+d)转换为 ab +cd+_
7474
7575思路就是:
7676
@@ -84,15 +84,15 @@ https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
8484
85851 . 栈的基本用法
8686
87- 2 . 如果你用的是JS的话 ,需要注意/ 和 其他很多语言是不一样的
87+ 2 . 如果你用的是 JS 的话 ,需要注意/ 和 其他很多语言是不一样的
8888
89- 3 . 如果你用的是JS的话 ,需要先将字符串转化为数字。否则有很多意想不到的结果
89+ 3 . 如果你用的是 JS 的话 ,需要先将字符串转化为数字。否则有很多意想不到的结果
9090
91914 . 操作符的顺序应该是 先出栈的是第二位,后出栈的是第一位。 这在不符合交换律的操作中很重要, 比如减法和除法。
9292
9393## 代码
9494
95- 代码支持:JS,Python,Java
95+ 代码支持:JS,Python,Java, CPP
9696
9797JS Code:
9898
@@ -101,7 +101,7 @@ JS Code:
101101 * @param {string[]} tokens
102102 * @return {number}
103103 */
104- var evalRPN = function (tokens ) {
104+ var evalRPN = function (tokens ) {
105105 // 这种算法的前提是 tokens是有效的,
106106 // 当然这由算法来保证
107107 const stack = [];
@@ -121,7 +121,7 @@ var evalRPN = function(tokens) {
121121 if (token === " *" ) {
122122 stack .push (b * a);
123123 } else if (token === " /" ) {
124- stack .push (b / a >> 0 );
124+ stack .push (( b / a) >> 0 );
125125 } else if (token === " +" ) {
126126 stack .push (b + a);
127127 } else if (token === " -" ) {
@@ -132,10 +132,8 @@ var evalRPN = function(tokens) {
132132
133133 return stack .pop ();
134134};
135-
136135```
137136
138-
139137Python Code:
140138
141139``` python
@@ -163,7 +161,6 @@ class Solution:
163161 return int (tokens[- 1 ])
164162```
165163
166-
167164Java Code:
168165
169166``` java
@@ -189,10 +186,35 @@ class Solution {
189186}
190187```
191188
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+ ```
192213
193214## 扩展
194215
195216逆波兰表达式中只改变运算符的顺序,并不会改变操作数的相对顺序,这是一个重要的性质。另外逆波兰表达式完全不关心操作符的优先级,这在中缀表达式中是做不到的,这很有趣,感兴趣的可以私下查找资料研究下为什么会这样。
196217
218+ ```
197219
198-
220+ ```
0 commit comments