summaryrefslogtreecommitdiff
path: root/BJC-Utils2/src/main/java/bjc
diff options
context:
space:
mode:
authorbjculkin <bjculkin@mix.wvu.edu>2017-03-16 14:35:14 -0400
committerbjculkin <bjculkin@mix.wvu.edu>2017-03-16 14:35:14 -0400
commitf5ad671ebc6ae3e0c3a3d93976eca3f483185d14 (patch)
treec4cdf1016f3c9ffefbcb958df4a1873eb9729f86 /BJC-Utils2/src/main/java/bjc
parent026fdcb3fa9f42ad1db0eb5b9d532865f6ddc80b (diff)
Stack updates.
Diffstat (limited to 'BJC-Utils2/src/main/java/bjc')
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/esodata/QueueStack.java17
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/esodata/SimpleStack.java14
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/esodata/SpaghettiStack.java14
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/esodata/Stack.java42
4 files changed, 83 insertions, 4 deletions
diff --git a/BJC-Utils2/src/main/java/bjc/utils/esodata/QueueStack.java b/BJC-Utils2/src/main/java/bjc/utils/esodata/QueueStack.java
index c1a21b6..a2c2f32 100644
--- a/BJC-Utils2/src/main/java/bjc/utils/esodata/QueueStack.java
+++ b/BJC-Utils2/src/main/java/bjc/utils/esodata/QueueStack.java
@@ -6,7 +6,7 @@ import java.util.LinkedList;
/**
* A FIFO implementation of a stack.
*
- * @param T
+ * @param <T>
* The datatype stored in the stack.
* @author Ben Culkin
*/
@@ -28,11 +28,15 @@ public class QueueStack<T> extends Stack<T> {
@Override
public T pop() {
+ if(backing.isEmpty()) throw new StackUnderflowException();
+
return backing.remove();
}
@Override
public T top() {
+ if(backing.isEmpty()) throw new StackUnderflowException();
+
return backing.peek();
}
@@ -45,4 +49,15 @@ public class QueueStack<T> extends Stack<T> {
public boolean empty() {
return backing.size() == 0;
}
+
+ @Override
+ public String toString() {
+ return backing.toString();
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public T[] toArray() {
+ return (T[]) backing.toArray();
+ }
}
diff --git a/BJC-Utils2/src/main/java/bjc/utils/esodata/SimpleStack.java b/BJC-Utils2/src/main/java/bjc/utils/esodata/SimpleStack.java
index 1344754..ec01280 100644
--- a/BJC-Utils2/src/main/java/bjc/utils/esodata/SimpleStack.java
+++ b/BJC-Utils2/src/main/java/bjc/utils/esodata/SimpleStack.java
@@ -28,11 +28,15 @@ public class SimpleStack<T> extends Stack<T> {
@Override
public T pop() {
+ if(backing.isEmpty()) throw new StackUnderflowException();
+
return backing.pop();
}
@Override
public T top() {
+ if(backing.isEmpty()) throw new StackUnderflowException();
+
return backing.peek();
}
@@ -45,4 +49,14 @@ public class SimpleStack<T> extends Stack<T> {
public boolean empty() {
return backing.size() == 0;
}
+
+ @Override
+ public String toString() {
+ return backing.toString();
+ }
+
+ @SuppressWarnings("unchecked")
+ public T[] toArray() {
+ return (T[]) backing.toArray();
+ }
}
diff --git a/BJC-Utils2/src/main/java/bjc/utils/esodata/SpaghettiStack.java b/BJC-Utils2/src/main/java/bjc/utils/esodata/SpaghettiStack.java
index c5e338b..fdf9cc8 100644
--- a/BJC-Utils2/src/main/java/bjc/utils/esodata/SpaghettiStack.java
+++ b/BJC-Utils2/src/main/java/bjc/utils/esodata/SpaghettiStack.java
@@ -1,5 +1,8 @@
package bjc.utils.esodata;
+import java.util.Arrays;
+import java.util.stream.Stream;
+
/*
* Implements a spaghetti stack, which is a stack that is branched off of a
* parent stack.
@@ -52,4 +55,15 @@ class SpaghettiStack<T> extends Stack<T> {
public boolean empty() {
return backing.empty() && parent.empty();
}
+
+ @Override
+ public String toString() {
+ return "[base=" + parent.toString() + ", own=" + backing.toString() + "]";
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public T[] toArray() {
+ return (T[]) Stream.concat(Arrays.stream(parent.toArray()), Arrays.stream(backing.toArray())).toArray();
+ }
}
diff --git a/BJC-Utils2/src/main/java/bjc/utils/esodata/Stack.java b/BJC-Utils2/src/main/java/bjc/utils/esodata/Stack.java
index 5f7be6c..c112732 100644
--- a/BJC-Utils2/src/main/java/bjc/utils/esodata/Stack.java
+++ b/BJC-Utils2/src/main/java/bjc/utils/esodata/Stack.java
@@ -9,12 +9,32 @@ import java.util.function.Consumer;
*
* A FILO stack with support for forth/factor style combinators.
*
- * @param T
+ * <p>
+ * <h2>Stack underflow</h2>
+ * <p>
+ * NOTE: In general, using any operation that attempts to remove more data from
+ * the stack than exists will cause a {@link StackUnderflowException} to be
+ * thrown. Check the size of the stack if you want to avoid this.
+ * <p>
+ * </p>
+ *
+ * @param <T>
* The datatype stored in the stack.
+ *
* @author Ben Culkin
*/
public abstract class Stack<T> {
/**
+ * The exception thrown when attempting to access an element from the
+ * stack that isn't there.
+ *
+ * @author EVE
+ *
+ */
+ public static class StackUnderflowException extends RuntimeException {
+ }
+
+ /**
* Push an element onto the stack.
*
* @param elm
@@ -29,6 +49,12 @@ public abstract class Stack<T> {
*/
public abstract T pop();
+ /**
+ * Retrieve the top element of this stack without removing it from the
+ * stack.
+ *
+ * @return The top element of this stack.
+ */
public abstract T top();
/**
@@ -53,7 +79,7 @@ public abstract class Stack<T> {
public Stack<T> spaghettify() {
return new SpaghettiStack<>(this);
}
-
+
/*
* Basic combinators
*/
@@ -377,7 +403,7 @@ public abstract class Stack<T> {
/**
* Apply the actions in cons to corresponding elements from the stack.
*
- * @parma conses The actions to execute.
+ * @param conses The actions to execute.
*/
public void spread(List<Consumer<Stack<T>>> conses) {
multispread(1, conses);
@@ -414,4 +440,14 @@ public abstract class Stack<T> {
public void apply(int n, Consumer<Stack<T>> cons) {
multiapply(1, n, cons);
}
+
+ /*
+ * Misc. functions
+ */
+ /**
+ * Get an array representing this stack.
+ *
+ * @return The stack as an array.
+ */
+ public abstract T[] toArray();
}