diff --git a/guide/english/certifications/coding-interview-prep/data-structures/create-a-priority-queue-class/index.md b/guide/english/certifications/coding-interview-prep/data-structures/create-a-priority-queue-class/index.md index ea967aa367..e2f8d22969 100644 --- a/guide/english/certifications/coding-interview-prep/data-structures/create-a-priority-queue-class/index.md +++ b/guide/english/certifications/coding-interview-prep/data-structures/create-a-priority-queue-class/index.md @@ -3,8 +3,123 @@ title: Create a Priority Queue Class --- ## Create a Priority Queue Class -This is a stub. Help our community expand it. +### Method: +- Priority Queue is an Abstract Data Type. +- It can be implemented using other Data Structures but is commonly implemented using a Heap. +- Each node contains a priority. When we enqueue a node to the queue, it's "bubbled up" to its place in the queue. +- In this challenge we need to create a Priority Queue class based on Min-Heap with a few methods: + - enqueue() - It enqueue's the new node to it's appropriate place in queue. + - dequeue() - It removes the first node from the queue. + - front() - This method returns the first node to be dequeued. + - size() - Returns the size of the queue. + - isEmpty() - Returns if the queue is empty. +- | DS | Access | Search | Insert | Delete | + | ----- | ------ | ------ | ------ | ------ | + | Priority Queue | 1 | 1 | logn | logn | -This quick style guide will help ensure your pull request gets accepted. - +### Solution: +```js +//function which swaps elements in array, using ES6 syntax +function swap(arr, i, j) { + [arr[i], arr[j]] = [arr[j], arr[i]]; +} + +class PriorityQueue { + constructor() { + //initializing queue + this.collection = []; + } + + printCollection() { + console.log(this.collection); + } + + //enqueues the node to the queue + enqueue(node) { + this.collection.push(node); + //calling the helper method which bubbles up the node to the correct position + this.bubbleUp(); + } + + //helper method which bubbles the node to its correct position + bubbleUp() { + let i = this.size() - 1; + let node = this.collection[i]; + + while (true) { + //getting the parent node's index + let parent = Math.floor((i - 1) / 2); + if (parent < 0) return; + + //comparing with parent, if the node is smaller then swapping + if (this.collection[parent][1] > node[1]) { + swap(this.collection, parent, i); + i = parent; + } else break; + } + } + + //dequeues the node and returns its value + dequeue() { + if (this.isEmpty()) return; + if (this.size() === 1) { + return this.collection.pop()[0]; + } + //getting the first element from the queue + let pop = this.collection[0]; + + //replacing the first element by last + this.collection[0] = this.collection.pop(); + + //calling the buubleDown method which bubbles down the node to the correct position + this.bubbleDown(); + return pop[0]; + } + + //helper method which bubble's down the node to the correct position + bubbleDown() { + let node = this.collection[0]; + let i = 0; + + while (true) { + //getting the two child node's index + let child1 = 2 * i + 1; + let child2 = 2 * i + 2; + + //edge case + if (child2 >= this.size()) return; + + //getting the minimum of two child + let min = + this.collection[child1][1] > this.collection[child2][1] + ? child2 + : child1; + + //if the child is smaller than node then swap + if (this.collection[min][1] < node[1]) { + swap(this.collection, i, min); + i = min; + } else break; + } + } + + //returns the first element from queue + front() { + return this.collection[0]; + } + + // returns the size of the queue + size() { + return this.collection.length; + } + + // returns if the queue is empty + isEmpty() { + return this.size() === 0; + } +} +``` +- [Run Code](https://repl.it/@ezioda004/Priority-Queue) +### References: +- [Wikipedia](https://en.wikipedia.org/wiki/Priority_queue)