nus/cs2030s/labs/Lab1/Queue.java

126 lines
2.8 KiB
Java

/**
* The Queue class implements a simple FIFO data structure
* with limited capacity that can store any Object instances.
* Not to be confused with java.util.Queue.
*
* @author Yadunand Prem
* @version CS2030S AY21/22 Semester 2
*/
class Queue<T> {
/** An array to store the items in the queue. */
private T[] items;
/** Index of the first element in the queue. */
private int first;
/** Index of the last element in the queue. */
private int last;
/** Maximum size of the queue. */
private int maxSize;
/** Number of elements in the queue. */
private int len;
/**
* Constructor for a queue.
*
* @param size The maximum num of elements we can put in the queue.
*/
public Queue(int size) {
this.maxSize = size;
// The only way to add values to `items` is via enq(), and we can only put
// objects of type T via that method. Thus, it is safe to cast Comparable[]
// to T[].
@SuppressWarnings("unchecked")
T[] temp = (T[]) new Object[size];
this.items = temp;
this.first = -1;
this.last = -1;
this.len = 0;
}
/**
* Add the object e into the queue.
*
* @param e The item to put in the queue.
* @return false if the queue is full; true if e is added successfully.
*/
public boolean enq(T e) {
if (this.isFull()) {
return false;
}
if (this.isEmpty()) {
this.first = 0;
this.last = 0;
} else {
this.last = (this.last + 1) % this.maxSize;
}
this.items[last] = e;
this.len += 1;
return true;
}
/**
* Remove the object from the queue.
*
* @return null if the queue is empty; the object removed from the queue
* otherwise.
*/
public T deq() {
if (this.isEmpty()) {
return null;
}
T item = this.items[this.first];
this.first = (this.first + 1) % this.maxSize;
this.len -= 1;
return item;
}
/**
* Checks if the queue is full.
*
* @return true if the queue is full; false otherwise.
*/
boolean isFull() {
return (this.len == this.maxSize);
}
/**
* Checks if the queue is empty.
*
* @return true if the queue is empty; false otherwise.
*/
boolean isEmpty() {
return (this.len == 0);
}
/**
* Return the number of elements in the queue.
*
* @return The number of elements in the queue.
*/
public int length() {
return this.len;
}
/**
* Returns the string representation of the queue.
*
* @return A string consisting of the string representation of
* every object in the queue.
*/
@Override
public String toString() {
String str = "[ ";
int i = this.first;
int count = 0;
while (count < this.len) {
str += this.items[i] + " ";
i = (i + 1) % this.maxSize;
count++;
}
return str + "]";
}
}