Reversing a queue using recursion
Given a queue, write a recursive function to reverse it.
Standard operations allowed :
enqueue(x) : Add an item x to rear of queue.
dequeue() : Remove an item from front of queue.
empty() : Checks if a queue is empty or not.
Examples :
Input : Q = [5, 24, 9, 6, 8, 4, 1, 8, 3, 6] Output : Q = [6, 3, 8, 1, 4, 8, 6, 9, 24, 5] Explanation : Output queue is the reverse of the input queue. Input : Q = [8, 7, 2, 5, 1] Output : Q = [1, 5, 2, 7, 8]
Recursive Algorithm :
- The pop element from the queue if the queue has elements otherwise return empty queue.
- Call reverseQueue function for the remaining queue.
- Push the popped element in the resultant reversed queue.
Pseudo Code :
queue reverseFunction(queue) { if (queue is empty) return queue; else { data = queue.front() queue.pop() queue = reverseFunction(queue); q.push(data); return queue; } }
Implementation:
C++
// C++ code for reversing a queue #include <bits/stdc++.h> using namespace std; // Utility function to print the queue void printQueue(queue< long long int > Queue) { while (!Queue.empty()) { cout << Queue.front() << " " ; Queue.pop(); } } // Recursive function to reverse the queue void reverseQueue(queue< long long int >& q) { // Base case if (q.empty()) return ; // Dequeue current item (from front) long long int data = q.front(); q.pop(); // Reverse remaining queue reverseQueue(q); // Enqueue current item (to rear) q.push(data); } // Driver code int main() { queue< long long int > Queue; Queue.push(56); Queue.push(27); Queue.push(30); Queue.push(45); Queue.push(85); Queue.push(92); Queue.push(58); Queue.push(80); Queue.push(90); Queue.push(100); reverseQueue(Queue); printQueue(Queue); } |
Java
// Java program to reverse a Queue by recursion import java.util.LinkedList; import java.util.Queue; import java.util.Stack; // Java program to reverse a queue recursively public class Queue_reverse { static Queue<Integer> queue; // Utility function to print the queue static void Print() { while (!queue.isEmpty()) { System.out.print(queue.peek() + " " ); queue.remove(); } } // Recursive function to reverse the queue static Queue<Integer> reverseQueue(Queue<Integer> q) { // Base case if (q.isEmpty()) return q; // Dequeue current item (from front) int data = q.peek(); q.remove(); // Reverse remaining queue q = reverseQueue(q); // Enqueue current item (to rear) q.add(data); return q; } // Driver code public static void main(String args[]) { queue = new LinkedList<Integer>(); queue.add( 56 ); queue.add( 27 ); queue.add( 30 ); queue.add( 45 ); queue.add( 85 ); queue.add( 92 ); queue.add( 58 ); queue.add( 80 ); queue.add( 90 ); queue.add( 100 ); queue = reverseQueue(queue); Print(); } } |
Python3
from queue import Queue def reverse_queue(queue: Queue): # Base case if queue.empty(): return # Dequeue current item (from front) item = queue.queue[ 0 ] queue.get() # Reverse remaining queue reverse_queue(queue) # Enqueue current item (to rear) queue.put(item) def print_queue(queue: Queue): while not queue.empty(): print (queue.queue[ 0 ], end = " " ) queue.get() print () # Driver Code if __name__ = = "__main__" : q = Queue() q.put( 56 ) q.put( 27 ) q.put( 30 ) q.put( 45 ) q.put( 85 ) q.put( 92 ) q.put( 58 ) q.put( 80 ) q.put( 90 ) q.put( 100 ) reverse_queue(q) print_queue(q) |
C#
// C# code for reversing a queue using System; using System.Collections.Generic; class GFG { // Utility function // to print the queue static void printQueue(Queue< long > queue) { while (queue.Count != 0) { Console.Write(queue.Peek() + " " ); queue.Dequeue(); } } // Recursive function // to reverse the queue static void reverseQueue( ref Queue< long > q) { // Base case if (q.Count == 0) return ; // Dequeue current // item (from front) long data = q.Peek(); q.Dequeue(); // Reverse remaining queue reverseQueue( ref q); // Enqueue current // item (to rear) q.Enqueue(data); } // Driver code static void Main() { Queue< long > queue = new Queue< long >(); queue.Enqueue(56); queue.Enqueue(27); queue.Enqueue(30); queue.Enqueue(45); queue.Enqueue(85); queue.Enqueue(92); queue.Enqueue(58); queue.Enqueue(80); queue.Enqueue(90); queue.Enqueue(100); reverseQueue( ref queue); printQueue(queue); } } // This code is contributed by // Manish Shaw(manishshaw1) |
Javascript
<script> // Javascript code for reversing a queue // Utility function // to print the queue function printQueue(queue) { while (queue.length != 0) { document.write(queue[0] + " " ); queue.shift(); } } // Recursive function // to reverse the queue function reverseQueue(q) { // Base case if (q.length == 0) return ; // Dequeue current // item (from front) let data = q[0]; q.shift(); // Reverse remaining queue reverseQueue(q); // Enqueue current // item (to rear) q.push(data); } let queue = []; queue.push(56); queue.push(27); queue.push(30); queue.push(45); queue.push(85); queue.push(92); queue.push(58); queue.push(80); queue.push(90); queue.push(100); reverseQueue(queue); printQueue(queue); // This code is contributed by divyeshrabadiya07. </script> |
Output
100 90 80 58 92 85 45 30 27 56
Complexity analysis:
- Time Complexity: O(n).
- Auxiliary Space: O(n), since recursion uses stack internally
Please Login to comment...