@ -0,0 +1,22 @@ | |||||
package net.jrtechs.www.DataStructures.Lists.Queue; | |||||
/** | |||||
* @author Jeffery Russell 8-26-18 | |||||
*/ | |||||
public interface IQueue<E> | |||||
{ | |||||
/** | |||||
* Adds a new element to the end of the queue | |||||
* | |||||
* @param element object to add | |||||
*/ | |||||
public void enqueue(E element); | |||||
/** | |||||
* Removes an object from the queue. | |||||
* | |||||
* @return the object removed | |||||
*/ | |||||
public E dequeue(); | |||||
} |
@ -0,0 +1,84 @@ | |||||
package net.jrtechs.www.DataStructures.Lists.Queue; | |||||
import net.jrtechs.www.DataStructures.Node; | |||||
/** | |||||
* Data structure which stores objects in a linked | |||||
* list where objects inserted first are removed first, | |||||
* and where objects inserted last are removed last. | |||||
* | |||||
* @author Jeffery Russell 8-26-18 | |||||
* @param <E> generic data type | |||||
*/ | |||||
public class Queue<E> implements IQueue<E> | |||||
{ | |||||
/** Head node */ | |||||
private Node<E> head; | |||||
/**Stored tail to make insertions o(1) */ | |||||
private Node<E> tail; | |||||
/** | |||||
* Creates an empty queue | |||||
*/ | |||||
public Queue() | |||||
{ | |||||
this.head = null; | |||||
this.tail = null; | |||||
} | |||||
/** | |||||
* Creates a queue with a single element in it | |||||
* | |||||
* @param element object to add to queue | |||||
*/ | |||||
public Queue(E element) | |||||
{ | |||||
this.head = new Node<>(element); | |||||
this.tail = head; | |||||
} | |||||
/** | |||||
* Adds a single element to the queue | |||||
* | |||||
* @param element object to add | |||||
*/ | |||||
@Override | |||||
public void enqueue(E element) | |||||
{ | |||||
Node<E> newElement = new Node<>(element); | |||||
if(this.tail == null) | |||||
{ | |||||
this.head = newElement; | |||||
this.tail = newElement; | |||||
} | |||||
else | |||||
{ | |||||
this.tail.setNext(newElement); | |||||
this.tail = newElement; | |||||
} | |||||
} | |||||
/** | |||||
* Removes the element from the front of the queue | |||||
* | |||||
* @return element removed | |||||
*/ | |||||
@Override | |||||
public E dequeue() | |||||
{ | |||||
if(this.head != null) | |||||
{ | |||||
E temp = this.head.getData(); | |||||
this.head = this.head.getNext(); | |||||
return temp; | |||||
} | |||||
return null; | |||||
} | |||||
} |
@ -0,0 +1,56 @@ | |||||
package net.jrtechs.www.DataStructures.Lists; | |||||
import net.jrtechs.www.DataStructures.Lists.Queue.Queue; | |||||
import org.junit.Test; | |||||
import static junit.framework.TestCase.assertNotNull; | |||||
import static junit.framework.TestCase.assertNull; | |||||
import static junit.framework.TestCase.assertTrue; | |||||
/** | |||||
* JUnit tests for | |||||
* {@link net.jrtechs.www.DataStructures.Lists.Queue.Queue} | |||||
* | |||||
* @author Jeffery Russell 8-26-18 | |||||
*/ | |||||
public class QueueTest | |||||
{ | |||||
@Test | |||||
public void testCreation() | |||||
{ | |||||
assertNotNull(new Queue<>()); | |||||
assertNotNull(new Queue<>(12.0)); | |||||
} | |||||
@Test | |||||
public void testInsertion() | |||||
{ | |||||
Queue<String> words = new Queue<>(); | |||||
words.enqueue("One"); | |||||
words.enqueue("Two"); | |||||
words.enqueue("Three"); | |||||
assertNotNull(words.dequeue()); | |||||
} | |||||
@Test | |||||
public void testDequeue() | |||||
{ | |||||
Queue<String> words = new Queue<>(); | |||||
words.enqueue("One"); | |||||
words.enqueue("Two"); | |||||
words.enqueue("Three"); | |||||
assertTrue(words.dequeue().equals("One")); | |||||
assertTrue(words.dequeue().equals("Two")); | |||||
assertTrue(words.dequeue().equals("Three")); | |||||
assertNull(words.dequeue()); | |||||
} | |||||
} |