Bird
Raised Fist0
DSA Rustprogramming~10 mins

Queue Using Two Stacks in DSA Rust - Interactive Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to push an element into the queue using the first stack.

DSA Rust
fn enqueue(&mut self, value: i32) {
    self.stack_in.[1](value);
}
Drag options to blanks, or click blank then click option'
Apush
Bremove
Cpeek
Dpop
Attempts:
3 left
💡 Hint
Common Mistakes
Using pop instead of push will remove elements instead of adding.
Using peek does not modify the stack.
2fill in blank
medium

Complete the code to check if the queue is empty by checking both stacks.

DSA Rust
fn is_empty(&self) -> bool {
    self.stack_in.is_empty() && self.stack_out.[1]()
}
Drag options to blanks, or click blank then click option'
Alen
Bpop
Cpeek
Dis_empty
Attempts:
3 left
💡 Hint
Common Mistakes
Using len instead of is_empty returns a number, not a boolean.
Checking only one stack misses elements in the other.
3fill in blank
hard

Fix the error in the dequeue method to correctly move elements from stack_in to stack_out.

DSA Rust
fn dequeue(&mut self) -> Option<i32> {
    if self.stack_out.is_empty() {
        while let Some(value) = self.stack_in.[1]() {
            self.stack_out.push(value);
        }
    }
    self.stack_out.pop()
}
Drag options to blanks, or click blank then click option'
Apop
Bis_empty
Cpeek
Dpush
Attempts:
3 left
💡 Hint
Common Mistakes
Using push on stack_in instead of pop causes infinite loop.
Using peek does not remove elements, so loop never ends.
4fill in blank
hard

Fill both blanks to implement the peek method that returns the front element without removing it.

DSA Rust
fn peek(&mut self) -> Option<&i32> {
    if self.stack_out.[1]() {
        while let Some(value) = self.stack_in.[2]() {
            self.stack_out.push(value);
        }
    }
    self.stack_out.last()
}
Drag options to blanks, or click blank then click option'
Ais_empty
Bpop
Cpush
Dpeek
Attempts:
3 left
💡 Hint
Common Mistakes
Using push instead of pop on stack_in causes errors.
Not checking if stack_out is empty leads to wrong peek.
5fill in blank
hard

Fill all three blanks to implement the clear method that empties both stacks.

DSA Rust
fn clear(&mut self) {
    self.stack_in.[1]();
    self.stack_out.[2]();
    self.stack_in = Vec::new();
    self.stack_out = Vec::new();
    println!("Queue cleared: stack_in length = {}, stack_out length = {}", self.stack_in.[3](), self.stack_out.len());
}
Drag options to blanks, or click blank then click option'
Aclear
Bpop
Clen
Dis_empty
Attempts:
3 left
💡 Hint
Common Mistakes
Using pop repeatedly instead of clear is inefficient.
Using is_empty instead of len in println shows boolean, not count.

Practice

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

Solution

  1. Step 1: Understand queue order

    A queue follows First-In-First-Out (FIFO) order, meaning the first element added is the first 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 back when popping, preserving FIFO.
  3. Final Answer:

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

    Two stacks reverse order twice = queue 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
  • Confusing stack order with queue order
2. Which of the following Rust code snippets correctly declares two stacks for implementing a queue?
easy
A. let mut stack1: Vec<i32> = Vec::new(); let mut stack2: Vec<i32> = Vec::new();
B. let stack1 = Vec<i32>; let stack2 = Vec<i32>;
C. let mut stack1 = Vec::new<i32>(); let mut stack2 = Vec::new<i32>();
D. let stack1: Vec = Vec::new(); let stack2: Vec = Vec::new();

Solution

  1. Step 1: Check correct Vec declaration syntax in Rust

    In Rust, to declare a mutable vector of i32, use: let mut stack: Vec<i32> = Vec::new();
  2. Step 2: Compare options with correct syntax

    let mut stack1: Vec<i32> = Vec::new(); let mut stack2: Vec<i32> = Vec::new(); matches the correct syntax exactly; others have syntax errors or missing mutability.
  3. Final Answer:

    let mut stack1: Vec<i32> = Vec::new(); let mut stack2: Vec<i32> = Vec::new(); -> Option A
  4. Quick Check:

    Correct Rust Vec declaration = let mut stack1: Vec<i32> = Vec::new(); let mut stack2: Vec<i32> = Vec::new(); [OK]
Hint: Use let mut stack: Vec<i32> = Vec::new() for mutable stacks [OK]
Common Mistakes:
  • Omitting mut keyword for mutable vectors
  • Incorrect generic syntax like Vec<i32> without parentheses
  • Using Vec::new<i32>() which is invalid
3. What will be the output of the following Rust code implementing a queue using two stacks?
struct Queue {
    stack1: Vec<i32>,
    stack2: Vec<i32>,
}

impl Queue {
    fn new() -> Self {
        Queue { stack1: Vec::new(), stack2: Vec::new() }
    }

    fn enqueue(&mut self, val: i32) {
        self.stack1.push(val);
    }

    fn dequeue(&mut self) -> Option<i32> {
        if self.stack2.is_empty() {
            while let Some(x) = self.stack1.pop() {
                self.stack2.push(x);
            }
        }
        self.stack2.pop()
    }
}

fn main() {
    let mut q = Queue::new();
    q.enqueue(10);
    q.enqueue(20);
    q.enqueue(30);
    println!("{:?}", q.dequeue());
    println!("{:?}", q.dequeue());
    q.enqueue(40);
    println!("{:?}", q.dequeue());
    println!("{:?}", q.dequeue());
}
medium
A. Some(10) Some(20) Some(30) Some(40)
B. Some(30) Some(20) Some(10) Some(40)
C. Some(10) Some(20) Some(40) None
D. None None None None

Solution

  1. Step 1: Trace enqueue operations

    Enqueue 10, 20, 30 pushes these onto stack1 in order: [10, 20, 30]
  2. Step 2: Trace dequeue operations

    First dequeue: stack2 empty, pop all from stack1 to stack2: stack2 = [30, 20, 10]. Pop from stack2 returns 10.
    Second dequeue: pop from stack2 returns 20.
    Enqueue 40: push 40 to stack1.
    Third dequeue: pop from stack2 returns 30.
    Fourth dequeue: stack2 empty, move 40 from stack1 to stack2, pop returns 40.
  3. Final Answer:

    Some(10) Some(20) Some(30) Some(40) -> Option A
  4. Quick Check:

    Queue order preserved by two stacks = Some(10) Some(20) Some(30) Some(40) [OK]
Hint: Dequeue empties stack2 by reversing stack1 first [OK]
Common Mistakes:
  • Assuming stack2 pops in same order as stack1
  • Not moving elements from stack1 to stack2 when stack2 is empty
  • Confusing order of elements after transfer
4. Identify the bug in this Rust code snippet for dequeue operation in a queue using two stacks:
fn dequeue(&mut self) -> Option<i32> {
    while let Some(x) = self.stack1.pop() {
        self.stack2.push(x);
    }
    self.stack2.pop()
}
medium
A. It uses pop() on stack1 instead of peek()
B. It moves elements from stack1 to stack2 every time, even if stack2 is not empty
C. It does not pop from stack2 after moving elements
D. It returns None always because stack2 is never filled

Solution

  1. Step 1: Analyze the dequeue logic

    The code moves all elements from stack1 to stack2 every dequeue call, regardless of stack2's state.
  2. Step 2: Identify correct behavior

    To maintain queue order efficiently, elements should be moved only if stack2 is empty. Otherwise, stack2's elements should be popped directly.
  3. Final Answer:

    It moves elements from stack1 to stack2 every time, even if stack2 is not empty -> Option B
  4. Quick Check:

    Move only if stack2 empty = It moves elements from stack1 to stack2 every time, even if stack2 is not empty [OK]
Hint: Move elements only if stack2 is empty during dequeue [OK]
Common Mistakes:
  • Moving elements every dequeue wastes time
  • Ignoring stack2's current elements
  • Not popping from stack2 after transfer
5. You want to implement a peek function for the queue using two stacks in Rust that returns the front element without removing it. Which approach correctly achieves this?
hard
A. Return the first element of stack1 without any stack transfers
B. Return the last element of stack1 directly without moving elements
C. If stack2 is empty, move all elements from stack1 to stack2, then return the last element of stack2 without popping
D. Pop an element from stack2 and push it back immediately to peek

Solution

  1. Step 1: Understand peek operation in queue using two stacks

    Peek should return the front element without removing it. The front is at the bottom of stack1 or top of stack2 after transfer.
  2. Step 2: Correct approach for peek

    If stack2 is empty, move all elements from stack1 to stack2 to reverse order. Then peek the last element of stack2 (top) without popping.
  3. Final Answer:

    If stack2 is empty, move all elements from stack1 to stack2, then return the last element of stack2 without popping -> Option C
  4. Quick Check:

    Peek uses stack2 top after transfer if empty = If stack2 is empty, move all elements from stack1 to stack2, then return the last element of stack2 without popping [OK]
Hint: Peek top of stack2 after transfer if empty [OK]
Common Mistakes:
  • Peeking stack1 directly ignores queue order
  • Popping to peek then pushing back wastes time
  • Ignoring stack2 state before peeking
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