/** * */ 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+")) { try { upnStack.add(Double.valueOf(string)); } catch (NumberFormatException e) { double operand1 = 0; double operand2 = 0; if (upnStack.size() < 2) { throw new IllegalStateException( "Two operands are needed for an operation."); } operand2 = upnStack.pop(); operand1 = upnStack.pop(); switch (string) { case "+": upnStack.add(operand1 + operand2); break; case "-": upnStack.add(operand1 - operand2); break; case "*": upnStack.add(operand1 * operand2); break; case "/": if (operand2 == 0) { throw new IllegalArgumentException("Divisor can't be 0."); } upnStack.add(operand1 / operand2); break; case "%": if (operand2 == 0) { throw new IllegalArgumentException("Divisor can't be 0."); } upnStack.add(operand1 % operand2); break; default: throw new IllegalArgumentException("String: \"" + string + "\" is not a valid operator."); } } } } /** * 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 IllegalStateException("UPN stack is empty."); } return upnStack.peek(); } }