mirror of
https://github.com/prdlk/leetcode.git
synced 2026-11-02 13:12:44 +00:00
76 lines
2.1 KiB
Plaintext
76 lines
2.1 KiB
Plaintext
---
|
|
title: '150. Evaluate Reverse Polish Notation'
|
|
description: You are given an array of strings tokens that represents an arithmetic expression in a Reverse Polish Notation
|
|
icon: dot
|
|
topics:
|
|
- { name: "Array", slug: "array" }
|
|
- { name: "Math", slug: "math" }
|
|
- { name: "Stack", slug: "stack" }
|
|
video: "iu0082c4HDE"
|
|
issue: "https://github.com/prdlk/leetcode/issues/69"
|
|
sidebar:
|
|
label: 'Evaluate Reverse Polish Notation'
|
|
badge: 'Medium'
|
|
---
|
|
|
|
### Example 1:
|
|
- Input: `tokens = ["2","1","+","3","*"]`
|
|
- Output: `9`
|
|
- Explanation: `((2 + 1`) * `3`) = `9`
|
|
|
|
### Example 2:
|
|
- Input: `tokens = ["4","13","5","/","+"]`
|
|
- Output: `6`
|
|
- Explanation: `(4 + (13 / 5`)) = `6`
|
|
|
|
### Example 3:
|
|
- Input: `tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]`
|
|
- Output: `22`
|
|
- Explanation: `((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`
|
|
|
|
### Constraints:
|
|
|
|
- `1 <= tokens.length <= 10^4`
|
|
- `tokens[i]` is either an operator: "+", "-", "*", or "/", or an integer in the range [-200, 200].
|
|
|
|
## Approach
|
|
|
|
```mermaid
|
|
flowchart TD
|
|
S(["evalRPN(tokens)"]) --> I["stack = [], operations = + - * /"]
|
|
I --> L{"more token c?"}
|
|
L -- no --> E(["return stack[0]"])
|
|
L -- yes --> Q{"c is an operator?"}
|
|
Q -- no --> N["stack.append(int(c))"]
|
|
N --> L
|
|
Q -- yes --> P["y = stack.pop(), x = stack.pop() — order matters"]
|
|
P --> C["stack.append(operations[c](x, y))"]
|
|
C --> L
|
|
```
|
|
|
|
## Solution
|
|
|
|
```py
|
|
class Solution:
|
|
def evalRPN(self, tokens: List[str]) -> int:
|
|
stack = []
|
|
operations = {
|
|
"+": lambda x, y: int(x + y),
|
|
"-": lambda x, y: int(x - y),
|
|
"*": lambda x, y: int(x * y),
|
|
"/": lambda x, y: int(x / y),
|
|
}
|
|
|
|
for c in tokens:
|
|
if c in operations:
|
|
y = stack.pop()
|
|
x = stack.pop()
|
|
calc_func = operations[c]
|
|
result = calc_func(x, y)
|
|
stack.append(result)
|
|
else:
|
|
stack.append(int(c))
|
|
|
|
return stack[0]
|
|
```
|