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