FileDocCategorySizeDatePackage
BigNumCalc.javaAPI DocExample1458Thu May 13 18:28:58 BST 2004None

BigNumCalc.java

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();
	}
}