-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path150_Evaluate_Reverse_Polish_Notation.swift
99 lines (79 loc) · 2.73 KB
/
150_Evaluate_Reverse_Polish_Notation.swift
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/*
Done: 01.06.2024. Revisited: N/A
You are given an array of strings tokens that represents an arithmetic expression in a Reverse Polish Notation: http://en.wikipedia.org/wiki/Reverse_Polish_notation.
Evaluate the expression. Return an integer that represents the value of the expression.
Note that:
The valid operators are '+', '-', '*', and '/'.
Each operand may be an integer or another expression.
The division between two integers always truncates toward zero.
There will not be any division by zero.
The input represents a valid arithmetic expression in a reverse polish notation.
The answer and all the intermediate calculations can be represented in a 32-bit integer.
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].
*/
import Foundation
class P150 {
class StrStack {
private var stack: [String]
init() {
stack = []
}
func push(_ val: String) {
stack.append(val)
}
func pop() -> String? {
stack.removeLast()
}
func top() -> String? {
return stack.last
}
}
// MARK: - Option 1. Time: O(n). Memory: O(n)
func evalRPN(_ tokens: [String]) -> Int {
let stack = StrStack()
for char in tokens {
switch char {
case "+":
let value1 = (Int(stack.pop() ?? "0") ?? 0)
let value2 = (Int(stack.pop() ?? "0") ?? 0)
stack.push(String(value2 + value1))
case "-":
let value1 = (Int(stack.pop() ?? "0") ?? 0)
let value2 = (Int(stack.pop() ?? "0") ?? 0)
stack.push(String(value2 - value1))
case "*":
let value1 = (Int(stack.pop() ?? "0") ?? 0)
let value2 = (Int(stack.pop() ?? "0") ?? 0)
stack.push(String(value2 * value1))
case "/":
let value1 = (Int(stack.pop() ?? "0") ?? 0)
let value2 = (Int(stack.pop() ?? "0") ?? 0)
stack.push(String(value2 / value1))
default:
// number
stack.push(char)
}
}
return Int(stack.top() ?? "0") ?? 0
}
}