leetcode 150. Evaluate Reverse Polish Notation (Python)

20 Jun 2020 Leetcode Stack

150. Evaluate Reverse Polish Notation (Python)

Stack.

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.

Sample I/O

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

Methodology

This is straight forward question. We need stack to store the operands. We iterate the list. There are two types of elements

  1. If the element is operand, we append it to the stack
  2. If the element is operator, we pop out last two operands and do the caculation then append the result back to stack

import math
class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        stack = []
        operators = {'+', '-', '*', '/'}
        if len(tokens) == 1: return int(tokens[0])
        for token in tokens:
            if token not in operators:
                stack.append(int(token))
            else:
                sec_operand = stack.pop()
                fir_operand = stack.pop()
                tmp=0
                if token == '+':
                    tmp = fir_operand + sec_operand
                elif token == '-':
                    tmp = fir_operand - sec_operand
                elif token == '*':
                    tmp = fir_operand * sec_operand
                elif token == '/':
                    tmp = fir_operand / sec_operand
                    tmp = math.trunc(tmp)
                stack.append(tmp)
        return stack.pop()
                

BigO

Iterate the list will take O(n) the append and pop will take O(1) so in total O(n) where n is the length of the list

Search

    Table of Contents