Implement Stack Using Queue in DSA C - Time & Space Complexity
We want to understand how the time taken changes when we use a queue to build a stack.
Specifically, how the operations like push and pop grow as we add more items.
Analyze the time complexity of the following code snippet.
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
int queue[MAX];
int front = 0, rear = 0;
void enqueue(int x) {
queue[rear++] = x;
}
int dequeue() {
return queue[front++];
}
void push(int x) {
int size = rear - front;
enqueue(x);
for (int i = 0; i < size; i++) {
enqueue(dequeue());
}
}
int pop() {
if (front == rear) return -1; // empty
return dequeue();
}
int main() {
push(1);
push(2);
push(3);
printf("%d ", pop());
printf("%d ", pop());
return 0;
}
This code uses one queue to simulate a stack by rearranging elements on each push.
- Primary operation: The for-loop inside the push function that moves existing elements.
- How many times: It runs once for each element already in the queue before adding the new one.
Each push moves all existing elements to keep the newest element at the front.
| Input Size (n) | Approx. Operations in push |
|---|---|
| 10 | About 10 moves |
| 100 | About 100 moves |
| 1000 | About 1000 moves |
Pattern observation: The number of moves grows linearly with the number of elements.
Time Complexity: O(n)
This means pushing an element takes time proportional to how many elements are already in the stack.
[X] Wrong: "Push operation is always O(1) because we just add one element."
[OK] Correct: Here, push rearranges all existing elements, so it takes longer as the stack grows.
Understanding how to build one data structure using another shows your problem-solving skills and helps you think about efficiency.
"What if we used two queues instead of one? How would that change the time complexity of push and pop?"
Practice
Solution
Step 1: Understand stack and queue differences
A stack follows Last-In-First-Out (LIFO), while a queue follows First-In-First-Out (FIFO).Step 2: Simulate stack using queue(s)
By using one or two queues cleverly, we can reorder elements to behave like a stack for push and pop operations.Final Answer:
Use one or two queues to simulate stack operations like push and pop -> Option AQuick Check:
Stack via queue = simulate push/pop with queues [OK]
- Confusing stack and queue order
- Trying to sort elements instead of simulating stack
- Using stack to implement queue instead
Solution
Step 1: Check C standard library support
C language does not have a built-in queue data structure in its standard library.Step 2: Understand queue implementation in C
Queues must be implemented manually using arrays or linked lists in C.Final Answer:
No standard queue in C; must implement manually -> Option DQuick Check:
C lacks built-in queue; manual implementation needed [OK]
- Assuming C has STL-like queue
- Using C++ syntax in C code
- Including non-existent headers
void push(int x) {
q.push(x);
int size = q.size();
for (int i = 0; i < size - 1; i++) {
int val = q.front();
q.pop();
q.push(val);
}
}
What will be the order of elements in the queue after pushing 1, then 2, then 3?Solution
Step 1: Push 1
Queue after push: [1]Step 2: Push 2
Push 2: queue becomes [1,2], then rotate first element: pop 1, push 1 -> queue is [2,1]Step 3: Push 3
Push 3: queue is [2,1,3], rotate first two elements: pop 2 push 2, pop 1 push 1 -> queue is [3,2,1]Final Answer:
3 -> 2 -> 1 -> null -> Option AQuick Check:
Newest element at front after push = 3 -> 2 -> 1 [OK]
- Not rotating queue after push
- Assuming queue order is same as push order
- Confusing front and back of queue
int pop() {
if (q1.empty()) return -1;
while (q1.size() > 1) {
q2.push(q1.front());
q1.pop();
}
int top = q1.front();
q1.pop();
swap(q1, q2);
return top;
}Solution
Step 1: Analyze pop logic
Elements except last are moved from q1 to q2, last element is popped from q1.Step 2: Swap queues
Swapping q1 and q2 makes q1 the queue with remaining elements for next operations.Final Answer:
No error; the code correctly implements pop -> Option CQuick Check:
Pop moves all but last, returns last, swaps queues [OK]
- Swapping queues too early
- Not checking empty queue before pop
- Forgetting to swap queues after pop
pop() operation is O(1) time complexity, and push() is O(n)?Solution
Step 1: Understand push costly approach
Push inserts element into empty q2, moves all q1 elements to q2, then swaps q1 and q2. This makes newest element front in q1.Step 2: Pop becomes O(1)
Pop just dequeues from q1 front, which is the top of stack, so pop is O(1).Final Answer:
Make push costly by pushing element to empty q2, then moving all from q1 to q2, swap q1 and q2 -> Option BQuick Check:
Push costly + pop O(1) = push rearranges queues [OK]
- Confusing which operation is costly
- Using single queue for O(1) pop incorrectly
- Choosing two stacks instead of queues
Ready to prove it?
Pass the test and this pattern moves unknown
