Implement Stack using Queues (original) (raw)

Last Updated : 25 Mar, 2025

Try it on GfG Practice redirect icon

Implement a stack using queues. The stack should support the following operations:

  1. **Push(x): Push an element onto the stack.
  2. **Pop(): Pop the element from the top of the stack and return it.

Stack and Queue with insert and delete operations

A Stack can be implemented using two queues. Let Stack to be implemented be 's' and queues used to implement are 'q1' and 'q2'.
Stack 's' can be implemented in two ways:

**By making push() operation costly - Push in O(n) and Pop() in O(1)

The idea is to keep newly entered element at the front of 'q1' so that pop operation dequeues from 'q1'. 'q2' is used to move every new element in front of ****'q1'**.

Follow the below steps to implement the **push(s, x) operation:

Follow the below steps to implement the **pop(s) operation:

/* Program to implement a stack using two queue */ #include <bits/stdc++.h>

using namespace std;

class Stack { // Two inbuilt queues queue q1, q2;

public: void push(int x) { // Push x first in empty q2 q2.push(x);

    // Push all the remaining
    // elements in q1 to q2.
    while (!q1.empty()) {
        q2.push(q1.front());
        q1.pop();
    }

    // swap the names of two queues
    swap(q1, q2);
}

void pop()
{
    // if no elements are there in q1
    if (q1.empty())
        return;
    q1.pop();
}

int top()
{
    if (q1.empty())
        return -1;
    return q1.front();
}

int size() { return q1.size(); }

};

// Driver code int main() { Stack s; s.push(1); s.push(2); s.push(3);

cout << "current size: " << s.size() << endl;
cout << s.top() << endl;
s.pop();
cout << s.top() << endl;
s.pop();
cout << s.top() << endl;

cout << "current size: " << s.size() << endl;
return 0;

}

Java

/* Java Program to implement a stack using two queue / import java.util.;

class GfG {

static class Stack {
    
    // Two inbuilt queues
    static Queue<Integer> q1
        = new LinkedList<Integer>();
    static Queue<Integer> q2
        = new LinkedList<Integer>();

    // To maintain current number of
    // elements
    static int curr_size;

    static void push(int x)
    {
        // Push x first in empty q2
        q2.add(x);

        // Push all the remaining
        // elements in q1 to q2.
        while (!q1.isEmpty()) {
            q2.add(q1.peek());
            q1.remove();
        }

        // swap the names of two queues
        Queue<Integer> q = q1;
        q1 = q2;
        q2 = q;
    }

    static void pop()
    {

        // if no elements are there in q1
        if (q1.isEmpty())
            return;
        q1.remove();
    }

    static int top()
    {
        if (q1.isEmpty())
            return -1;
        return q1.peek();
    }

    static int size() { return q1.size(); }
}

// driver code
public static void main(String[] args)
{
    Stack s = new Stack();
    s.push(1);
    s.push(2);
    s.push(3);

    System.out.println("current size: " + s.size());
    System.out.println(s.top());
    s.pop();
    System.out.println(s.top());
    s.pop();
    System.out.println(s.top());

    System.out.println("current size: " + s.size());
}

} // This code is contributed by Prerna

Python

Program to implement a stack using

two queue

from _collections import deque

class Stack:

def __init__(self):

    # Two inbuilt queues
    self.q1 = deque()
    self.q2 = deque()

def push(self, x):

    # Push x first in empty q2
    self.q2.append(x)

    # Push all the remaining
    # elements in q1 to q2.
    while (self.q1):
        self.q2.append(self.q1.popleft())

    # swap the names of two queues
    self.q1, self.q2 = self.q2, self.q1

def pop(self):

    # if no elements are there in q1
    if self.q1:
        self.q1.popleft()

def top(self):
    if (self.q1):
        return self.q1[0]
    return None

def size(self):
    return len(self.q1)

Driver Code

if name == 'main': s = Stack() s.push(1) s.push(2) s.push(3)

print("current size: ", s.size())
print(s.top())
s.pop()
print(s.top())
s.pop()
print(s.top())

print("current size: ", s.size())

This code is contributed by PranchalK

C#

// C# Program to implement a stack using two queues using System; using System.Collections.Generic;

class GfG { static class Stack { // Two inbuilt queues static Queue q1 = new Queue(); static Queue q2 = new Queue();

    // To maintain current number of elements
    static int curr_size;

    static void Push(int x)
    {
        // Push x first in empty q2
        q2.Enqueue(x);

        // Push all the remaining elements in q1 to q2.
        while (q1.Count > 0)
        {
            q2.Enqueue(q1.Dequeue());
        }

        // swap the names of two queues
        Queue<int> q = q1;
        q1 = q2;
        q2 = q;
    }

    static void Pop()
    {
        // if no elements are there in q1
        if (q1.Count == 0)
            return;
        q1.Dequeue();
    }

    static int Top()
    {
        if (q1.Count == 0)
            return -1;
        return q1.Peek();
    }

    static int Size() { return q1.Count; }
}

// driver code
public static void Main(string[] args)
{
    Stack s = new Stack();
    s.Push(1);
    s.Push(2);
    s.Push(3);

    Console.WriteLine("current size: " + s.Size());
    Console.WriteLine(s.Top());
    s.Pop();
    Console.WriteLine(s.Top());
    s.Pop();
    Console.WriteLine(s.Top());

    Console.WriteLine("current size: " + s.Size());
}

}

JavaScript

/*Javascript Program to implement a stack using two queue */

// Two inbuilt queues class Stack { constructor() { this.q1 = []; this.q2 = []; }

push(x) {

    // Push x first in isEmpty q2
    this.q2.push(x);
    // Push all the remaining
    // elements in q1 to q2.
    while (this.q1.length != 0) {
        this.q2.push(this.q1[0]);
        this.q1.shift();

    }

    // swap the names of two queues
    this.q = this.q1;
    this.q1 = this.q2;
    this.q2 = this.q;
}

pop() {
    // if no elements are there in q1
    if (this.q1.length == 0)
        return;
    this.q1.shift();
}

top() {
    if (this.q1.length == 0)
        return -1;
    return this.q1[0];
}

size() {
    console.log(this.q1.length);
}

isEmpty() {
    // return true if the queue is empty.
    return this.q1.length == 0;
}

front() {
    return this.q1[0];
}

}

// Driver code

let s = new Stack(); s.push(1); s.push(2); s.push(3);

console.log("current size: "); s.size(); console.log(s.top()); s.pop(); console.log(s.top()); s.pop(); console.log(s.top());

console.log("current size: "); s.size();

// This code is contributed by adityamaharshi21

`

Output

current size: 3 3 2 1 current size: 1

**Time Complexity:

**Auxiliary Space: O(n), As we use two queues for the implementation of a Stack.

**By making pop() operation costly - Push in O(1) and Pop() in O(n)

The new element is always enqueued to **q1. In **pop() operation, if **q2 is empty then all the elements except the last, are moved to **q2. Finally, the last element is dequeued from **q1 and returned.

Follow the below steps to implement the **push(s, x) operation:

Follow the below steps to implement the **pop(s) operation:

// Program to implement a stack // using two queue #include <bits/stdc++.h> using namespace std;

class Stack { queue q1, q2;

public: void pop() { if (q1.empty()) return;

    // Leave one element in q1 and
    // push others in q2.
    while (q1.size() != 1) {
        q2.push(q1.front());
        q1.pop();
    }

    // Pop the only left element
    // from q1
    q1.pop();

    // swap the names of two queues
    swap(q1, q2);
}

void push(int x) { q1.push(x); }

int top()
{
    if (q1.empty())
        return -1;

    while (q1.size() != 1) {
        q2.push(q1.front());
        q1.pop();
    }

    // last pushed element
    int temp = q1.front();

    // to empty the auxiliary queue after
    // last operation
    q1.pop();

    // push last element to q2
    q2.push(temp);

    // swap the two queues names
    queue<int> q = q1;
    q1 = q2;
    q2 = q;
    return temp;
}

int size() { return q1.size(); }

};

// Driver code int main() { Stack s; s.push(1); s.push(2); s.push(3);

cout << "current size: " << s.size() << endl;
cout << s.top() << endl;
s.pop();
cout << s.top() << endl;
s.pop();
cout << s.top() << endl;
cout << "current size: " << s.size() << endl;
return 0;

}

Java

/* Java Program to implement a stack using two queue / import java.util.;

class Stack { Queue q1 = new LinkedList<>(), q2 = new LinkedList<>();

void remove()
{
    if (q1.isEmpty())
        return;

    // Leave one element in q1 and
    // push others in q2.
    while (q1.size() != 1) {
        q2.add(q1.peek());
        q1.remove();
    }

    // Pop the only left element
    // from q1
    q1.remove();

    // swap the names of two queues
    Queue<Integer> q = q1;
    q1 = q2;
    q2 = q;
}

void add(int x) { q1.add(x); }

int top()
{
    if (q1.isEmpty())
        return -1;

    while (q1.size() != 1) {
        q2.add(q1.peek());
        q1.remove();
    }

    // last pushed element
    int temp = q1.peek();

    // to empty the auxiliary queue after
    // last operation
    q1.remove();

    // push last element to q2
    q2.add(temp);

    // swap the two queues names
    Queue<Integer> q = q1;
    q1 = q2;
    q2 = q;
    return temp;
}

int size() { return q1.size(); }

// Driver code
public static void main(String[] args)
{
    Stack s = new Stack();
    s.add(1);
    s.add(2);
    s.add(3);

    System.out.println("current size: " + s.size());
    System.out.println(s.top());
    s.remove();
    System.out.println(s.top());
    s.remove();
    System.out.println(s.top());
    System.out.println("current size: " + s.size());
}

}

// This code is contributed by Princi Singh

Python

Program to implement a stack using

two queue

from _collections import deque

class Stack:

def __init__(self):

    # Two inbuilt queues
    self.q1 = deque()
    self.q2 = deque()

def push(self, x):
    self.q1.append(x)

def pop(self):
    # if no elements are there in q1
    if (not self.q1):
        return
    # Leave one element in q1 and push others in q2
    while(len(self.q1) != 1):
        self.q2.append(self.q1.popleft())

    # swap the names of two queues
    self.q1, self.q2 = self.q2, self.q1

def top(self):
    # if no elements are there in q1
    if (not self.q1):
        return
    # Leave one element in q1 and push others in q2
    while(len(self.q1) != 1):
        self.q2.append(self.q1.popleft())

    # Pop the only left element from q1 to q2
    top = self.q1[0]
    self.q2.append(self.q1.popleft())

    # swap the names of two queues
    self.q1, self.q2 = self.q2, self.q1

    return top

def size(self):
    return len(self.q1)

Driver Code

if name == 'main': s = Stack() s.push(1) s.push(2) s.push(3)

print("current size: ", s.size())
print(s.top())
s.pop()
print(s.top())
s.pop()
print(s.top())

print("current size: ", s.size())

This code is contributed by jainlovely450

C#

using System; using System.Collections.Generic;

class Stack { Queue q1 = new Queue(); Queue q2 = new Queue();

void Remove() {
    if (q1.Count == 0)
        return;

    // Leave one element in q1 and
    // push others in q2.
    while (q1.Count != 1) {
        q2.Enqueue(q1.Dequeue());
    }

    // Pop the only left element
    // from q1
    q1.Dequeue();

    // swap the names of two queues
    Queue<int> temp = q1;
    q1 = q2;
    q2 = temp;
}

void Add(int x) { q1.Enqueue(x); }

int Top() {
    if (q1.Count == 0)
        return -1;

    while (q1.Count != 1) {
        q2.Enqueue(q1.Dequeue());
    }

    // last pushed element
    int temp = q1.Peek();

    // to empty the auxiliary queue after
    // last operation
    q1.Dequeue();

    // push last element to q2
    q2.Enqueue(temp);

    // swap the two queues names
    Queue<int> q = q1;
    q1 = q2;
    q2 = q;
    return temp;
}

int Size() { return q1.Count; }

// Driver code
public static void Main(string[] args) {
    Stack s = new Stack();
    s.Add(1);
    s.Add(2);
    s.Add(3);

    Console.WriteLine("current size: " + s.Size());
    Console.WriteLine(s.Top());
    s.Remove();
    Console.WriteLine(s.Top());
    s.Remove();
    Console.WriteLine(s.Top());
    Console.WriteLine("current size: " + s.Size());
}

}

JavaScript

/*Javascript Program to implement a stack using two queue */

// Two inbuilt queues class Stack { constructor() { this.q1 = []; this.q2 = []; }

pop()
{
    if (this.q1.length == 0)
        return;
    
    // Leave one element in q1 and
    // push others in q2.
    while (this.q1.length != 1){
        this.q2.push(this.q1[0]);
        this.q1.shift();
    }
    
    // Pop the only left element
    // from q1f
    this.q1.shift();
    
    // swap the names of two queues
    this.q = this.q1;
    this.q1 = this.q2;
    this.q2 = this.q;
}

push(x) {
    // if no elements are there in q1
    this.q1.push(x);
}

top() {
    if (this.q1.length == 0)
        return -1;
    
    while (this.q1.length != 1) {
        this.q2.push(this.q1[0]);
        this.q1.shift();
    }
    
    // last pushed element
    let temp = this.q1[0];
    
    // to empty the auxiliary queue after
    // last operation
    this.q1.shift();
    
    // push last element to q2
    this.q2.push(temp);
    
    // swap the two queues names
    this.q = this.q1;
    this.q1 = this.q2;
    this.q2 = this.q;
    return temp;
}

size() {
    console.log(this.q1.length);
}

isEmpty() {
    // return true if the queue is empty.
    return this.q1.length == 0;
}

front() {
    return this.q1[0];
}

}

// Driver code let s = new Stack(); s.push(1); s.push(2); s.push(3); console.log("current size: "); s.size(); console.log(s.top()); s.pop(); console.log(s.top()); s.pop(); console.log(s.top());

console.log("current size: "); s.size();

// This code is contributed by Susobhan Akhuli

`

Output

current size: 3 3 2 1 current size: 1

**Time Complexity:

**Auxiliary Space: O(n) since 2 queues are used.

**Using single queue and Recursion Stack

Using only one queue and make the queue act as a Stack in modified way of the above discussed approach.

Follow the below steps to implement the idea:

#include <bits/stdc++.h> using namespace std;

// Stack Class that acts as a queue class Stack {

queue<int> q;

public: void push(int data) { int s = q.size();

    // Push the current element
    q.push(data);

    // Pop all the previous elements and put them after
    // current element

    for (int i = 0; i < s; i++) {
        
        // Add the front element again
        q.push(q.front());

        // Delete front element
        q.pop();
    }
}
void pop()
{
    if (q.empty())
        cout << "No elements\n";
    else
        q.pop();
}
int top() { return (q.empty()) ? -1 : q.front(); }
int size() { return q.size(); }
bool empty() { return (q.empty()); }

};

int main() { Stack st; st.push(1); st.push(2); st.push(3); cout << "current size: " << st.size() << "\n"; cout << st.top() << "\n"; st.pop(); cout << st.top() << "\n"; st.pop(); cout << st.top() << "\n"; cout << "current size: " << st.size(); return 0; }

Java

import java.util.*;

class Stack { // One queue Queue q1 = new LinkedList();

void push(int x)
{
    //  Get previous size of queue
    int s = q1.size();

    // Push the current element
    q1.add(x);

    // Pop all the previous elements and put them after
    // current element
    for (int i = 0; i < s; i++) {
        q1.add(q1.remove());
    }
}

void pop()
{
    // if no elements are there in q1
    if (q1.isEmpty())
        return;
    q1.remove();
}

int top()
{
    if (q1.isEmpty())
        return -1;
    return q1.peek();
}

int size() { return q1.size(); }

// driver code
public static void main(String[] args)
{
    Stack s = new Stack();
    s.push(1);
    s.push(2);
    s.push(3);

    System.out.println("current size: " + s.size());
    System.out.println(s.top());
    s.pop();
    System.out.println(s.top());
    s.pop();
    System.out.println(s.top());

    System.out.println("current size: " + s.size());
}

}

// This code is contributed by Vishal Singh Shekhawat

Python

from _collections import deque

Stack Class that acts as a queue

class Stack: def init(self): self.q = deque()

# Push operation
def push(self, data):
    # Get previous size of queue
    s = len(self.q)

    # Push the current element
    self.q.append(data)

    # Pop all the previous elements and put them after
    # current element
    for i in range(s):
        self.q.append(self.q.popleft())

# Removes the top element
def pop(self):
    if (not self.q):
        print("No elements")
    else:
        self.q.popleft()

# Returns top of stack
def top(self):
    if (not self.q):
        return
    return self.q[0]

def size(self):
    return len(self.q)

if name == 'main': st = Stack() st.push(1) st.push(2) st.push(3) print("current size: ", st.size()) print(st.top()) st.pop() print(st.top()) st.pop() print(st.top()) print("current size: ", st.size())

C#

using System; using System.Collections;

class GfG {

public class Stack {

// One inbuilt queue
public Queue q = new Queue();

public void push(int x)
{
  // Get previous size of queue
  int s = q.Count;

  // Push the current element
  q.Enqueue(x);

  // Pop all the previous elements and put them
  // afte current element
  for (int i = 0; i < s; i++) {
    // Add the front element again
    q.Enqueue(q.Peek());

    // Delete front element
    q.Dequeue();
  }
}

// Removes the top element
public void pop()
{
  // if no elements are there in q
  if (q.Count == 0)
    Console.WriteLine("No elements");
  else
    q.Dequeue();
}

// Returns top of stack
public int top()
{
  if (q.Count == 0)
    return -1;
  return (int)q.Peek();
}

public int size() { return q.Count; }

};

// Driver code public static void Main(String[] args) { Stack st = new Stack(); st.push(1); st.push(2); st.push(3); Console.WriteLine("current size: " + st.size()); Console.WriteLine(st.top()); st.pop(); Console.WriteLine(st.top()); st.pop(); Console.WriteLine(st.top()); Console.WriteLine("current size: " + st.size()); } }

// This code is contributed by Susobhan Akhuli

JavaScript

// One inbuilt queue class Stack { constructor() { this.q = []; }

// Push operation
push(data) {
    
    //  Get previous size of queue
    let s = this.q.length;
    
    // Push the current element
    this.q.push(data);
    
    // Pop all the previous elements and put them after
    // current element
    for (let i = 0; i < s; i++) {
        // Add the front element again
        this.q.push(this.q[0]);
        
        // Delete front element
        this.q.shift();

    }
}

// Removes the top element
pop() {
    // if no elements are there in q1
    if (this.q.length == 0)
        console.log("No elements");
    else
        this.q.shift();
}

top() {
    if (this.q.length == 0)
        return -1;
    return this.q[0];
}

size() {
    console.log(this.q.length);
}

isEmpty() {
    // return true if the queue is empty.
    return this.q.length == 0;
}

front() {
    return this.q[0];
}

}

// Driver code

let st = new Stack(); st.push(1); st.push(2); st.push(3);

console.log("current size: "); st.size(); console.log(st.top()); st.pop(); console.log(st.top()); st.pop(); console.log(st.top());

console.log("current size: "); st.size();

// This code is contributed by Susobhan Akhuli

`

Output

current size: 3 3 2 1 current size: 1

**Time Complexity:

**Auxiliary Space: O(n) since 1 queue is used.