package LeetCode_150
import java.util.*
/**
* 150. Evaluate Reverse Polish Notation
* https://leetcode.com/problems/evaluate-reverse-polish-notation/description/
*
* Evaluate the value of an arithmetic expression in Reverse Polish Notation.
Valid operators are +, -, *, /. Each operand may be an integer or another expression.
Note:
Division between two integers should truncate toward zero.
The given RPN expression is always valid.
That means the expression would always evaluate to a result and there won't be any divide by zero operation.
Example 1:
Input: ["2", "1", "+", "3", "*"]
Output: 9
Explanation: ((2 + 1) * 3) = 9
Example 2:
Input: ["4", "13", "5", "/", "+"]
Output: 6
Explanation: (4 + (13 / 5)) = 6
* */
class Solution {
fun evalRPN(tokens: Array<String>): Int {
/*
* Time complexity:O(n), Space complexity:O(1)
* */
val stack = Stack<Int>()
val operators = listOf("+", "-", "*", "/")
for (item in tokens) {
if (item in operators) {
val top2 = stack.pop()
val top1 = stack.pop()
var n = 0
when (item) {
"+" -> {
n = top1 + top2
}
"-" -> {
n = top1 - top2
}
"*" -> {
n = top1 * top2
}
"/" -> {
n = top1 / top2
}
}
//push into stack to prepare for next calculate
stack.push(n)
} else {
stack.add(item.toInt())
}
}
return stack.peek()
}
}