From a1c1b2a0f4a291fa4afec25eba588f88d116c755 Mon Sep 17 00:00:00 2001 From: hitanshu310 Date: Sun, 26 Jan 2025 21:24:16 +0530 Subject: [PATCH 1/5] Adding ArrayStack Implementation --- .../hithomelabs/clients/ArrayStackClient.java | 19 ++++ .../{Main.java => LinkedArrayClient.java} | 2 +- .../princeton1/module4/ArrayStack.java | 96 +++++++++++++++++++ 3 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 clients/src/main/java/com/hithomelabs/clients/ArrayStackClient.java rename clients/src/main/java/com/hithomelabs/clients/{Main.java => LinkedArrayClient.java} (95%) create mode 100644 module4/src/main/java/com/hithomelabs/princeton1/module4/ArrayStack.java diff --git a/clients/src/main/java/com/hithomelabs/clients/ArrayStackClient.java b/clients/src/main/java/com/hithomelabs/clients/ArrayStackClient.java new file mode 100644 index 0000000..53a40c1 --- /dev/null +++ b/clients/src/main/java/com/hithomelabs/clients/ArrayStackClient.java @@ -0,0 +1,19 @@ +package com.hithomelabs.clients; + +import com.hithomelabs.princeton1.module4.ArrayStack; +import com.hithomelabs.princeton1.module4.Stack; + +public class ArrayStackClient { + public static void main(String[] args) { + Stack stack = new ArrayStack(); + for(int i = 0; i < 21; i++){ + stack.push(i); + } + // Using object s, as stack is generic but every java Object has implementation of toString() + for (Object s : stack) + System.out.println(s); + while(!stack.isEmpty()){ + System.out.println(stack.pop()); + } + } +} diff --git a/clients/src/main/java/com/hithomelabs/clients/Main.java b/clients/src/main/java/com/hithomelabs/clients/LinkedArrayClient.java similarity index 95% rename from clients/src/main/java/com/hithomelabs/clients/Main.java rename to clients/src/main/java/com/hithomelabs/clients/LinkedArrayClient.java index d8c5d68..ce51e32 100644 --- a/clients/src/main/java/com/hithomelabs/clients/Main.java +++ b/clients/src/main/java/com/hithomelabs/clients/LinkedArrayClient.java @@ -4,7 +4,7 @@ package com.hithomelabs.clients; import com.hithomelabs.princeton1.module4.LinkedStack; import com.hithomelabs.princeton1.module4.Stack; -public class Main { +public class LinkedArrayClient { public static void main(String[] args) { Stack stack = new LinkedStack(); stack.push("hello"); diff --git a/module4/src/main/java/com/hithomelabs/princeton1/module4/ArrayStack.java b/module4/src/main/java/com/hithomelabs/princeton1/module4/ArrayStack.java new file mode 100644 index 0000000..42e0623 --- /dev/null +++ b/module4/src/main/java/com/hithomelabs/princeton1/module4/ArrayStack.java @@ -0,0 +1,96 @@ +package com.hithomelabs.princeton1.module4; +import java.util.Iterator; + +// 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 + private static final int DEFAULT_CAPACITY = 10; + private int capacity; + private int size; + private E[] arr; + + public ArrayStack(int capacity){ + this.capacity = capacity; + this.arr = (E[]) new Object[this.capacity]; + } + + // Constructor chaining, default constructor will call parametrised constructor with default initial capacity 10 + public ArrayStack(){ + this(DEFAULT_CAPACITY); + } + + @Override + public boolean isEmpty() { + return this.size == 0; + } + + private void changeCapacity(int newCapacity){ + E[] resizedArr = (E[]) new Object[newCapacity]; + for (int i = 0; i < this.size; i++) + resizedArr[i] = this.arr[i]; + this.arr = resizedArr; + } + + private void incrementSize(){ + if (this.size == this.capacity){ + this.capacity = 2 * this.capacity; + changeCapacity(this.capacity); + } + } + + // Push always happens at the end of the stack + // Say the size of the stack is 1, new element gets inserted at 1 + @Override + public void push(E element) { + // Lazy approach, we assume size to always be lesser than capacity + this.incrementSize(); + this.arr[this.size++] = element; + } + + @Override + public E pop() { + if (isEmpty()) + return null; + else{ + E e = this.arr[--this.size]; + this.arr[this.size] = null; + this.checkResize(); + return e; + } + } + + private void checkResize() { + if (this.size < this.capacity / 4 && this.capacity > 10){ + this.capacity = this.capacity / 2; + changeCapacity(this.capacity); + } + } + + @Override + public int size() { + return this.size; + } + + @Override + public Iterator iterator() { + return new Iterator() { + + int current = 0; + + @Override + public boolean hasNext() { + return current != size; + } + + @Override + public E next() { + E element = arr[current]; + current = current + 1; + return element; + } + }; + } +} -- 2.45.2 From 09ec2b8bb0ca915fa821894dae455db36d790a89 Mon Sep 17 00:00:00 2001 From: hitanshu310 Date: Mon, 27 Jan 2025 00:05:30 +0530 Subject: [PATCH 2/5] Checking in Queue implementation of Array --- .idea/vcs.xml | 6 + .../hithomelabs/clients/ArrayQueueClient.java | 22 ++++ .../princeton1/module4/ArrayQueue.java | 103 ++++++++++++++++++ .../princeton1/module4/ArrayStack.java | 36 +++--- .../hithomelabs/princeton1/module4/Queue.java | 10 ++ 5 files changed, 160 insertions(+), 17 deletions(-) create mode 100644 .idea/vcs.xml create mode 100644 clients/src/main/java/com/hithomelabs/clients/ArrayQueueClient.java create mode 100644 module4/src/main/java/com/hithomelabs/princeton1/module4/ArrayQueue.java create mode 100644 module4/src/main/java/com/hithomelabs/princeton1/module4/Queue.java diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/clients/src/main/java/com/hithomelabs/clients/ArrayQueueClient.java b/clients/src/main/java/com/hithomelabs/clients/ArrayQueueClient.java new file mode 100644 index 0000000..dca3c9f --- /dev/null +++ b/clients/src/main/java/com/hithomelabs/clients/ArrayQueueClient.java @@ -0,0 +1,22 @@ +package com.hithomelabs.clients; + +import com.hithomelabs.princeton1.module4.ArrayQueue; +import com.hithomelabs.princeton1.module4.ArrayStack; +import com.hithomelabs.princeton1.module4.Queue; +import com.hithomelabs.princeton1.module4.Stack; + +public class ArrayQueueClient { + public static void main(String[] args) { + Queue queue = new ArrayQueue(); + for(int i = 0; i < 21; i++){ + queue.enqueue(i); + } + for(int i = 0; i < 13; i++){ + System.out.println(queue.dequeue()); + } + + // Using object s, as stack is generic but every java Object has implementation of toString() + for (Object s : queue) + System.out.println(s); + } + } diff --git a/module4/src/main/java/com/hithomelabs/princeton1/module4/ArrayQueue.java b/module4/src/main/java/com/hithomelabs/princeton1/module4/ArrayQueue.java new file mode 100644 index 0000000..4e8988e --- /dev/null +++ b/module4/src/main/java/com/hithomelabs/princeton1/module4/ArrayQueue.java @@ -0,0 +1,103 @@ +package com.hithomelabs.princeton1.module4; + +import javax.annotation.Nonnull; +import java.util.Iterator; + +public class ArrayQueue extends Queue{ + + // insertion from tail, removal from head + public static final int DEFAULT_CAPACITY = 10; + private int capacity; + private int tail; + private int head; + private int size; + private E[] arr; + + public ArrayQueue(){ + this(DEFAULT_CAPACITY); + } + + public ArrayQueue(int capacity){ + this.capacity = capacity; + arr = (E[]) new Object[this.capacity]; + size = 0; + } + + @Override + public boolean isEmpty() { + return size == 0; + } + + @Override + public E dequeue() { + if(isEmpty()) + return null; + else{ + E element = arr[head]; + // Garbage collection + arr[head] = null; + head = (head+1)%capacity; + size = size - 1; + if(capacity >= 40 && size < capacity/4){ + capacity = capacity/2; + resize(capacity, capacity*2); + } + return element; + } + } + + @Override + public void enqueue(E element) { + // We plan capacity expansion if needed + if (size == capacity){ + capacity = capacity * 2; + resize(capacity, capacity/2); + } + arr[tail] = element; + tail = (tail + 1) % capacity; + ++size; + } + + // When resize takes place always the original array is full, so copy the complete array as is + private void resize(int capacity, int oldCapacity) { + E[] resizedArr = (E[]) new Object[capacity]; + for(int i = 0; i < size; i++) { + resizedArr[i] = arr[head]; + // halving because capacity has now doubled + arr[head] = null; + head = (head + 1) % oldCapacity; + } + arr = resizedArr; + // When resizing takes place, we bring the head to 0 and the tail to size + // tail is where new inserts will be made and head will be where elements will be removed + tail = size; + head = 0; + + } + + @Override + public int size() { + return size; + } + + @Override + @Nonnull + public Iterator iterator() { + return new Iterator() { + int counter = size; + int pointer = head; + @Override + public boolean hasNext() { + return counter != 0; + } + + @Override + public E next() { + E element = arr[pointer]; + pointer = (pointer + 1)% capacity; + --counter; + return element; + } + }; + } +} 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 42e0623..0ae2eb6 100644 --- a/module4/src/main/java/com/hithomelabs/princeton1/module4/ArrayStack.java +++ b/module4/src/main/java/com/hithomelabs/princeton1/module4/ArrayStack.java @@ -1,4 +1,5 @@ package com.hithomelabs.princeton1.module4; +import javax.annotation.Nonnull; import java.util.Iterator; // Concrete implementation of stack using arrays @@ -14,7 +15,7 @@ public class ArrayStack extends Stack { public ArrayStack(int capacity){ this.capacity = capacity; - this.arr = (E[]) new Object[this.capacity]; + arr = (E[]) new Object[this.capacity]; } // Constructor chaining, default constructor will call parametrised constructor with default initial capacity 10 @@ -24,20 +25,20 @@ public class ArrayStack extends Stack { @Override public boolean isEmpty() { - return this.size == 0; + return size == 0; } private void changeCapacity(int newCapacity){ E[] resizedArr = (E[]) new Object[newCapacity]; - for (int i = 0; i < this.size; i++) - resizedArr[i] = this.arr[i]; - this.arr = resizedArr; + for (int i = 0; i < size; i++) + resizedArr[i] = arr[i]; + arr = resizedArr; } private void incrementSize(){ - if (this.size == this.capacity){ - this.capacity = 2 * this.capacity; - changeCapacity(this.capacity); + if (size == capacity){ + capacity = 2 * capacity; + changeCapacity(capacity); } } @@ -46,8 +47,8 @@ public class ArrayStack extends Stack { @Override public void push(E element) { // Lazy approach, we assume size to always be lesser than capacity - this.incrementSize(); - this.arr[this.size++] = element; + incrementSize(); + arr[size++] = element; } @Override @@ -55,26 +56,27 @@ public class ArrayStack extends Stack { if (isEmpty()) return null; else{ - E e = this.arr[--this.size]; - this.arr[this.size] = null; - this.checkResize(); + E e = arr[--size]; + arr[size] = null; + checkResize(); return e; } } private void checkResize() { - if (this.size < this.capacity / 4 && this.capacity > 10){ - this.capacity = this.capacity / 2; - changeCapacity(this.capacity); + if (size < capacity / 4 && capacity >= 40){ + capacity = capacity / 2; + changeCapacity(capacity); } } @Override public int size() { - return this.size; + return size; } @Override + @Nonnull public Iterator iterator() { return new Iterator() { diff --git a/module4/src/main/java/com/hithomelabs/princeton1/module4/Queue.java b/module4/src/main/java/com/hithomelabs/princeton1/module4/Queue.java new file mode 100644 index 0000000..6c4999d --- /dev/null +++ b/module4/src/main/java/com/hithomelabs/princeton1/module4/Queue.java @@ -0,0 +1,10 @@ +package com.hithomelabs.princeton1.module4; + +public abstract class Queue implements Iterable { + + public abstract boolean isEmpty(); + public abstract E dequeue(); + public abstract void enqueue(E element); + public abstract int size(); +} + -- 2.45.2 From 6774300a8a81d2366775b1fa73cbb17edad1c5db Mon Sep 17 00:00:00 2001 From: hitanshu310 Date: Mon, 27 Jan 2025 01:29:14 +0530 Subject: [PATCH 3/5] Adding Queue linked list client --- .../hithomelabs/clients/ArrayQueueClient.java | 2 - .../clients/LinkedQueueClient.java | 20 +++++ ...rrayClient.java => LinkedStackClient.java} | 2 +- .../princeton1/module4/LinkedQueue.java | 74 +++++++++++++++++++ 4 files changed, 95 insertions(+), 3 deletions(-) create mode 100644 clients/src/main/java/com/hithomelabs/clients/LinkedQueueClient.java rename clients/src/main/java/com/hithomelabs/clients/{LinkedArrayClient.java => LinkedStackClient.java} (95%) create mode 100644 module4/src/main/java/com/hithomelabs/princeton1/module4/LinkedQueue.java diff --git a/clients/src/main/java/com/hithomelabs/clients/ArrayQueueClient.java b/clients/src/main/java/com/hithomelabs/clients/ArrayQueueClient.java index dca3c9f..7022367 100644 --- a/clients/src/main/java/com/hithomelabs/clients/ArrayQueueClient.java +++ b/clients/src/main/java/com/hithomelabs/clients/ArrayQueueClient.java @@ -1,9 +1,7 @@ package com.hithomelabs.clients; import com.hithomelabs.princeton1.module4.ArrayQueue; -import com.hithomelabs.princeton1.module4.ArrayStack; import com.hithomelabs.princeton1.module4.Queue; -import com.hithomelabs.princeton1.module4.Stack; public class ArrayQueueClient { public static void main(String[] args) { diff --git a/clients/src/main/java/com/hithomelabs/clients/LinkedQueueClient.java b/clients/src/main/java/com/hithomelabs/clients/LinkedQueueClient.java new file mode 100644 index 0000000..008742c --- /dev/null +++ b/clients/src/main/java/com/hithomelabs/clients/LinkedQueueClient.java @@ -0,0 +1,20 @@ +package com.hithomelabs.clients; + +import com.hithomelabs.princeton1.module4.LinkedQueue; +import com.hithomelabs.princeton1.module4.Queue; + +public class LinkedQueueClient { + public static void main(String[] args) { + Queue queue = new LinkedQueue(); + for(int i = 0; i < 21; i++){ + queue.enqueue(i); + } + for(int i = 0; i < 13; i++){ + System.out.println(queue.dequeue()); + } + + // Using object s, as stack is generic but every java Object has implementation of toString() + for (Object s : queue) + System.out.println(s); + } + } diff --git a/clients/src/main/java/com/hithomelabs/clients/LinkedArrayClient.java b/clients/src/main/java/com/hithomelabs/clients/LinkedStackClient.java similarity index 95% rename from clients/src/main/java/com/hithomelabs/clients/LinkedArrayClient.java rename to clients/src/main/java/com/hithomelabs/clients/LinkedStackClient.java index ce51e32..33cc4e9 100644 --- a/clients/src/main/java/com/hithomelabs/clients/LinkedArrayClient.java +++ b/clients/src/main/java/com/hithomelabs/clients/LinkedStackClient.java @@ -4,7 +4,7 @@ package com.hithomelabs.clients; import com.hithomelabs.princeton1.module4.LinkedStack; import com.hithomelabs.princeton1.module4.Stack; -public class LinkedArrayClient { +public class LinkedStackClient { public static void main(String[] args) { Stack stack = new LinkedStack(); stack.push("hello"); diff --git a/module4/src/main/java/com/hithomelabs/princeton1/module4/LinkedQueue.java b/module4/src/main/java/com/hithomelabs/princeton1/module4/LinkedQueue.java new file mode 100644 index 0000000..ec37bbe --- /dev/null +++ b/module4/src/main/java/com/hithomelabs/princeton1/module4/LinkedQueue.java @@ -0,0 +1,74 @@ +package com.hithomelabs.princeton1.module4; + +import javax.annotation.Nonnull; +import java.util.Iterator; + +public class LinkedQueue extends Queue{ + + Node head; + Node tail; + int size; + + private class Node{ + E value; + Node next; + + Node(E value){ + this.value = value; + } + } + + @Override + public boolean isEmpty() { + return size==0; + } + + @Override + public E dequeue() { + if(isEmpty()) + return null; + E element = head.value; + // Only a single element is present + if (head == tail){ + tail = null; + } + head = head.next; + --size; + return element; + } + + @Override + public void enqueue(E element) { + Node newNode = new Node(element); + if(isEmpty()) + head = newNode; + else + tail.next = newNode; + tail = newNode; + ++size; + } + + @Override + public int size() { + return size; + } + + @Override + @Nonnull + public Iterator iterator() { + return new Iterator() { + Node current = head; + @Override + public boolean hasNext() { + return current != tail; + } + + @Override + public E next() { + E element = current.value; + current = current.next; + return element; + } + }; + } +} -- 2.45.2 From 6747e07be4083685df6eca17d1e4af0693e13e6a Mon Sep 17 00:00:00 2001 From: hitanshu310 Date: Mon, 27 Jan 2025 01:55:12 +0530 Subject: [PATCH 4/5] Initializing gradle build workflows --- .gitea/workflows/gradle_build.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .gitea/workflows/gradle_build.yml diff --git a/.gitea/workflows/gradle_build.yml b/.gitea/workflows/gradle_build.yml new file mode 100644 index 0000000..e8d515a --- /dev/null +++ b/.gitea/workflows/gradle_build.yml @@ -0,0 +1,24 @@ +name: sample gradle build and test +run-name: Build started by $ {{gitea.actor }} +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Check out repository code + uses: actions/checkout@v4 + - name: JDK setup + uses: actions/setup-java@v4 + with: + distribution: 'zulu' + java-version: '21' + - name: Validate Gradle Wrapper + uses: gradle/actions/wrapper-validation@v3 + - name: Gradle build + run: ./greadlew build -i + -- 2.45.2 From 74991617250ffe42fba2ee5ffc21434eafe0d53e Mon Sep 17 00:00:00 2001 From: hitanshu310 Date: Mon, 27 Jan 2025 02:10:44 +0530 Subject: [PATCH 5/5] Fixing typo to avoid gradle build failure --- .gitea/workflows/gradle_build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitea/workflows/gradle_build.yml b/.gitea/workflows/gradle_build.yml index e8d515a..f135547 100644 --- a/.gitea/workflows/gradle_build.yml +++ b/.gitea/workflows/gradle_build.yml @@ -20,5 +20,5 @@ jobs: - name: Validate Gradle Wrapper uses: gradle/actions/wrapper-validation@v3 - name: Gradle build - run: ./greadlew build -i + run: ./gradlew build -i -- 2.45.2