LeetCode150 - Evaluate Reverse Polish Notation
LeetCode150 - Evaluate Reverse Polish Notation
题设
给你一个字符串数组 tokens
,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
注意:
- 有效的算符为
'+'
、'-'
、'*'
和'/'
。 - 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
- 两个整数之间的除法总是 向零截断 。
- 表达式中不含除零运算。
- 输入是一个根据逆波兰表示法表示的算术表达式。
- 答案及所有中间计算结果可以用 32 位 整数表示。
示例 1:
1
2
3
输入:tokens = ["2","1","+","3","*"]
输出:9
解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
示例 2:
1
2
3
输入:tokens = ["4","13","5","/","+"]
输出:6
解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6
示例 3:
1
2
3
4
5
6
7
8
9
10
输入:tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]
输出:22
解释:该算式转化为常见的中缀算术表达式为:
((10 * (6 / ((9 + 3) * -11))) + 17) + 5
= ((10 * (6 / (12 * -11))) + 17) + 5
= ((10 * (6 / -132)) + 17) + 5
= ((10 * 0) + 17) + 5
= (0 + 17) + 5
= 17 + 5
= 22
题解
这一题为作者数据结构与算法课的一道习题,习题题设与LeetCode网站上的题目有所不同,但思路相同,即遇到数字则压入栈中,遇到算数符号则把栈顶两数弹出,运算后再把结果压入。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
const int MAXN = 100000;
int Stack[MAXN];
int top = -1;
void push(int e) { Stack[++top] = e; }
int pop() { return Stack[top--]; }
bool isNumber(string& token) {
return !(token == "+" || token == "-" || token == "*" || token == "/");
}
int main() {
string line, token;
// freopen("in.txt", "r", stdin);
getline(cin, line);
istringstream iss(line);
while (getline(iss, token, ',')) {
if (isNumber(token)) {
push(atoi(token.c_str()));
} else {
int n1 = pop();
int n2 = pop();
switch (token[0]) {
case '+':
push(n2 + n1);
break;
case '-':
push(n2 - n1);
break;
case '*':
push(n2 * n1);
break;
case '/':
push(n2 / n1);
break;
}
}
}
cout << pop() << endl;
return 0;
}
This post is licensed under CC BY 4.0 by the author.