Reversing a Queue using another Queue

Given a queue. The task is to reverse the queue using another another empty queue.

Examples:

Input: queue[] = {1, 2, 3, 4, 5}
Output: 5 4 3 2 1

Input: queue[] = {10, 20, 30, 40}
Output: 40 30 20 10

Approach:



  • Given a queue and an empty queue.
  • The last element of the queue should be the first element of the new queue.
  • To get the last element there is a need to pop the queue one by one and add it to the end of the queue, size – 1 times.
  • So after that, we will get the last element in front of the queue. Now pop that element out and add it to the new queue. Repeat the steps s – 1 times where s is the original size of the queue.

Below is the implementation of the approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the above approach
#include <bits/stdc++.h>
using namespace std;
  
// Function to return the reversed queue
queue<int> reverse(queue<int> q)
{
    // Size of ueue
    int s = q.size();
  
    // Second queue
    queue<int> ans;
  
    for (int i = 0; i < s; i++) {
  
        // Get the last element to the
        // front of queue
        for (int j = 0; j < q.size() - 1; j++) {
            int x = q.front();
            q.pop();
            q.push(x);
        }
  
        // Get the last element and
        // add it to the new queue
        ans.push(q.front());
        q.pop();
    }
    return ans;
}
  
// Driver Code
int main()
{
    queue<int> q;
  
    // Insert elements
    q.push(1);
    q.push(2);
    q.push(3);
    q.push(4);
    q.push(5);
  
    q = reverse(q);
  
    // Print the queue
    while (!q.empty()) {
        cout << q.front() << " ";
        q.pop();
    }
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of the above approach
import java.util.*;
class GFG
{
  
// Function to return the reversed queue
static Queue<Integer> reverse(Queue<Integer> q)
{
    // Size of ueue
    int s = q.size();
  
    // Second queue
    Queue<Integer> ans = new LinkedList<>();
  
    for (int i = 0; i < s; i++)
    {
  
        // Get the last element to the
        // front of queue
        for (int j = 0; j < q.size() - 1; j++) 
        {
            int x = q.peek();
            q.remove();
            q.add(x);
        }
  
        // Get the last element and
        // add it to the new queue
        ans.add(q.peek());
        q.remove();
    }
    return ans;
}
  
// Driver Code
public static void main(String[] args) 
{
    Queue<Integer> q = new LinkedList<>();
  
    // Insert elements
    q.add(1);
    q.add(2);
    q.add(3);
    q.add(4);
    q.add(5);
  
    q = reverse(q);
  
    // Print the queue
    while (!q.isEmpty()) 
    {
        System.out.print(q.peek() + " ");
        q.remove();
    }
    }
  
// This code is contributed by Princi Singh

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 implementation of the above approach
from collections import deque
  
# Function to return the reversed queue
def reverse(q):
      
    # Size of ueue
    s = len(q)
  
    # Second queue
    ans = deque()
  
    for i in range(s):
  
        # Get the last element to the
        # front of queue
        for j in range(s - 1):
            x = q.popleft()
            q.appendleft(x)
  
        # Get the last element and
        # add it to the new queue
        ans.appendleft(q.popleft())
    return ans
  
# Driver Code
q = deque()
  
# Insert elements
q.append(1)
q.append(2)
q.append(3)
q.append(4)
q.append(5)
  
q = reverse(q)
  
# Print the queue
while (len(q) > 0):
    print(q.popleft(), end = " ")
  
# This code is contributed by Mohit Kumar

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# Program to print the given pattern
using System;
using System.Collections.Generic; 
      
class GFG
{
  
// Function to return the reversed queue
static Queue<int> reverse(Queue<int> q)
{
    // Size of ueue
    int s = q.Count;
  
    // Second queue
    Queue<int> ans = new Queue<int>();
  
    for (int i = 0; i < s; i++)
    {
  
        // Get the last element to the
        // front of queue
        for (int j = 0; j < q.Count - 1; j++) 
        {
            int x = q.Peek();
            q.Dequeue();
            q.Enqueue(x);
        }
  
        // Get the last element and
        // add it to the new queue
        ans.Enqueue(q.Peek());
        q.Dequeue();
    }
    return ans;
}
  
// Driver Code
public static void Main(String[] args) 
{
    Queue<int> q = new Queue<int>();
  
    // Insert elements
    q.Enqueue(1);
    q.Enqueue(2);
    q.Enqueue(3);
    q.Enqueue(4);
    q.Enqueue(5);
  
    q = reverse(q);
  
    // Print the queue
    while (q.Count!=0) 
    {
        Console.Write(q.Peek() + " ");
        q.Dequeue();
    }
    }
}
  
// This code is contributed by Princi Singh

chevron_right


Output:

5 4 3 2 1


My Personal Notes arrow_drop_up

Second year Department of Information Technology Jadavpur University

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.