/** * */ package de.fhswf.in.inf.java1.aufgabe11; import java.util.Stack; /** * A class that calculates in UPN. * * @author $Author: $ * @version $Revision: $, $Date: $ UTC */ public class UPN { private Stack upnStack = new Stack<>(); /** * Empty constructor. * */ public UPN() { } /** * Reads a string and puts it on the UPN upnStack. * * @param upnString * A space delimited string in UPN notation. */ public final void calculate(String upnString) { if (upnString == null) { throw new IllegalArgumentException("UpnString can't be null."); } if (upnString.isEmpty()) { throw new IllegalArgumentException("UpnString can't be empty."); } for (String string : upnString.split("\\s+")) { if (!string.isEmpty()) { Double[] operands = null; switch (string) { case "+": operands = fetch(); upnStack.add(operands[0] + operands[1]); break; case "-": operands = fetch(); upnStack.add(operands[0] - operands[1]); break; case "*": operands = fetch(); upnStack.add(operands[0] * operands[1]); break; case "/": divisorZero(); operands = fetch(); upnStack.add(operands[0] / operands[1]); break; case "%": divisorZero(); operands = fetch(); upnStack.add(operands[0] % operands[1]); break; default: try { upnStack.add(Double.valueOf(string)); } catch (NumberFormatException e) { throw new IllegalArgumentException("String: \"" + string + "\" is not a valid" + " operator nor a valid operand."); } } } } } /** * Get the result of a calculation done before. * * @return The top most value on the UPN stack. */ public final double getResult() { if (upnStack.empty()) { throw new IllegalArgumentException("UPN stack is empty."); } return upnStack.peek(); } /** * Checks if Divisor will be zero. * */ private void divisorZero() { if (upnStack.peek() == 0.0) { throw new IllegalArgumentException("Divisor can't be 0."); } } /** * Checks if there are two values on the stack and returns them. * * @return The two top most doubles from the stack. */ private Double[] fetch() { if (upnStack.size() < 2) { throw new IllegalArgumentException( "Two operands are needed for an operation."); } Double[] ret = new Double[2]; ret[1] = upnStack.pop(); ret[0] = upnStack.pop(); return ret; } }