diff --git a/src/main/java/com/thealgorithms/datastructures/stacks/StackArrayList.java b/src/main/java/com/thealgorithms/datastructures/stacks/StackArrayList.java index 9506ae38..088156a9 100644 --- a/src/main/java/com/thealgorithms/datastructures/stacks/StackArrayList.java +++ b/src/main/java/com/thealgorithms/datastructures/stacks/StackArrayList.java @@ -6,110 +6,48 @@ import java.util.EmptyStackException; /** * This class implements a Stack using an ArrayList. * - *

- * A stack is exactly what it sounds like. An element gets added to the top of - * the stack and only the element on the top may be removed. - * - *

- * This is an ArrayList Implementation of a stack, where size is not a problem - * we can extend the stack as much as we want. + * @param the type of elements in this stack */ -public class StackArrayList { +public class StackArrayList implements Stack { - /** - * Driver Code - */ - public static void main(String[] args) { - StackArrayList stack = new StackArrayList(); - assert stack.isEmpty(); + private final ArrayList stack; - for (int i = 1; i <= 5; ++i) { - stack.push(i); - assert stack.size() == i; - } - - assert stack.size() == 5; - assert stack.peek() == 5 && stack.pop() == 5 && stack.peek() == 4; - - /* pop elements at the top of this stack one by one */ - while (!stack.isEmpty()) { - stack.pop(); - } - assert stack.isEmpty(); - - try { - stack.pop(); - assert false; - /* this should not happen */ - } catch (EmptyStackException e) { - assert true; - /* this should happen */ - } - } - - /** - * ArrayList representation of the stack - */ - private ArrayList stack; - - /** - * Constructor - */ public StackArrayList() { stack = new ArrayList<>(); } - /** - * Adds value to the end of list which is the top for stack - * - * @param value value to be added - */ - public void push(int value) { + @Override + public void push(T value) { stack.add(value); } - /** - * Removes the element at the top of this stack and returns - * - * @return Element popped - * @throws EmptyStackException if the stack is empty. - */ - public int pop() { + @Override + public T pop() { if (isEmpty()) { throw new EmptyStackException(); } - - /* remove the element on the top of the stack */ - return stack.remove(stack.size() - 1); + return stack.removeLast(); } - /** - * Test if the stack is empty. - * - * @return {@code true} if this stack is empty, {@code false} otherwise. - */ + @Override + public T peek() { + if (isEmpty()) { + throw new EmptyStackException(); + } + return stack.getLast(); + } + + @Override public boolean isEmpty() { return stack.isEmpty(); } - /** - * Return the element at the top of this stack without removing it from the - * stack. - * - * @return the element at the top of this stack. - */ - public int peek() { - if (isEmpty()) { - throw new EmptyStackException(); - } - return stack.get(stack.size() - 1); + @Override + public void makeEmpty() { + stack.clear(); } - /** - * Return size of this stack. - * - * @return size of this stack. - */ + @Override public int size() { return stack.size(); } diff --git a/src/test/java/com/thealgorithms/datastructures/stacks/StackArrayListTest.java b/src/test/java/com/thealgorithms/datastructures/stacks/StackArrayListTest.java new file mode 100644 index 00000000..f4c26190 --- /dev/null +++ b/src/test/java/com/thealgorithms/datastructures/stacks/StackArrayListTest.java @@ -0,0 +1,76 @@ +package com.thealgorithms.datastructures.stacks; + +import java.util.EmptyStackException; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +class StackArrayListTest { + + private StackArrayList stack; + + @BeforeEach + void setUp() { + stack = new StackArrayList<>(); + } + + @Test + void testPushAndPop() { + stack.push(1); + stack.push(2); + stack.push(3); + + Assertions.assertEquals(3, stack.pop()); + Assertions.assertEquals(2, stack.pop()); + Assertions.assertEquals(1, stack.pop()); + } + + @Test + void testPeek() { + stack.push(10); + stack.push(20); + + Assertions.assertEquals(20, stack.peek()); + stack.pop(); // Remove 20 + Assertions.assertEquals(10, stack.peek()); + } + + @Test + void testIsEmpty() { + Assertions.assertTrue(stack.isEmpty()); + stack.push(1); + Assertions.assertFalse(stack.isEmpty()); + stack.pop(); + Assertions.assertTrue(stack.isEmpty()); + } + + @Test + void testMakeEmpty() { + stack.push(1); + stack.push(2); + stack.push(3); + stack.makeEmpty(); + Assertions.assertTrue(stack.isEmpty()); + Assertions.assertEquals(0, stack.size()); + } + + @Test + void testSize() { + Assertions.assertEquals(0, stack.size()); + stack.push(1); + stack.push(2); + Assertions.assertEquals(2, stack.size()); + stack.pop(); + Assertions.assertEquals(1, stack.size()); + } + + @Test + void testPopEmptyStackThrowsException() { + Assertions.assertThrows(EmptyStackException.class, stack::pop); + } + + @Test + void testPeekEmptyStackThrowsException() { + Assertions.assertThrows(EmptyStackException.class, stack::peek); + } +}