A trivial reverse-polish stack-based calculator for big numbers : Big Integer « Development Class « Java






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

1.Big Integer demo
2.Another Big Integer
3.Demonstrate large numbersDemonstrate large numbers