From f5ad671ebc6ae3e0c3a3d93976eca3f483185d14 Mon Sep 17 00:00:00 2001 From: bjculkin Date: Thu, 16 Mar 2017 14:35:14 -0400 Subject: Stack updates. --- .../main/java/bjc/utils/esodata/QueueStack.java | 17 ++++++++- .../main/java/bjc/utils/esodata/SimpleStack.java | 14 ++++++++ .../java/bjc/utils/esodata/SpaghettiStack.java | 14 ++++++++ .../src/main/java/bjc/utils/esodata/Stack.java | 42 ++++++++++++++++++++-- 4 files changed, 83 insertions(+), 4 deletions(-) (limited to 'BJC-Utils2/src/main/java/bjc/utils') 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 * The datatype stored in the stack. * @author Ben Culkin */ @@ -28,11 +28,15 @@ public class QueueStack extends Stack { @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 extends Stack { 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 extends Stack { @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 extends Stack { 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 extends Stack { 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,11 +9,31 @@ import java.util.function.Consumer; * * A FILO stack with support for forth/factor style combinators. * - * @param T + *

+ *

Stack underflow

+ *

+ * 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. + *

+ *

+ * + * @param * The datatype stored in the stack. + * * @author Ben Culkin */ public abstract class Stack { + /** + * 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. * @@ -29,6 +49,12 @@ public abstract class Stack { */ 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 { public Stack spaghettify() { return new SpaghettiStack<>(this); } - + /* * Basic combinators */ @@ -377,7 +403,7 @@ public abstract class Stack { /** * 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>> conses) { multispread(1, conses); @@ -414,4 +440,14 @@ public abstract class Stack { public void apply(int n, Consumer> cons) { multiapply(1, n, cons); } + + /* + * Misc. functions + */ + /** + * Get an array representing this stack. + * + * @return The stack as an array. + */ + public abstract T[] toArray(); } -- cgit v1.2.3