Bird
Raised Fist0
DSA C++programming

Implement Stack Using Queue in DSA C++

Choose your learning style10 modes available
Mental Model
A stack works like a pile where the last item added is the first removed. We can use a queue, which normally removes the first item added, to act like a stack by rearranging the order after each addition.
Analogy: Imagine a line of people (queue) where normally the first person in line is served first. To behave like a stack, after a new person joins at the end, we rotate the line so that this new person moves to the front, making them served first.
Queue before push:
front -> [1] -> [2] -> [3] -> null

After pushing 4 and rotating:
front -> [4] -> [1] -> [2] -> [3] -> null
Dry Run Walkthrough
Input: Push 1, Push 2, Push 3, Pop, Push 4, Pop
Goal: Use a single queue to behave like a stack and show the state after each operation
Step 1: Push 1: enqueue 1, then rotate queue to put 1 at front
front -> [1] -> null
Why: First element is just added, no rotation needed
Step 2: Push 2: enqueue 2, then rotate queue to put 2 at front
front -> [2] -> [1] -> null
Why: Rotate to move newly added 2 to front to simulate stack top
Step 3: Push 3: enqueue 3, then rotate queue to put 3 at front
front -> [3] -> [2] -> [1] -> null
Why: Rotate to move newly added 3 to front to simulate stack top
Step 4: Pop: dequeue front element (3)
front -> [2] -> [1] -> null
Why: Pop removes the top element, which is at front after rotation
Step 5: Push 4: enqueue 4, then rotate queue to put 4 at front
front -> [4] -> [2] -> [1] -> null
Why: Rotate to move newly added 4 to front to simulate stack top
Step 6: Pop: dequeue front element (4)
front -> [2] -> [1] -> null
Why: Pop removes the top element, which is at front after rotation
Result:
front -> [2] -> [1] -> null
Popped elements: 3, 4
Annotated Code
DSA C++
#include <iostream>
#include <queue>
using namespace std;

class StackUsingQueue {
private:
    queue<int> q;

public:
    void push(int x) {
        q.push(x); // add new element at end
        int sz = q.size();
        // rotate queue to move new element to front
        for (int i = 0; i < sz - 1; i++) {
            int val = q.front();
            q.pop();
            q.push(val);
        }
    }

    int pop() {
        if (q.empty()) return -1; // stack empty
        int val = q.front();
        q.pop();
        return val;
    }

    bool empty() {
        return q.empty();
    }

    void print() {
        queue<int> temp = q;
        cout << "Stack from top to bottom: ";
        while (!temp.empty()) {
            cout << temp.front() << " ";
            temp.pop();
        }
        cout << "\n";
    }
};

int main() {
    StackUsingQueue s;
    s.push(1);
    s.push(2);
    s.push(3);
    cout << s.pop() << "\n"; // should print 3
    s.push(4);
    cout << s.pop() << "\n"; // should print 4
    s.print(); // should print 2 1
    return 0;
}
q.push(x); // add new element at end
enqueue new element to queue
for (int i = 0; i < sz - 1; i++) { int val = q.front(); q.pop(); q.push(val); }
rotate queue to move new element to front simulating stack top
int val = q.front(); q.pop(); return val;
pop front element which is stack top
OutputSuccess
3 4 Stack from top to bottom: 2 1
Complexity Analysis
Time: O(n) for push because we rotate all elements to move new element to front; O(1) for pop
Space: O(n) because we store all elements in the queue
vs Alternative: Compared to using two queues, this single queue approach uses less space but push is costlier due to rotation
Edge Cases
Pop from empty stack
Returns -1 indicating stack is empty
DSA C++
if (q.empty()) return -1; // stack empty
Push single element
Element is added and becomes top immediately without rotation needed
DSA C++
for (int i = 0; i < sz - 1; i++) { ... }
When to Use This Pattern
When you need to implement a stack but only have a queue available, use rotation after each push to simulate stack behavior.
Common Mistakes
Mistake: Not rotating the queue after push, so the order remains FIFO instead of LIFO
Fix: Rotate the queue by dequeuing and enqueuing all elements except the newly added one
Summary
Implements a stack using a single queue by rotating elements after each push.
Use when only queue data structure is available but stack behavior is needed.
The key is to rotate the queue so the newest element is always at the front, simulating stack top.

Practice

(1/5)
1. What is the main idea behind implementing a stack using a queue?
easy
A. Use two stacks to simulate a queue
B. Use a linked list to implement both stack and queue
C. Use one queue and reorder elements to simulate stack behavior
D. Use recursion to reverse the queue elements

Solution

  1. Step 1: Understand stack and queue behavior

    A stack follows Last-In-First-Out (LIFO), while a queue follows First-In-First-Out (FIFO).
  2. Step 2: Simulate stack using queue

    By reordering elements in a single queue after each push, the newest element is always at the front, simulating stack pop behavior.
  3. Final Answer:

    Use one queue and reorder elements to simulate stack behavior -> Option C
  4. Quick Check:

    Stack via queue = reorder elements [OK]
Hint: Rearrange queue after push to mimic stack top [OK]
Common Mistakes:
  • Confusing stack with queue behavior
  • Using two stacks instead of queues
  • Not reordering queue after push
2. Which of the following is the correct syntax to declare a queue of integers in C++ STL?
easy
A. queue q<int>;
B. queue<int> q;
C. queue<int> q()
D. queue<int> q[];

Solution

  1. Step 1: Recall C++ STL queue declaration

    The correct syntax uses template syntax: queue<int> q; declares a queue of integers.
  2. Step 2: Check syntax correctness

    queue<int> q; matches the correct syntax; others have syntax errors or invalid declarations.
  3. Final Answer:

    queue<int> q; -> Option B
  4. Quick Check:

    Correct STL queue syntax = queue<int> q; [OK]
Hint: Use template syntax queue<int> q; for integer queue [OK]
Common Mistakes:
  • Misplacing template brackets
  • Using parentheses instead of semicolon
  • Declaring queue as array
3. What will be the output of the following code snippet implementing stack using one queue?
class Stack {
  queue<int> q;
public:
  void push(int x) {
    q.push(x);
    int n = q.size();
    for (int i = 0; i < n - 1; i++) {
      q.push(q.front());
      q.pop();
    }
  }
  int pop() {
    int val = q.front();
    q.pop();
    return val;
  }
};

int main() {
  Stack s;
  s.push(10);
  s.push(20);
  s.push(30);
  cout << s.pop() << " ";
  s.push(40);
  cout << s.pop() << " ";
  cout << s.pop() << " ";
  return 0;
}
medium
A. 30 40 20
B. 10 20 30
C. 30 20 10
D. 20 30 40

Solution

  1. Step 1: Trace push operations

    Push 10: queue = [10]
    Push 20: queue = [20, 10] after rotation
    Push 30: queue = [30, 20, 10] after rotation
  2. Step 2: Trace pop and push

    Pop: returns 30, queue = [20, 10]
    Push 40: queue = [40, 20, 10]
    Pop: returns 40, queue = [20, 10]
    Pop: returns 20, queue = [10]
  3. Final Answer:

    30 40 20 -> Option A
  4. Quick Check:

    Stack pop order = 30, 40, 20 [OK]
Hint: After push, rotate queue to front for stack order [OK]
Common Mistakes:
  • Not rotating queue after push
  • Confusing queue front with stack top
  • Incorrect pop order
4. Identify the error in the following stack implementation using two queues:
class Stack {
  queue<int> q1, q2;
public:
  void push(int x) {
    q1.push(x);
  }
  int pop() {
    if (q1.empty()) return -1;
    while (q1.size() > 1) {
      q2.push(q1.front());
      q1.pop();
    }
    int val = q1.front();
    q1.pop();
    swap(q1, q2);
    return val;
  }
};
medium
A. Pop operation does not handle empty stack correctly
B. Push operation should push to q2 instead of q1
C. Swap should be done before popping from q1
D. Pop operation is correct; no error

Solution

  1. Step 1: Analyze pop operation logic

    Pop moves all but last element from q1 to q2, then pops last element from q1, then swaps q1 and q2.
  2. Step 2: Check correctness of push and pop

    Push adds to q1; pop removes last pushed element correctly by transferring elements and swapping queues.
  3. Final Answer:

    Pop operation is correct; no error -> Option D
  4. Quick Check:

    Two-queue stack pop logic = correct [OK]
Hint: Pop moves elements and swaps queues to simulate stack pop [OK]
Common Mistakes:
  • Swapping queues too early
  • Pushing to wrong queue
  • Not checking empty queue before pop
5. You want to implement a stack using a single queue but optimize the pop operation to O(1) time. Which approach is best?
hard
A. Push elements by enqueueing and dequeueing all elements except the new one
B. Use a queue and a stack together for hybrid implementation
C. Use two queues to separate push and pop operations
D. Push elements normally and rotate queue on each pop

Solution

  1. Step 1: Understand time complexity trade-offs

    Push elements normally and rotate queue on each pop (push normally, rotate on pop) makes push O(1), pop O(n). Use a queue and a stack together for hybrid implementation is not pure queue. Use two queues to separate push and pop operations uses two queues, not single queue.
  2. Step 2: Optimize pop to O(1) with single queue

    Enqueue new element, then dequeue and enqueue all previous elements to move new element to front. This makes pop O(1) as front is always top (matches Push elements by enqueueing and dequeueing all elements except the new one).
  3. Final Answer:

    Push elements by enqueueing and dequeueing all elements except the new one -> Option A
  4. Quick Check:

    Rotate queue after push for O(1) pop [OK]
Hint: Rotate queue after push to keep top at front [OK]
Common Mistakes:
  • Trying to optimize pop without reordering queue
  • Using two queues instead of one
  • Mixing stack and queue data structures
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard