import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class SimpleCalculator {
public SimpleCalculator() {}
/**
* + = addition
* - = subtraction * = multiplication
* / = division ^ = power (pow)
* % = square-root e.g 2%4 = 2
*
*/
public double calculate(String expression) {
if (expression == null) return Double.MIN_VALUE;
expression = expression.trim();
if (expression.equals("")) return Double.MIN_VALUE;
StringTokenizer str = new StringTokenizer(expression, "+-*/^%", true);
List tokens = new ArrayList(str.countTokens());
w : while (str.hasMoreTokens())
tokens.add(str.nextToken().trim());
w : while (tokens.indexOf("%") > -1) {
f : for (int n = 0; n < tokens.size(); n++)
calculate("%", tokens, n);
}
w : while (tokens.indexOf("^") > -1) {
f : for (int n = 0; n < tokens.size(); n++)
calculate("^", tokens, n);
}
w : while (tokens.indexOf("*") > -1) {
f : for (int n = 0; n < tokens.size(); n++)
calculate("*", tokens, n);
}
w : while (tokens.indexOf("/") > -1) {
f : for (int n = 0; n < tokens.size(); n++)
calculate("/", tokens, n);
}
w : while (tokens.indexOf("-") > -1) {
f : for (int n = 0; n < tokens.size(); n++)
calculate("-", tokens, n);
}
w : while (tokens.indexOf("+") > -1) {
f : for (int n = 0; n < tokens.size(); n++)
calculate("+", tokens, n);
}
if (tokens.size() != 1) return Double.MIN_VALUE;
return toDouble((String) tokens.get(0), Double.MIN_VALUE);
}
private void calculate(String calcType, List tokens, int n) {
String token = (String) tokens.get(n);
if (!token.equals(calcType)) return;
double l, r, res;
int s, e;
if (n - 1 == -1) {
s = 0;
l = 1;
} else {
s = n - 1;
l = toDouble((String) tokens.get(n - 1), 1);
}
if (n + 1 == tokens.size()) {
e = tokens.size() - 1;
r = 1;
} else {
e = n + 1;
r = toDouble((String) tokens.get(n + 1), 1);
}
if (calcType.equals("%"))
res = Math.sqrt(r);
else if (calcType.equals("^"))
res = Math.pow(l, r);
else if (calcType.equals("*"))
res = l * r;
else if (calcType.equals("/"))
res = l / r;
else if (calcType.equals("-"))
res = l - r;
else if (calcType.equals("+"))
res = l + r;
else
res = 0;
tokens.add(e + 1, String.valueOf(res));
f : for (int i = e; i >= s; i--)
tokens.remove(i);
n = n + (e - s);
}
private double toDouble(String number, double defaultNumber) {
try {
return Double.parseDouble(number);
} catch (NumberFormatException e) {}
return defaultNumber;
}
}