package com.interview.flag.g;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
/**
* Created_By: stefanie
* Date: 15-1-27
* Time: 下午10:22
*/
public class G45_ExpressionEvaler {
class Expression{
String op;
List<Integer> numbers = new ArrayList();
public Expression(String op){
this.op = op;
}
public int eval(){
if(op.equals("*")){
int product = 1;
for(int i = 0; i < numbers.size(); i++) product *= numbers.get(i);
return product;
} else {
int sum = 0;
for(int i = 0; i < numbers.size(); i++) sum += numbers.get(i);
return sum;
}
}
}
public int eval(String expression){
String[] tokens = expression.split("\\s");
Stack<Expression> stack = new Stack();
for(int i = 0; i < tokens.length; i++){
if(tokens[i].equals("(")) continue;
else if(tokens[i].equals("*") || tokens[i].equals("+")) stack.push(new Expression(tokens[i]));
else if(tokens[i].equals(")")){
Expression expr = stack.pop();
if(!stack.isEmpty()) stack.peek().numbers.add(expr.eval());
else return expr.eval();
} else stack.peek().numbers.add(Integer.parseInt(tokens[i]));
}
return stack.peek().eval();
}
public static void main(String[] args){
G45_ExpressionEvaler evaler = new G45_ExpressionEvaler();
System.out.println(evaler.eval("( * 1 ( + 1 2 3 ) )")); //6
System.out.println(evaler.eval("( * ( + 1 1 ) 17 )")); //34
System.out.println(evaler.eval("( * 17 ( + 1 1 ) )")); //34
}
}