← Stacks & Queues

Evaluate RPN

Medium
Python
def eval_rpn(tokens):
    stack=[]
    ops={'+':lambda a,b:a+b,'-':lambda a,b:a-b,'*':lambda a,b:a*b,'/':lambda a,b:int(a/b)}
    for t in tokens:
        if t in ops:
            b,a=stack.pop(),stack.pop()
            stack.append(ops[t](a,b))
        else: stack.append(int(t))
    return stack[0]
Java
public int evalRPN(String[] tokens){
    Stack<Integer> stack=new Stack<>();
    for(String t:tokens){
        if("+-*/".contains(t)){
            int b=stack.pop(),a=stack.pop();
            if(t.equals("+")) stack.push(a+b);
            else if(t.equals("-")) stack.push(a-b);
            else if(t.equals("*")) stack.push(a*b);
            else stack.push((int)(a/b));
        } else stack.push(Integer.parseInt(t));
    } return stack.pop();
}

Key Insight

Python dict of lambdas elegant vs Java if-else chain.

Python → Java Differences

  • Dict of lambdas vs if-else chain
  • int(a/b) truncates same direction
  • Integer.parseInt() vs int()
Python
def eval_rpn(tokens):
    stack=[]
    ops={'+':lambda a,b:a+b,'-':lambda a,b:a-b,'*':lambda a,b:a*b,'/':lambda a,b:int(a/b)}
    for t in tokens:
        if t in ops:
            b,a=stack.pop(),stack.pop()
            stack.append(ops[t](a,b))
        else: stack.append(int(t))
    return stack[0]
Java
public int evalRPN(String[] tokens){
    Stack<Integer> stack=new Stack<>();
    for(String t:tokens){
        if("+-*/".contains(t)){
            int b=stack.pop(),a=stack.pop();
            if(t.equals("+")) stack.push(a+b);
            else if(t.equals("-")) stack.push(a-b);
            else if(t.equals("*")) stack.push(a*b);
            else stack.push((int)(a/b));
        } else stack.push(Integer.parseInt(t));
    } return stack.pop();
}

Algorithm Steps

1. Number: push
2. Operator: pop two compute push