package com.interview.algorithms.general; import com.interview.basics.model.collection.stack.LinkedStack; import com.interview.basics.model.collection.stack.Stack; /** * Given an arithmatic expression, evaluate the value of the expression, * suppose the expression only contains "+", "-", "*", "/", "(", ")" and numbers are integers. * * Created_By: zouzhile * Date: 1/15/14 * Time: 2:55 PM */ public class C1_23_ExpressionEvaluation { public double evaluate(String expression) { Stack<String> ops = new LinkedStack<String>(); Stack<Double> numbers = new LinkedStack<Double>(); char[] charArray = expression.toCharArray(); double value = 0; for(int i = 0; i < charArray.length ; i ++) { char currentChar = charArray[i]; if(')' == currentChar) { double number2 = numbers.pop(); double number1 = numbers.pop(); char op = ops.pop().charAt(0); switch(op) { case '+' : value = number1 + number2; break; case '-' : value = number1 - number2; break; case '*' : value = number1 * number2; break; case '/' : value = number1 / number2; break; } numbers.push(value); } else if('(' == currentChar || ' ' == currentChar) { continue; // do nothing here } else if(this.isOperation(currentChar)) { ops.push(currentChar + ""); } else if(this.isNumber(currentChar)) { String numberValue = ""; for(; i < charArray.length; i++) { currentChar = charArray[i]; // the dotProduct '.' of the double value is considered as a number, e.g. 9.5 if(! this.isNumber(currentChar)) { i-- ; // move back to the last digit of the numeric value numbers.push(Double.parseDouble(numberValue)); break; } numberValue += currentChar; } } } return value; } private boolean isOperation(char charValue) { return charValue == '+' || charValue == '-' || charValue == '*' || charValue == '/'; } private boolean isNumber(char charValue) { return ! (charValue == '+' || charValue == '-' || charValue == '*' || charValue == '/' || charValue == '(' || charValue == ')'); } public static void main(String[] args) { C1_23_ExpressionEvaluation evaluater = new C1_23_ExpressionEvaluation(); System.out.println(evaluater.evaluate("(3.9+5.7)")); } }