Turn a Queue into a Priority Queue
Last Updated :
29 Nov, 2022
What is Queue?
Queue is an abstract data type that is open at both ends. One end is always used to insert data (enqueue) which is basically the rear/back/tail end and the other which is the front end is used to remove data (dequeue). Queue follows First-In-First-Out (FIFO) methodology, i.e., "the data item stored first will be accessed first".
Declaration:
queue<data_type> name
What is a priority queue?
Priority Queue is an abstract data type that is similar to a queue, and every element has some priority value associated with it. The priority of the elements in a priority queue determines the order in which elements are served. If in any case, the elements have the same priority, they are served as per their ordering in the queue.
Declaration :
priority_queue<data_type> name
Types of Priority Queue:
Ascending Order Priority Queue
As the name suggests, in ascending order priority queue, the element with a lower priority value is given a higher priority in the priority list. For example, if we have the following elements in a priority queue arranged in ascending order like {4, 6, 8, 9, 10}. Here, 4 is the smallest number. Therefore, it will get the highest priority in a priority queue.
Descending order Priority Queue
In a descending order priority queue, the elements with a higher priority value are given higher priority. For example, if we have a priority queue with the values {10, 4, 3, 2}, the element 10 will be given the highest priority as it has the largest value.
Types of priority queueTurning a Queue into a Priority Queue
Given a queue. The task is to change a queue in a priority queue.
Example :
Input : Q = [ 3, 4, 2, 8, 1, 7 ]
Output : Q =[ 8, 7, 4, 3, 2, 1 ]
Approach :
The idea is to sort the queue elements either in ascending / descending order. We know that queue can be sorted using recursion that takes extra space due to function call stack.
After sorting the queue either in ascending or descending order we can change a queue into a priority queue. whenever we push any value inside the queue, just after that we have to sort the queue then all elements will be arranged according to their priority.
- Create a queue q and push random elements in it.
- Create sortqueue function to sort the array.
- If the queue is empty then return back.
- Initialize a variable item and store the topmost element of the queue in it and pop it out from the queue.
- Again, make a recursive call inside sortqueue function.
- Now, again insert elements in the queue by checking if q is empty or not.
- If the queue is empty then push the front value inside the queue.
- Check if the current element is greater than the element at the front.
- If yes, then push the value inside the queue and make a recursive call for inserting the front element of the queue to the last.
- If q is not empty then return back.
- Pop the front element and push in the last of the queue.
- Make recursive calls for further elements.
- Otherwise, push the front element into the last of the queue and make a recursive call for pushing elements inside the queue.
Below is the implementation of the above approach.
C++
// C++ code to implement the approach
#include <bits/stdc++.h>
using namespace std;
// Function to push element in last
// by popping from front until size becomes 0
void frontelement(queue<int>& q, int qsize)
{
// Base condition
if (qsize <= 0)
return;
// Pop front element and push
// this last in a queue
q.push(q.front());
q.pop();
// Recursive call for pushing element
frontelement(q, qsize - 1);
}
// Function for inserting element in the queue
void insertelement(queue<int>& q, int val, int qsize)
{
if (qsize == 0 || q.empty()) {
q.push(val);
return;
}
// If current element is greater than
// the element at the front
else if (val >= q.front()) {
// Call stack with front of queue
q.push(val);
// Recursive call for inserting
// a front element of the queue
// to the last
frontelement(q, qsize);
}
else {
// Push front element into last in a queue
q.push(q.front());
q.pop();
// Recursive call for pushing elements in a queue
insertelement(q, val, qsize - 1);
}
}
// Function to sort queue
void sortqueue(queue<int>& q)
{
if (q.empty()) {
return;
}
int item = q.front();
q.pop();
sortqueue(q);
insertelement(q, item, q.size());
}
// Driver Code
int main()
{
queue<int> q;
q.push(3);
q.push(4);
q.push(2);
q.push(8);
q.push(1);
q.push(7);
// Initially queue is 3 4 2 8 1 7
sortqueue(q);
while (!q.empty()) {
cout << q.front() << " ";
q.pop();
}
return 0;
}
Java
// Java code to implement the approach
import java.io.*;
import java.util.*;
class GFG {
// Function to push element in last
// by popping from front until size becomes 0
static void frontelement(Queue<Integer> q, int qsize)
{
// Base condition
if (qsize <= 0) {
return;
}
// Pop front element and push
// this last in a queue
q.add(q.peek());
q.poll();
// Recursive call for pushing element
frontelement(q, qsize - 1);
}
// Function for inserting element in the queue
static void insertelement(Queue<Integer> q, int val,
int qsize)
{
if (qsize == 0 || q.isEmpty()) {
q.add(val);
return;
}
// If current element is greater than
// the element at the front
else if (val >= q.peek()) {
// Call stack with front of queue
q.add(val);
// Recursive call for inserting
// a front element of the queue
// to the last
frontelement(q, qsize);
}
else {
// Push front element into last in a queue
q.add(q.peek());
q.poll();
// Recursive call for pushing elements in a
// queue
insertelement(q, val, qsize - 1);
}
}
// Function to sort queue
static void sortqueue(Queue<Integer> q)
{
if (q.isEmpty()) {
return;
}
int item = q.peek();
q.poll();
sortqueue(q);
insertelement(q, item, q.size());
}
public static void main(String[] args)
{
Queue<Integer> q = new LinkedList<>();
q.add(3);
q.add(4);
q.add(2);
q.add(8);
q.add(1);
q.add(7);
// Initially queue is 3 4 2 8 1 7
sortqueue(q);
while (!q.isEmpty()) {
System.out.print(q.peek() + " ");
q.poll();
}
}
}
// This code is contributed by lokeshmvs21.
Python3
# Python code to implement the approach
# Function to push element in last
# by popping from front until size becomes 0
def frontelement(q, qsize):
# Base condition
if qsize <= 0:
return
# Pop front element and push
# this last in a queue
q.append(q[0])
q.pop(0)
# Recursive call for pushing element
frontelement(q, qsize - 1)
# function for inserting element in the queue
def insertelement(q, val, qsize):
if qsize == 0 or len(q) == 0:
q.append(val)
return
# If current element is greater than
# the element at the front
elif val >= q[0]:
# Call stack with front of queue
q.append(val)
# Recursive call for inserting
# a front element of the queue
# to the last
frontelement(q, qsize)
else:
# Push front element into last in a queue
q.append(q[0])
q.pop(0)
# Recursive call for pushing elements in a queue
insertelement(q, val, qsize - 1)
# Function to sort queue
def sortqueue(q):
if len(q) == 0:
return
item = q[0]
q.pop(0)
sortqueue(q)
insertelement(q, item, len(q))
# Driver Code
q = [3, 4, 2, 8, 1, 7]
# Initially queue is 3 4 2 8 1 7
sortqueue(q)
print(q)
# This code is contributed by Tapesh(tapeshdua420)
C#
// C# code to implement the approach
using System;
using System.Collections.Generic;
class Program {
// Function to push element in last
// by popping from front until size becomes 0
static void frontelement(Queue<int> q, int qsize)
{
// Base condition
if (qsize <= 0)
return;
// Pop front element and push
// this last in a queue
q.Enqueue(q.Peek());
q.Dequeue();
// Recursive call for pushing element
frontelement(q, qsize - 1);
}
// Function for inserting element in the queue
static void insertelement(Queue<int> q, int val,
int qsize)
{
if (qsize == 0 || q.Count == 0) {
q.Enqueue(val);
return;
}
// If current element is greater than
// the element at the front
else if (val >= q.Peek()) {
// Call stack with front of queue
q.Enqueue(val);
// Recursive call for inserting
// a front element of the queue
// to the last
frontelement(q, qsize);
}
else {
// Push front element into last in a queue
q.Enqueue(q.Peek());
q.Dequeue();
// Recursive call for pushing elements in a
// queue
insertelement(q, val, qsize - 1);
}
}
// Function to sort queue
static void sortqueue(Queue<int> q)
{
if (q.Count == 0) {
return;
}
int item = q.Peek();
q.Dequeue();
sortqueue(q);
insertelement(q, item, q.Count);
}
// Driver Code
static void Main(string[] args)
{
Queue<int> q = new Queue<int>();
q.Enqueue(3);
q.Enqueue(4);
q.Enqueue(2);
q.Enqueue(8);
q.Enqueue(1);
q.Enqueue(7);
// Initially queue is 3 4 2 8 1 7
sortqueue(q);
while (q.Count != 0) {
Console.Write(q.Peek() + " ");
q.Dequeue();
}
}
}
// This code is contributed by Tapesh(tapeshdua420)
JavaScript
// Javascript code to implement the approach
// Function to push element in last
// by popping from front until size becomes 0
function frontelement(q, qsize) {
// Base condition
if (qsize <= 0) {
return;
}
// Pop front element and push
// this last in a queue
q.push(q[0]);
q.shift();
// Recursive call for pushing element
frontelement(q, qsize - 1);
}
// function for inserting element in the queue
function insertelement(q, val, qsize) {
if (qsize == 0 || q.length == 0) {
q.push(val);
return;
}
// If current element is greater than
// the element at the front
else if (val >= q[0]) {
// Call stack with front of queue
q.push(val);
// Recursive call for inserting
// a front element of the queue
// to the last
frontelement(q, qsize);
} else {
// Push front element into last in a queue
q.push(q[0]);
q.shift();
// Recursive call for pushing elements in a queue
insertelement(q, val, qsize - 1);
}
}
// Function to sort queue
function sortqueue(q) {
if (q.length == 0) {
return;
}
var item = q[0];
q.shift();
sortqueue(q);
insertelement(q, item, q.length);
}
// Driver Code
var q = [3, 4, 2, 8, 1, 7];
// Initially queue is 3 4 2 8 1 7
sortqueue(q);
console.log(q);
// This code is contributed by Tapesh(tapeshdua420)
Time complexity: O(N2)
Auxiliary Space: O(N)
Related Articles:
Similar Reads
Priority Queue using Queue and Heapdict module in Python
Priority Queue is an extension of the queue with the following properties. An element with high priority is dequeued before an element with low priority. If two elements have the same priority, they are served according to their order in the queue. queue.PriorityQueue(maxsize) It is a constructor fo
3 min read
Priority Queue Using Array
A priority queue is a data structure that stores elements with associated priorities. In a priority queue, elements are dequeued in order of their priority, with the highest priority elements being removed first. It is commonly used in algorithms like Dijkstra's for shortest path and in real-time sc
8 min read
C++ STL - Reverse Priority Queue
A priority Queue is an abstract data type that resembles a queue, and each element has a corresponding priority value. Priority queues are built on the top of the max heap and use an array or vector as an internal structure. In C++ STL, by default, the first element of the queue is the greatest of a
2 min read
priority_queue::swap() in C++ STL
Priority queues are a type of container adaptors, specifically designed such that the first element of the queue is either the greatest or the smallest of all elements in the queue. However, in C++ STL (by default) the largest element is at the top. We can also create a priority queue having the sma
3 min read
Priority Queue using Linked List
Implement Priority Queue using Linked Lists. The Linked List should be so created so that the highest priority ( priority is assigned from 0 to n-1 where n is the number of elements, where 0 means the highest priority and n-1 being the least ) element is always at the head of the list. The list is a
11 min read
STL Priority Queue for Structure or Class
STL priority_queue is the implementation of Heap Data-structure. By default, it's a max heap and we can easily use it for primitive datatypes. There are some important applications of it which can be found here Prerequisite: Prioirty_queue Basics In this article, we will see how can we use priority_
3 min read
Priority Queue using Binary Heap
What is a Priority Queue ?Priority Queue is an extension of the queue with the following properties: Every item has a priority associated with it.An element with high priority is dequeued before an element with low priority.If two elements have the same priority, they are served according to their o
15+ min read
How to implement Priority Queue - using Heap or Array?
A Priority Queue is a data structure that allows you to insert elements with a priority, and retrieve the element with the highest priority. You can implement a priority queue using either an array or a heap. Both array and heap-based implementations of priority queues have their own advantages and
15+ min read
How to implement stack using priority queue or heap?
How to Implement stack using a priority queue(using min heap)? Asked In: Microsoft, Adobe. Solution: In the priority queue, we assign priority to the elements that are being pushed. A stack requires elements to be processed in the Last in First Out manner. The idea is to associate a count that dete
6 min read
Difference between Circular Queue and Priority Queue
Queues are fundamental data structures that are used to store and manage a collection of elements. While both circular queues and priority queues are types of queues, they have distinct characteristics and applications. This article will explore the key differences between circular queues and priori
4 min read