--- title: '150. Evaluate Reverse Polish Notation' description: You are given an array of strings tokens that represents an arithmetic expression in a Reverse Polish Notation icon: dot topics: - { name: "Array", slug: "array" } - { name: "Math", slug: "math" } - { name: "Stack", slug: "stack" } video: "iu0082c4HDE" issue: "https://github.com/prdlk/leetcode/issues/69" sidebar: label: 'Evaluate Reverse Polish Notation' badge: 'Medium' --- ### 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 <= 10^4` - `tokens[i]` is either an operator: "+", "-", "*", or "/", or an integer in the range [-200, 200]. ## Approach ```mermaid flowchart TD S(["evalRPN(tokens)"]) --> I["stack = [], operations = + - * /"] I --> L{"more token c?"} L -- no --> E(["return stack[0]"]) L -- yes --> Q{"c is an operator?"} Q -- no --> N["stack.append(int(c))"] N --> L Q -- yes --> P["y = stack.pop(), x = stack.pop() — order matters"] P --> C["stack.append(operations[c](x, y))"] C --> L ``` ## Solution ```py class Solution: def evalRPN(self, tokens: List[str]) -> int: stack = [] operations = { "+": lambda x, y: int(x + y), "-": lambda x, y: int(x - y), "*": lambda x, y: int(x * y), "/": lambda x, y: int(x / y), } for c in tokens: if c in operations: y = stack.pop() x = stack.pop() calc_func = operations[c] result = calc_func(x, y) stack.append(result) else: stack.append(int(c)) return stack[0] ```