---
# System prepended metadata

title: '[Evaluate Reverse Polish Notation](https://leetcode.com/problems/evaluate-reverse-polish-notation/)'
tags: [Leetcode, Stack, Medium]

---

# [Evaluate Reverse Polish Notation](https://leetcode.com/problems/evaluate-reverse-polish-notation/)
###### tags: `Leetcode`, `Medium`, `Stack`

## Approach
* We keep adding numbers from our input list onto the stack
* When we encounter a symbol then we pop the last two numbers from the stack
* Then we perform the operation corresponding to the symbol on the two popped elements
* The result is added back to the stack and the process is repeated until the input list is exhausted and only one element is left behind in the stack
* Return the only element in the stack

## Asymptotic Analysis
### Time Complexity: **O(N)**
### Space Complexity: **O(N)**

## Code
``` python
import math
from typing import List


class ReversePolishNotation:
    def _is_integer(self, num: str):
        return num.isdigit() or (num.startswith('-') and num[1:].isdigit())

    def _operate(self, num1: int, num2: int, operation: str) -> int:
        if operation == '+':
            return num1 + num2
        elif operation == '-':
            return num1 - num2
        elif operation == '*':
            return num1 * num2
        elif operation == '/':
            return int(num1 / num2)
        else:
            return -1

    def eval_rpn(self, tokens: List[str]) -> int:
        stack = []
        for token in tokens:
            if self._is_integer(token):
                stack.append(int(token))
            else:
                operator = token
                num2, num1 = int(stack.pop()), int(stack.pop())
                result = self._operate(num1, num2, operator)
                stack.append(result)
        return stack[-1]


nums_list = ["4", "13", "5", "/", "+"]
print(ReversePolishNotation().eval_rpn(nums_list))
```