summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/de/fhswf/in/inf/java1/aufgabe11/UPN.java110
-rw-r--r--src/de/fhswf/in/inf/java1/aufgabe11/UpnMain.java41
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());
+
+ }
+
+}