diff options
| -rw-r--r-- | src/de/fhswf/in/inf/java1/aufgabe11/UPN.java | 110 | ||||
| -rw-r--r-- | src/de/fhswf/in/inf/java1/aufgabe11/UpnMain.java | 41 |
2 files changed, 151 insertions, 0 deletions
diff --git a/src/de/fhswf/in/inf/java1/aufgabe11/UPN.java b/src/de/fhswf/in/inf/java1/aufgabe11/UPN.java new file mode 100644 index 0000000..25b939e --- /dev/null +++ b/src/de/fhswf/in/inf/java1/aufgabe11/UPN.java @@ -0,0 +1,110 @@ +/** + * + */ +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<Double> 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(); + } + +} diff --git a/src/de/fhswf/in/inf/java1/aufgabe11/UpnMain.java b/src/de/fhswf/in/inf/java1/aufgabe11/UpnMain.java new file mode 100644 index 0000000..a0f8a00 --- /dev/null +++ b/src/de/fhswf/in/inf/java1/aufgabe11/UpnMain.java @@ -0,0 +1,41 @@ +/** + * + */ +package de.fhswf.in.inf.java1.aufgabe11; + +/** + * A class that povides a main. + * + * @author $Author: $ + * @version $Revision: $, $Date: $ UTC + */ +public final class UpnMain +{ + + /** + * Private constructor for utility class. + * + */ + private UpnMain() + { + // TODO Auto-generated constructor stub + } + + /** + * Main entry point for the exercise 11. + * + * @param args + * Command line arguments. + */ + public static void main(String[] args) + { + + UPN test = new UPN(); + + test.calculate("5 3 - 2 * 10 9 - / 10 6 - 8 6 - 2 * / -"); + + System.out.println(test.getResult()); + + } + +} |
