2019-05-09 19:32:54 +08:00
|
|
|
package DataStructures.Queues;
|
|
|
|
|
2018-04-14 11:45:48 +08:00
|
|
|
/**
|
|
|
|
* This implements Queues by using the class Queue.
|
|
|
|
*
|
2021-10-09 00:32:34 +08:00
|
|
|
* A queue data structure functions the same as a real world queue. The elements that are added
|
2020-10-24 18:23:28 +08:00
|
|
|
* first are the first to be removed. New elements are added to the back/rear of the queue.
|
2018-04-14 11:45:48 +08:00
|
|
|
*/
|
2019-02-25 09:33:06 +08:00
|
|
|
class Queue {
|
2020-10-24 18:23:28 +08:00
|
|
|
/** Default initial capacity. */
|
|
|
|
private static final int DEFAULT_CAPACITY = 10;
|
|
|
|
|
|
|
|
/** Max size of the queue */
|
|
|
|
private int maxSize;
|
|
|
|
/** The array representing the queue */
|
|
|
|
private int[] queueArray;
|
|
|
|
/** Front of the queue */
|
|
|
|
private int front;
|
|
|
|
/** Rear of the queue */
|
|
|
|
private int rear;
|
|
|
|
/** How many items are in the queue */
|
|
|
|
private int nItems;
|
|
|
|
|
|
|
|
/** init with DEFAULT_CAPACITY */
|
|
|
|
public Queue() {
|
|
|
|
this(DEFAULT_CAPACITY);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Constructor
|
|
|
|
*
|
|
|
|
* @param size Size of the new queue
|
|
|
|
*/
|
|
|
|
public Queue(int size) {
|
|
|
|
maxSize = size;
|
|
|
|
queueArray = new int[size];
|
|
|
|
front = 0;
|
|
|
|
rear = -1;
|
|
|
|
nItems = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Inserts an element at the rear of the queue
|
|
|
|
*
|
|
|
|
* @param x element to be added
|
|
|
|
* @return True if the element was added successfully
|
|
|
|
*/
|
|
|
|
public boolean insert(int x) {
|
|
|
|
if (isFull()) return false;
|
|
|
|
// If the back of the queue is the end of the array wrap around to the front
|
|
|
|
rear = (rear + 1) % maxSize;
|
|
|
|
queueArray[rear] = x;
|
|
|
|
nItems++;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Remove an element from the front of the queue
|
|
|
|
*
|
|
|
|
* @return the new front of the queue
|
|
|
|
*/
|
|
|
|
public int remove() {
|
|
|
|
if (isEmpty()) {
|
|
|
|
return -1;
|
2019-09-28 22:29:47 +08:00
|
|
|
}
|
2020-10-24 18:23:28 +08:00
|
|
|
int temp = queueArray[front];
|
|
|
|
front = (front + 1) % maxSize;
|
|
|
|
nItems--;
|
|
|
|
return temp;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Checks what's at the front of the queue
|
|
|
|
*
|
|
|
|
* @return element at the front of the queue
|
|
|
|
*/
|
|
|
|
public int peekFront() {
|
|
|
|
return queueArray[front];
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Checks what's at the rear of the queue
|
|
|
|
*
|
|
|
|
* @return element at the rear of the queue
|
|
|
|
*/
|
|
|
|
public int peekRear() {
|
|
|
|
return queueArray[rear];
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns true if the queue is empty
|
|
|
|
*
|
|
|
|
* @return true if the queue is empty
|
|
|
|
*/
|
|
|
|
public boolean isEmpty() {
|
|
|
|
return nItems == 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns true if the queue is full
|
|
|
|
*
|
|
|
|
* @return true if the queue is full
|
|
|
|
*/
|
|
|
|
public boolean isFull() {
|
|
|
|
return nItems == maxSize;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the number of elements in the queue
|
|
|
|
*
|
|
|
|
* @return number of elements in the queue
|
|
|
|
*/
|
|
|
|
public int getSize() {
|
|
|
|
return nItems;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String toString() {
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
sb.append("[");
|
|
|
|
for (int i = front; ; i = ++i % maxSize) {
|
|
|
|
sb.append(queueArray[i]).append(", ");
|
|
|
|
if (i == rear) {
|
|
|
|
break;
|
|
|
|
}
|
2019-10-08 22:41:49 +08:00
|
|
|
}
|
2020-10-24 18:23:28 +08:00
|
|
|
sb.replace(sb.length() - 2, sb.length(), "]");
|
|
|
|
return sb.toString();
|
|
|
|
}
|
2018-04-14 11:45:48 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This class is the example for the Queue class
|
|
|
|
*
|
2019-02-25 09:33:06 +08:00
|
|
|
* @author Unknown
|
2018-04-14 11:45:48 +08:00
|
|
|
*/
|
2019-02-25 09:33:06 +08:00
|
|
|
public class Queues {
|
2020-10-24 18:23:28 +08:00
|
|
|
/**
|
|
|
|
* Main method
|
|
|
|
*
|
|
|
|
* @param args Command line arguments
|
|
|
|
*/
|
|
|
|
public static void main(String[] args) {
|
|
|
|
Queue myQueue = new Queue(4);
|
|
|
|
myQueue.insert(10);
|
|
|
|
myQueue.insert(2);
|
|
|
|
myQueue.insert(5);
|
|
|
|
myQueue.insert(3);
|
|
|
|
// [10(front), 2, 5, 3(rear)]
|
|
|
|
|
|
|
|
System.out.println(myQueue.isFull()); // Will print true
|
|
|
|
|
|
|
|
myQueue.remove(); // Will make 2 the new front, making 10 no longer part of the queue
|
|
|
|
// [10, 2(front), 5, 3(rear)]
|
|
|
|
|
2021-10-09 00:32:34 +08:00
|
|
|
myQueue.insert(7); // Insert 7 at the rear which will get 0 index because of wrap around
|
2020-10-24 18:23:28 +08:00
|
|
|
// [7(rear), 2(front), 5, 3]
|
|
|
|
|
|
|
|
System.out.println(myQueue.peekFront()); // Will print 2
|
|
|
|
System.out.println(myQueue.peekRear()); // Will print 7
|
|
|
|
System.out.println(myQueue.toString()); // Will print [2, 5, 3, 7]
|
|
|
|
}
|
2019-02-25 09:33:06 +08:00
|
|
|
}
|