A trivial reverse-polish stack-based calculator for big numbers
import java.math.BigDecimal;
import java.util.Stack;
/** A trivial reverse-polish stack-based calculator for big numbers */
public class BigNumCalc {
/** an array of Objects, simulating user input */
public static Object[] testInput = {
new BigDecimal("3419229223372036854775807.23343"),
new BigDecimal("2.0"),
"*",
};
public static void main(String[] args) {
BigNumCalc calc = new BigNumCalc();
System.out.println(calc.calculate(testInput));
}
Stack s = new Stack();
public BigDecimal calculate(Object[] input) {
BigDecimal tmp;
for (int i = 0; i < input.length; i++) {
Object o = input[i];
if (o instanceof BigDecimal) {
s.push(o);
} else if (o instanceof String) {
switch (((String)o).charAt(0)) {
// + and * are commutative, order doesn't matter
case '+':
s.push(((BigDecimal)s.pop()).add((BigDecimal)s.pop()));
break;
case '*':
s.push(((BigDecimal)s.pop()).multiply((BigDecimal)s.pop()));
break;
// - and /, order *does* matter
case '-':
tmp = (BigDecimal)s.pop();
s.push(((BigDecimal)s.pop()).subtract(tmp));
break;
case '/':
tmp = (BigDecimal)s.pop();
s.push(((BigDecimal)s.pop()).divide(tmp,
BigDecimal.ROUND_UP));
break;
default:
throw new IllegalStateException("Unknown OPERATOR popped");
}
} else {
throw new IllegalArgumentException("Syntax error in input");
}
}
return (BigDecimal)s.pop();
}
}
Related examples in the same category