Bird
Raised Fist0
DSA Cprogramming~20 mins

Queue Using Two Stacks in DSA C - Practice Problems & Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Two Stacks Queue Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of enqueue and dequeue operations
What is the printed state of the queue after performing these operations using two stacks?

Operations:
enqueue(1), enqueue(2), dequeue(), enqueue(3), dequeue(), enqueue(4), dequeue()
DSA C
struct Stack {
    int arr[10];
    int top;
};

struct Queue {
    struct Stack s1, s2;
};

void push(struct Stack* s, int val) {
    s->arr[++s->top] = val;
}

int pop(struct Stack* s) {
    return s->arr[s->top--];
}

int isEmpty(struct Stack* s) {
    return s->top == -1;
}

void enqueue(struct Queue* q, int val) {
    push(&q->s1, val);
}

int dequeue(struct Queue* q) {
    if (isEmpty(&q->s2)) {
        while (!isEmpty(&q->s1)) {
            push(&q->s2, pop(&q->s1));
        }
    }
    return pop(&q->s2);
}

void printQueue(struct Queue* q) {
    // Print elements in s2 from top to bottom
    for (int i = q->s2.top; i >= 0; i--) {
        printf("%d -> ", q->s2.arr[i]);
    }
    // Print elements in s1 from bottom to top
    for (int i = 0; i <= q->s1.top; i++) {
        printf("%d -> ", q->s1.arr[i]);
    }
    printf("null\n");
}

int main() {
    struct Queue q = {{}, -1, {}, -1};
    enqueue(&q, 1);
    enqueue(&q, 2);
    dequeue(&q);
    enqueue(&q, 3);
    dequeue(&q);
    enqueue(&q, 4);
    dequeue(&q);
    printQueue(&q);
    return 0;
}
A3 -> 4 -> null
B4 -> null
C2 -> 3 -> 4 -> null
D1 -> 3 -> 4 -> null
Attempts:
2 left
💡 Hint
Remember dequeue moves elements from s1 to s2 only when s2 is empty.
🧠 Conceptual
intermediate
1:30remaining
Understanding the dequeue operation in two stacks queue
Why does the dequeue operation transfer elements from the first stack to the second stack only when the second stack is empty?
ATo reverse the order of elements so the oldest element is on top for dequeue
BTo save memory by not using the second stack unnecessarily
CTo sort the elements in ascending order before dequeue
DTo avoid pushing new elements during dequeue
Attempts:
2 left
💡 Hint
Think about how stacks work and the order of elements.
🔧 Debug
advanced
1:30remaining
Identify the error in this dequeue implementation
What error will this dequeue function cause when called on an empty queue?
DSA C
int dequeue(struct Queue* q) {
    if (isEmpty(&q->s2)) {
        while (!isEmpty(&q->s1)) {
            push(&q->s2, pop(&q->s1));
        }
    }
    return pop(&q->s2);
}
ARuntime error due to popping from empty stack
BSyntax error due to missing return statement
CLogical error returning wrong element
DNo error, works correctly
Attempts:
2 left
💡 Hint
What happens if both stacks are empty?
📝 Syntax
advanced
1:00remaining
Identify the syntax error in this enqueue function
Which option correctly fixes the syntax error in this enqueue function?
DSA C
void enqueue(struct Queue* q, int val) {
    push(&q->s1 val);
}
Apush(&q->s1.val);
Bpush(q->s1, val);
Cpush(&q->s1, val);
Dpush(q->s1.val);
Attempts:
2 left
💡 Hint
Check the syntax of function arguments and pointer usage.
🚀 Application
expert
1:30remaining
Calculate the number of elements after mixed operations
Given an initially empty queue implemented with two stacks, after performing these operations:
enqueue(5), enqueue(10), dequeue(), enqueue(15), enqueue(20), dequeue(), dequeue(), enqueue(25)
How many elements remain in the queue?
A1
B4
C3
D2
Attempts:
2 left
💡 Hint
Track each operation step-by-step and count remaining elements.

Practice

(1/5)
1. What is the main idea behind implementing a Queue Using Two Stacks?
easy
A. Use two stacks to store elements in sorted order
B. Use two stacks to reverse the order twice to maintain queue order
C. Use one stack for enqueue and another for dequeue operations
D. Use two stacks to perform only enqueue operations

Solution

  1. Step 1: Understand queue order

    A queue follows FIFO (First In First Out) order, meaning the first element added is the first to be removed.
  2. Step 2: Use two stacks to reverse order twice

    One stack reverses the order when pushing elements, and the second stack reverses it again when popping, restoring FIFO order.
  3. Final Answer:

    Use two stacks to reverse the order twice to maintain queue order -> Option B
  4. Quick Check:

    Two reversals keep FIFO order [OK]
Hint: Two stacks reverse order twice to simulate queue [OK]
Common Mistakes:
  • Thinking both stacks store elements in sorted order
  • Using stacks only for enqueue or dequeue, not both
  • Confusing stack order with queue order
2. Which of the following is the correct syntax to push an element x onto a stack named stack1 in C?
easy
A. push(stack1, x);
B. stack1.push(x); // C syntax
C. stack1.push(x);
D. push(x, stack1);

Solution

  1. Step 1: Recall stack push function in C

    In C, stacks are usually implemented with functions like push(stack, element).
  2. Step 2: Identify correct argument order

    The stack is passed first, then the element to push, so push(stack1, x) is correct.
  3. Final Answer:

    push(stack1, x); -> Option A
  4. Quick Check:

    Function call with stack first, element second [OK]
Hint: In C, push(stack, element) is standard [OK]
Common Mistakes:
  • Using object.method() syntax which is not valid in C
  • Swapping argument order in push function
  • Assuming push is a built-in method
3. Consider the following code snippet implementing a queue using two stacks s1 and s2. What will be the output after the operations?
push(s1, 10);
push(s1, 20);
pop(s2);
if (isEmpty(s2)) {
  while (!isEmpty(s1)) {
    push(s2, top(s1));
pop(s1);
  }
}
pop(s2);
printQueue(s1, s2);
medium
A. Queue elements: 10 -> null
B. Queue elements: null
C. Queue elements: 20 -> null
D. Queue elements: 10 -> 20 -> null

Solution

  1. Step 1: Push 10 and 20 onto s1

    s1 = [10 (bottom), 20 (top)], s2 = []
  2. Step 2: Pop from s2 (empty), then transfer all from s1 to s2

    Transfer reverses order: s2 = [20 (bottom), 10 (top)], s1 = []
  3. Step 3: Pop from s2 removes 10 (top)

    s2 = [20]
  4. Step 4: printQueue shows elements in queue order

    Queue order is s2 top to bottom then s1 bottom to top, so only 20 remains.
  5. Final Answer:

    Queue elements: 20 -> null -> Option C
  6. Quick Check:

    First popped element was 10, next is 20 [OK]
Hint: Transfer reverses stack order to simulate queue dequeue [OK]
Common Mistakes:
  • Not transferring elements from s1 to s2 when s2 is empty
  • Confusing top and bottom elements during transfer
  • Assuming pop removes from s1 directly
4. The following code attempts to implement dequeue operation in a queue using two stacks s1 and s2. What is the bug?
int dequeue() {
  if (isEmpty(s2)) {
    while (!isEmpty(s1)) {
      push(s2, top(s1));
      pop(s1);
    }
  }
  return pop(s2);
}
medium
A. Missing check if both stacks are empty before dequeue
B. pop(s2) returns void, should use top(s2) before pop
C. Should push from s2 to s1 instead of s1 to s2
D. pop(s1) should be called after push(s2, top(s1))

Solution

  1. Step 1: Check for empty queue condition

    The code does not check if both s1 and s2 are empty before dequeue, which can cause errors.
  2. Step 2: Identify missing empty check

    Without this check, pop(s2) may be called on empty stack causing runtime error.
  3. Final Answer:

    Missing check if both stacks are empty before dequeue -> Option A
  4. Quick Check:

    Empty queue must be handled before popping [OK]
Hint: Always check if queue is empty before dequeue [OK]
Common Mistakes:
  • Assuming pop returns the popped value in C without checking
  • Ignoring empty queue condition
  • Confusing push direction between stacks
5. You want to implement a queue using two stacks s1 and s2. You perform the following operations:
enqueue(1);
enqueue(2);
dequeue();
enqueue(3);
dequeue();
dequeue();

What will be the output sequence of the dequeued elements?
hard
A. [3, 2, 1]
B. [1, 3, 2]
C. [2, 1, 3]
D. [1, 2, 3]

Solution

  1. Step 1: Enqueue 1 and 2

    s1 = [1 (bottom), 2 (top)], s2 = []
  2. Step 2: Dequeue first element

    s2 empty, transfer all from s1 to s2: s2 = [2 (bottom), 1 (top)], s1 = []
    Pop from s2 removes 1
  3. Step 3: Enqueue 3

    Push 3 to s1: s1 = [3], s2 = [2]
  4. Step 4: Dequeue second element

    s2 not empty, pop from s2 removes 2
  5. Step 5: Dequeue third element

    s2 empty, transfer s1 to s2: s2 = [3], s1 = []
    Pop from s2 removes 3
  6. Final Answer:

    [1, 2, 3] -> Option D
  7. Quick Check:

    FIFO order maintained by two stacks [OK]
Hint: Dequeue triggers transfer only if second stack empty [OK]
Common Mistakes:
  • Not transferring elements when s2 is empty
  • Assuming enqueue adds to s2 instead of s1
  • Mixing order of popped elements
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