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]
        }
    }
    
    

All Problems

All Solutions