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]
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();
}
Python dict of lambdas elegant vs Java if-else chain.
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]
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();
}
1. Number: push 2. Operator: pop two compute push