Post

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.