Download | Plain Text | Line Numbers


/*
 * Copyright (c) 2008, Manuel Mausz <manuel at mausz.at>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of the copyright holders nor the
 *       names of its contributors may be used to endorse or promote products
 *       derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 */
 
import java.util.Stack;
import java.util.HashMap;
import java.util.Iterator;
 
/**
 * Implements a RPN Calculator (stack based)
 * See http://en.wikipedia.org/wiki/Reverse_Polish_notation for more info
 *
 * @version 1.0
 * @author  Manuel Mausz (manuel at mausz.at)
 * @author  http://manuel.mausz.at/
 */
class Rechner implements UPNRechner
{
  private Stack<Double> stack = new Stack<Double>();
  private HashMap<String, UPNOperation> operations = new HashMap<String, UPNOperation>();
 
  /**
   * add operation to "supported operations"-list
   *
   * @param op operation object
   */
  public void addOperation(UPNOperation op)
  {
    operations.put(op.getOperationSymbol(), op);
  }
 
  /**
   * get operation mapped to the specified operation-symbol
   *
   * @param op operation symbol
   * @return operation object or null
   */
  public UPNOperation getOperation(String op)
  {
    return (operations.containsKey(op)) ? operations.get(op) : null;
  }
 
  /**
   * push operand onto internal stack
   *
   * @param val value
   */
  public void enterNumber(Double val)
  {
    stack.push(val);
  }
 
  /**
   * executes operation assigned to operation symbol
   *
   * @param opstr operation symbol
   * @throws InvalidOperationException if operation isn't supported
   * @throws InvalidParameterException
   */
  public void enterOperation(String opstr)
    throws InvalidOperationException, InvalidParameterException
  {
    UPNOperation op = getOperation(opstr);
    if (op == null)
      throw new InvalidOperationException("Operator doesn't exist");
    op.execute(stack);
  }
 
  /**
   * returns internal stack converted to string
   *
   * @return string
   */
  public String toString()
  {
    String str = "";
    Iterator it = stack.iterator();
    while(it.hasNext())
      str += it.next() + " ";
    return str;
  }
}