Welcome to Subscribe On Youtube
150. Evaluate Reverse Polish Notation
Description
You are given an array of strings tokens
that represents an arithmetic expression in a 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 <= 104
tokens[i]
is either an operator:"+"
,"-"
,"*"
, or"/"
, or an integer in the range[-200, 200]
.
Solutions
-
class Solution { public int evalRPN(String[] tokens) { Deque<Integer> stk = new ArrayDeque<>(); for (String t : tokens) { if (t.length() > 1 || Character.isDigit(t.charAt(0))) { stk.push(Integer.parseInt(t)); } else { int y = stk.pop(); int x = stk.pop(); switch (t) { case "+": stk.push(x + y); break; case "-": stk.push(x - y); break; case "*": stk.push(x * y); break; default: stk.push(x / y); break; } } } return stk.pop(); } }
-
class Solution { public: int evalRPN(vector<string>& tokens) { stack<int> stk; for (auto& t : tokens) { if (t.size() > 1 || isdigit(t[0])) { stk.push(stoi(t)); } else { int y = stk.top(); stk.pop(); int x = stk.top(); stk.pop(); if (t[0] == '+') stk.push(x + y); else if (t[0] == '-') stk.push(x - y); else if (t[0] == '*') stk.push(x * y); else stk.push(x / y); } } return stk.top(); } };
-
class Solution: def evalRPN(self, tokens: List[str]) -> int: nums = [] for t in tokens: if len(t) > 1 or t.isdigit(): nums.append(int(t)) else: if t == "+": nums[-2] += nums[-1] elif t == "-": nums[-2] -= nums[-1] elif t == "*": nums[-2] *= nums[-1] else: nums[-2] = int(nums[-2] / nums[-1]) nums.pop() return nums[0]
-
func evalRPN(tokens []string) int { // https://github.com/emirpasic/gods#arraystack stk := arraystack.New() for _, token := range tokens { if len(token) > 1 || token[0] >= '0' && token[0] <= '9' { num, _ := strconv.Atoi(token) stk.Push(num) } else { y := popInt(stk) x := popInt(stk) switch token { case "+": stk.Push(x + y) case "-": stk.Push(x - y) case "*": stk.Push(x * y) default: stk.Push(x / y) } } } return popInt(stk) } func popInt(stack *arraystack.Stack) int { v, _ := stack.Pop() return v.(int) }
-
function evalRPN(tokens: string[]): number { const stack = []; for (const token of tokens) { if (/\d/.test(token)) { stack.push(Number(token)); } else { const a = stack.pop(); const b = stack.pop(); switch (token) { case '+': stack.push(b + a); break; case '-': stack.push(b - a); break; case '*': stack.push(b * a); break; case '/': stack.push(~~(b / a)); break; } } } return stack[0]; }
-
using System.Collections.Generic; public class Solution { public int EvalRPN(string[] tokens) { var stack = new Stack<int>(); foreach (var token in tokens) { switch (token) { case "+": stack.Push(stack.Pop() + stack.Pop()); break; case "-": stack.Push(-stack.Pop() + stack.Pop()); break; case "*": stack.Push(stack.Pop() * stack.Pop()); break; case "/": var right = stack.Pop(); stack.Push(stack.Pop() / right); break; default: stack.Push(int.Parse(token)); break; } } return stack.Pop(); } }
-
impl Solution { pub fn eval_rpn(tokens: Vec<String>) -> i32 { let mut stack = vec![]; for token in tokens { match token.parse() { Ok(num) => stack.push(num), Err(_) => { let a = stack.pop().unwrap(); let b = stack.pop().unwrap(); stack.push(match token.as_str() { "+" => b + a, "-" => b - a, "*" => b * a, "/" => b / a, _ => 0, }); } } } stack[0] } }