The queue is a fundamental data container in which are the stored elements removed (polled) in the same order as they were inserted into the structure (enqueued). This principle is called FIFO – first in, first out. The opposite approach LIFO – last in, fist out – is used in the stack data structure.
A special type of a queue is a priority queue, in which are the elements polled in the order defined by their priority.
Typical operations
- addLast (enqueue) – Put the element into the queue.
- deleteFirst (poll, dequeue) – Get and remove the first element (head) of the queue.
- getFirst (peek) – Get the first element of the queue.
- isEmpty – Query whether the queue does not contain any element.
- size – Return the number of contained elements.
Usage
In computer science the queue is widely used, for example in these applications:
- Synchronization primitive in multi-threaded applications
- Unix pipe operator used for interprocess communication
- Circular buffer – buffer for data streams
- Heapsort – a sorting algorithm based on a priority queue
Code
/** * Queue - implemented as a linked list */ public class Queue { private Node first; private Node last; private int size; public Queue() { this.size = 0; } /** * Insert the element at the end of the queue * @param i element */ public void addLast(int i) { Node n = new Node(i); if(getSize() == 0) { this.first = n; this.last = n; } else { this.last.next = n; this.last = n; } size++; } /** * Remove the first element * @return element */ public int deteteFirst() { if(getSize() == 0) throw new IllegalStateException("Queue is empty"); int value = first.value; first = first.next; size--; return value; } /** * Return the first element * @return element */ public int getFirst() { if(getSize() == 0) throw new IllegalStateException("Queue is empty"); return first.value; } /** * Get number of contained elements * @return lenght of the queue */ public int getSize() { return size; } /** * Query, whether is the queue empty * @return true if the queue is empty, false otherwise */ public boolean isEmpty() { return this.size == 0; } @Override public String toString() { StringBuilder builder = new StringBuilder(); Node curr = first; for(int i = 0; i < this.size; i++) { builder.append(curr.value).append(" "); curr = curr.next; } return builder.toString(); } /** * Inner representation of the element (node of the linked list) */ private class Node { private int value; private Node next; private Node(int value) { this.value = value; } } }