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 41ecda7..b40378c 100644 --- a/module4/src/main/java/com/hithomelabs/princeton1/module4/ArrayQueue.java +++ b/module4/src/main/java/com/hithomelabs/princeton1/module4/ArrayQueue.java @@ -5,28 +5,71 @@ import java.util.Iterator; import javax.annotation.Nonnull; public class ArrayQueue extends Queue{ + + private E[] queueArray = (E[]) new Object[1]; + private int startPtr = 0; + private int endPtr = 0; + @Override public boolean isEmpty() { - return false; + return startPtr >= endPtr; } @Override public E dequeue() { - return null; + if(isEmpty()){ + return null; + } + E currentValue = queueArray[startPtr]; + queueArray[startPtr++] = null; + if(size() < queueArray.length/4){ + changeArraySize(queueArray.length/2); + } + return currentValue; } @Override public void enqueue(E element) { - + queueArray[endPtr++] = element; + if(endPtr >= queueArray.length){ + changeArraySize(queueArray.length*2); + } } @Override public int size() { - return 0; + return endPtr - startPtr; } + private void changeArraySize(int targetSize){ + E[] tempArray = queueArray; + int oldArraySize = tempArray.length; + queueArray = (E[]) new Object[targetSize]; + int j = 0; + for(int i=startPtr; i iterator() { - return null; + return new QueueArrayIterator(); + } + + private class QueueArrayIterator implements Iterator{ + + private int iteratorIndex = startPtr; + + @Override + public boolean hasNext() { + return iteratorIndex extends Stack { + + E[] stackArray = (E[]) new Object[1]; + private int index = 0; + private int arrayLength = stackArray.length; + @Override public boolean isEmpty() { - return false; + return index == 0; } @Override public void push(E element) { - + if(index == arrayLength){ + changeArraySize(arrayLength*2); + } + stackArray[index] = element; + index++; } @Override public E pop() { - return null; + if(index == 0){ + return null; + } + index--; + if(index < arrayLength/4){ + changeArraySize(arrayLength/2); + } + E temp = stackArray[index]; + stackArray[index] = null; + return temp; } @Override public int size() { - return 0; + return index; } + @Nonnull @Override public Iterator iterator() { - return null; + return new StackIterator(); + } + + private void changeArraySize(int intendedSize){ + E[] tempArray = stackArray; + int oldArraySize = stackArray.length; + stackArray = (E[]) new Object[intendedSize]; + arrayLength = stackArray.length; + System.arraycopy(tempArray, 0, stackArray, 0, Math.min(oldArraySize, arrayLength)); + } + + private class StackIterator implements Iterator{ + private int iteratorIndex = 0; + + @Override + public boolean hasNext() { + return stackArray[iteratorIndex] != null; + } + + @Override + public E next() { + return stackArray[iteratorIndex++]; + } } } 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 b68b148..e2d01e3 100644 --- a/module4/src/main/java/com/hithomelabs/princeton1/module4/LinkedQueue.java +++ b/module4/src/main/java/com/hithomelabs/princeton1/module4/LinkedQueue.java @@ -4,28 +4,76 @@ import javax.annotation.Nonnull; import java.util.Iterator; public class LinkedQueue extends Queue{ + + Node start = null; + Node end = null; + + static private class Node{ + E data; + Node next; + + private Node(E element){ + data=element; + next=null; + } + } + @Override public boolean isEmpty() { - return false; + return start == null; } @Override public E dequeue() { - return null; + if(isEmpty()) { + return null; + } + E currentValue = start.data; + start = start.next; + return currentValue; } @Override public void enqueue(E element) { - + Node new_node = new Node(element); + if(isEmpty()) + start = new_node; + else + end.next = new_node; + end = new_node; } @Override public int size() { - return 0; + int size = 0; + Node sizePtr = start; + while (sizePtr != null) { + sizePtr = sizePtr.next; + size++; + } + return size; } + @Nonnull @Override public Iterator iterator() { - return null; + return new LinkedQueueIterator(); + } + + private class LinkedQueueIterator implements Iterator{ + + Node traversePtr = start; + + @Override + public boolean hasNext() { + return traversePtr != null; + } + + @Override + public E next() { + E currentValue = traversePtr.data; + traversePtr = traversePtr.next; + return currentValue; + } } } diff --git a/module4/src/main/java/com/hithomelabs/princeton1/module4/LinkedStack.java b/module4/src/main/java/com/hithomelabs/princeton1/module4/LinkedStack.java index 72259c0..d2d7536 100644 --- a/module4/src/main/java/com/hithomelabs/princeton1/module4/LinkedStack.java +++ b/module4/src/main/java/com/hithomelabs/princeton1/module4/LinkedStack.java @@ -1,30 +1,82 @@ package com.hithomelabs.princeton1.module4; + +import javax.annotation.Nonnull; import java.util.Iterator; // Creating a concrete linked Implementation of Stack public class LinkedStack extends Stack{ + + static class Node{ + E data; + Node next; + + Node(E data) { + this.data = data; + this.next = null; + } + } + + Node head = null; + Node endPtr = null; + int stackLength = 0; + @Override public boolean isEmpty() { - return false; + return head == null; } @Override public void push(E element) { - + Node new_node = new Node(element); + if(stackLength == 0) + head = new_node; + else + endPtr.next = new_node; + endPtr = new_node; + stackLength++; } @Override public E pop() { - return null; + if(stackLength == 0) + return null; + if(stackLength == 1) + head = null; + Node secondLastPtr = head; + while(secondLastPtr!=null && secondLastPtr.next != endPtr && secondLastPtr.next!=null) + secondLastPtr = secondLastPtr.next; + E currentValue = endPtr.data; + endPtr.next = null; + endPtr = secondLastPtr; + stackLength--; + return currentValue; } @Override public int size() { - return 0; + return stackLength; } + @Nonnull @Override public Iterator iterator() { - return null; + return new LinkedlistIterator(); + } + + private class LinkedlistIterator implements Iterator{ + + Node iteratorPtr = head; + + @Override + public boolean hasNext() { + return iteratorPtr.next != null; + } + + @Override + public E next() { + E currentValue = iteratorPtr.data; + iteratorPtr = iteratorPtr.next; + return currentValue; + } } }