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
Example 3:
**Input:** ["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
class Solution {
public int evalRPN(String[] tokens) {
if (tokens == null || tokens.length == 0) {
return 0;
}
Stack<Integer> tracker = new Stack<> ();
int result = 0;
for (String token : tokens) {
if (tracker.size () >= 2 && isOperators (token)) {
int secondNumber = tracker.pop ();
int firstNumber = tracker.pop ();
if (token.equals ("+")) {
tracker.push (firstNumber + secondNumber);
} else if (token.equals ("-")) {
tracker.push (firstNumber - secondNumber);
} else if (token.equals ("*")) {
tracker.push (firstNumber * secondNumber);
} else if (token.equals ("/")) {
tracker.push (firstNumber / secondNumber);
}
} else {
tracker.push (Integer.valueOf (token));
}
}
return (int) (tracker.pop ());
}
public boolean isOperators (String operator) {
return operator.equals ("+") || operator.equals ("-") || operator.equals ("*") || operator.equals ("/");
}
}
网友评论