Queue Data Structure in JavaScript

It is easy to limit the functionality of an array to make it work as a particular queue or stack data structure. I personally believe that instead of using the array object directly, it is better to constrain it to the methods required by the job instead of leaving every method public that can be misused by other programmers.

Continuing with Data structures using JavaScript. Today, we will create a Queue class using arrays. I previously stated that in JavaScript, arrays has this functionality by default. Nevertheless, they give you methods that are not part of one data structure, which can lead to unnecessary and unwanted confusion and results.

Characteristics of a Queue


If you arrive at the store and there is a line in the front waiting to enter. When a new person arrives, it is positioned at the end of the line. However, when it is time to enter the store, the first person in line, it is the first person to enter the store. The same concepts apply to a Queue which is First-come, first-served. Additionally, the queue must have the following methods:

  • Enqueue: add items to the end of the queue.
  • dequeue: remove and return the first item of the queue (First In, First Out).
  • Peek: Return the first element of the queue without removing it.
  • Length: to know how many items are in the queue.

Other methods that are very useful for iterating with the queue are:

  • hastItems: return true or false, depending if the queue has items or not.
  • isEmpty: return true or false if depending if the queue is empty or not.

Queue Class in JavaScript

Note that the code code used to implement the Queue data structure in JavaScript is very similar that the one we used to create the Stack class:

class Queue {
  //Constructor
  constructor(){
    //Private array for the queue
    this.queue = [];
  }
  //Return the size or length of the queue
  length(){
    return this.queue.length;
  }
  //Same as length()
  size(){
    return this.length();
  }
  //At new item at the end of the queue
  enqueue(item){
    this.queue.push(item);
  }
  //Remove and return the item at the front of the queue
  dequeue(){
    return this.queue.shift();
  }
  //Returns the content of the front item of the queue
  peek(){
    return this.queue[0];
  }
  //Returns if the queue has items or not
  hasItems(){
    return !!this.length();
  }
  //Returns if the queue is empty or not
  isEmpty(){
    return !this.hasItems();
  }
}

Using the Queue Class

Similar to what we did with the Stack class, we can use the Queue class to hide methods from the Array object that are not relevant for a queue. Additionally, it allows access only to the front of the queue which leaves the rest of the items hidden and impossible to access without removing items from the front.

Creating an instance from the Queue Class

let queue = new Queue();

Adding items to the Queue

queue.enqueue("new item");

Iterating over the queue

let queue = new Queue();
 
queue.enqueue("item one");
queue.enqueue("item two");
queue.enqueue("item three");
 
while(queue.hasItems()) {
   console.log(queue.dequeue());
}

Conclusion

It is easy to limit the functionality of an array to make it work as a particular queue or stack data structure. I personally believe that instead of using the array object directly, it is better to constrain it to the methods required by the job instead of leaving every method public that can be misused by other programmers.

Have your say