diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..57e052a --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/module4/Pricenton1.module4.test.iml b/.idea/modules/module4/Pricenton1.module4.test.iml new file mode 100644 index 0000000..2c66d96 --- /dev/null +++ b/.idea/modules/module4/Pricenton1.module4.test.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/Roadmaps/datastructures.md b/Roadmaps/datastructures.md index e0513b9..de7cc7f 100644 --- a/Roadmaps/datastructures.md +++ b/Roadmaps/datastructures.md @@ -1,10 +1,18 @@ -#Data Structures +# Data Structures - 1. Stacks: - - Linear data structure - - Can have various implementations - - Should support (LIFO) - - Primitive implementation (Using arrays of primitive data types) - - Other implementations (Using linked lists) - 2. Queues: - \ No newline at end of file +1. Stacks: + - [API](../module4/src/main/java/com/hithomelabs/princeton1/module4/Stack.java) + - [Sample client](../clients/src/main/java/com/hithomelabs/clients/ArrayStackClient.java) + - Linear data structure + - Can have various implementations + - Should support (LIFO) + - [Primitive implementation](../module4/src/main/java/com/hithomelabs/princeton1/module4/ArrayStack.java) (Using arrays of primitive data types) + - [Other implementations](../module4/src/main/java/com/hithomelabs/princeton1/module4/LinkedStack.java) (Using linked lists) +2. Queues: + - [API](../module4/src/main/java/com/hithomelabs/princeton1/module4/Queue.java) + - [sample Client](../clients/src/main/java/com/hithomelabs/clients/LinkedQueueClient.java) + - Linear data structure. + - Can have various implementations. + - Should support FIFO. + - [Primitive implementation](../module4/src/main/java/com/hithomelabs/princeton1/module4/ArrayQueue.java) (Using array of primitive data types) + - Other implementation ([using linked lists](../module4/src/main/java/com/hithomelabs/princeton1/module4/LinkedQueue.java)) \ No newline at end of file diff --git a/module4/src/main/java/com/hithomelabs/princeton1/module4/ArrayQueue.java b/module4/src/main/java/com/hithomelabs/princeton1/module4/ArrayQueue.java index 4e8988e..8576647 100644 --- a/module4/src/main/java/com/hithomelabs/princeton1/module4/ArrayQueue.java +++ b/module4/src/main/java/com/hithomelabs/princeton1/module4/ArrayQueue.java @@ -1,8 +1,9 @@ package com.hithomelabs.princeton1.module4; -import javax.annotation.Nonnull; import java.util.Iterator; +import javax.annotation.Nonnull; + public class ArrayQueue extends Queue{ // insertion from tail, removal from head diff --git a/module4/src/main/java/com/hithomelabs/princeton1/module4/ArrayStack.java b/module4/src/main/java/com/hithomelabs/princeton1/module4/ArrayStack.java index 0ae2eb6..93b3f30 100644 --- a/module4/src/main/java/com/hithomelabs/princeton1/module4/ArrayStack.java +++ b/module4/src/main/java/com/hithomelabs/princeton1/module4/ArrayStack.java @@ -1,13 +1,13 @@ package com.hithomelabs.princeton1.module4; -import javax.annotation.Nonnull; import java.util.Iterator; +import javax.annotation.Nonnull; // Concrete implementation of stack using arrays // Creating a generic stack of type E public class ArrayStack extends Stack { // Capacity and size are two variables, capacity determines total capacity of array, capacity defaults at 10 - // Everytime size == capacity, capacity = 2 * capacity + // every time size == capacity, capacity = 2 * capacity private static final int DEFAULT_CAPACITY = 10; private int capacity; private int size; @@ -18,7 +18,7 @@ public class ArrayStack extends Stack { arr = (E[]) new Object[this.capacity]; } - // Constructor chaining, default constructor will call parametrised constructor with default initial capacity 10 + // Constructor chaining, default constructor will call parametrized constructor with default initial capacity 10 public ArrayStack(){ this(DEFAULT_CAPACITY); } @@ -64,7 +64,7 @@ public class ArrayStack extends Stack { } private void checkResize() { - if (size < capacity / 4 && capacity >= 40){ + if (size < capacity / 4 && capacity >= 20){ capacity = capacity / 2; changeCapacity(capacity); } diff --git a/module4/src/main/java/com/hithomelabs/princeton1/module4/LinkedQueue.java b/module4/src/main/java/com/hithomelabs/princeton1/module4/LinkedQueue.java index ec37bbe..b7e62ff 100644 --- a/module4/src/main/java/com/hithomelabs/princeton1/module4/LinkedQueue.java +++ b/module4/src/main/java/com/hithomelabs/princeton1/module4/LinkedQueue.java @@ -60,7 +60,7 @@ public class LinkedQueue extends Queue{ Node current = head; @Override public boolean hasNext() { - return current != tail; + return current != null; } @Override diff --git a/module4/src/test/java/com/hithomelabs/princeton1/module4/ArrayQueueTest.java b/module4/src/test/java/com/hithomelabs/princeton1/module4/ArrayQueueTest.java new file mode 100644 index 0000000..67ccd0e --- /dev/null +++ b/module4/src/test/java/com/hithomelabs/princeton1/module4/ArrayQueueTest.java @@ -0,0 +1,76 @@ +package com.hithomelabs.princeton1.module4; + +import java.util.Iterator; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + + +import static org.junit.jupiter.api.Assertions.*; + +class ArrayQueueTest { + + private Queue queue; + + @BeforeEach + void setUp() { + queue = new ArrayQueue(); + } + + @AfterEach + void tearDown() { + queue = null; + } + + @Test + @DisplayName("Empty queue must return size zero") + public void testEmptyQueueSize(){ + assertEquals(0, queue.size()); + } + + @Test + @DisplayName("Enqueuing must work as expected") + public void testEnqueue(){ + queue.enqueue(1); + queue.enqueue(2); + assertEquals(2,queue.size()); + Iterator iterator = queue.iterator(); + assertEquals(1, iterator.next()); + assertEquals(2, iterator.next()); + } + + @Test + @DisplayName("Dequeueing must work as expected") + public void testDequeue(){ + queue.enqueue(1); + queue.enqueue(2); + assertEquals(1, queue.dequeue()); + queue.enqueue(3); + assertEquals(2, queue.size()); + assertEquals(2, queue.dequeue()); + assertEquals(3, queue.dequeue()); + assertEquals(0, queue.size()); + assertNull(queue.dequeue()); + } + + @Test + @DisplayName("Testing resizable array and iterator") + public void testResize(){ + for(int i = 0; i < 21; i++) + queue.enqueue(i); + for(int i = 0; i < 13; i++){ + queue.dequeue(); + } + assertEquals(13, queue.dequeue()); + assertEquals(7,queue.size()); + Integer[] arr = new Integer[queue.size()]; + Iterator iterator = queue.iterator(); + int count = 0; + while(iterator.hasNext()){ + arr[count++] = iterator.next(); + } + assertArrayEquals(new Integer[]{14, 15, 16, 17, 18, 19, 20}, arr); + } + +} \ No newline at end of file diff --git a/module4/src/test/java/com/hithomelabs/princeton1/module4/ArrayStackTest.java b/module4/src/test/java/com/hithomelabs/princeton1/module4/ArrayStackTest.java new file mode 100644 index 0000000..c9ab765 --- /dev/null +++ b/module4/src/test/java/com/hithomelabs/princeton1/module4/ArrayStackTest.java @@ -0,0 +1,85 @@ +package com.hithomelabs.princeton1.module4; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Iterator; + +import static org.junit.jupiter.api.Assertions.*; + +class ArrayStackTest { + + private Stack stack; + + @BeforeEach + void setUp() { + stack = new ArrayStack(); + } + + @AfterEach + void tearDown() { + stack = null; + } + + @Test + @DisplayName("Empty stack must return size zero") + public void testEmptyStackSize(){ + assertEquals(0, stack.size()); + } + + @Test + @DisplayName("Push must work as expected") + public void testEnqueue(){ + stack.push("Hello"); + stack.push("World"); + assertEquals(2,stack.size()); + Iterator iterator = stack.iterator(); + assertEquals("Hello", iterator.next()); + assertEquals("World", iterator.next()); + } + + @Test + @DisplayName("Pop must work as expected") + public void testDequeue(){ + stack.push("hello"); + stack.push("world"); + assertEquals("world", stack.pop()); + stack.push("I"); + assertEquals(2, stack.size()); + assertEquals("I", stack.pop()); + assertEquals("hello", stack.pop()); + assertEquals(0, stack.size()); + assertNull(stack.pop()); + } + + @Test + @DisplayName("Testing resizable array and iterator") + public void testResize(){ + stack.push("Hello"); + stack.push("world"); + stack.push("I"); + stack.push("am"); + stack.push("testing"); + stack.push("my"); + stack.push("implementation"); + stack.push("of"); + stack.push("Stacks"); + stack.push("Data"); + stack.push("Structure"); + assertEquals("Structure", stack.pop()); + int counter = 6; + while(counter-- > 0) + stack.pop(); + assertEquals(4,stack.size()); + String[] arr = new String[stack.size()]; + Iterator iterator = stack.iterator(); + int count = 0; + while(iterator.hasNext()){ + arr[count++] = iterator.next(); + } + assertArrayEquals(new String[]{"Hello", "world", "I", "am"}, arr); + } + +} \ No newline at end of file diff --git a/module4/src/test/java/com/hithomelabs/princeton1/module4/LinkedQueueTest.java b/module4/src/test/java/com/hithomelabs/princeton1/module4/LinkedQueueTest.java new file mode 100644 index 0000000..915cf4a --- /dev/null +++ b/module4/src/test/java/com/hithomelabs/princeton1/module4/LinkedQueueTest.java @@ -0,0 +1,76 @@ +package com.hithomelabs.princeton1.module4; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.Iterator; + +import static org.junit.jupiter.api.Assertions.*; + +class LinkedQueueTest { + + private Queue queue; + + @BeforeEach + void setUp() { + queue = new LinkedQueue<>(); + } + + @AfterEach + void tearDown() { + queue = null; + } + + + @Test + @DisplayName("Empty queue must return size zero") + public void testEmptyQueueSize(){ + assertEquals(0, queue.size()); + } + + @Test + @DisplayName("Enqueuing must work as expected") + public void testEnqueue(){ + queue.enqueue(1); + queue.enqueue(2); + assertEquals(2,queue.size()); + Iterator iterator = queue.iterator(); + assertEquals(1, iterator.next()); + assertEquals(2, iterator.next()); + } + + @Test + @DisplayName("Dequeueing must work as expected") + public void testDequeue(){ + queue.enqueue(1); + queue.enqueue(2); + assertEquals(1, queue.dequeue()); + queue.enqueue(3); + assertEquals(2, queue.size()); + assertEquals(2, queue.dequeue()); + assertEquals(3, queue.dequeue()); + assertEquals(0, queue.size()); + assertNull(queue.dequeue()); + } + + @Test + @DisplayName("Testing resizable array and iterator") + public void testResize(){ + for(int i = 0; i < 21; i++) + queue.enqueue(i); + for(int i = 0; i < 13; i++){ + queue.dequeue(); + } + assertEquals(13, queue.dequeue()); + assertEquals(7,queue.size()); + Integer[] arr = new Integer[queue.size()]; + Iterator iterator = queue.iterator(); + int count = 0; + while(iterator.hasNext()){ + arr[count++] = iterator.next(); + } + assertArrayEquals(new Integer[]{14, 15, 16, 17, 18, 19, 20}, arr); + } +} \ No newline at end of file