📖 Scenario: You are managing a line of customers waiting for service. Sometimes customers leave from the front or the back of the line. You want to keep track of the line using a double-ended queue (deque) so you can add or remove customers from both ends easily.
🎯 Goal: Build a Rust program that creates a deque with some customers, removes one customer from the front, removes one customer from the back, and then shows the remaining customers in the line.
📋 What You'll Learn
Create a deque with the exact customers: "Alice", "Bob", "Charlie", "Diana", "Ethan"
Create a variable called line to hold the deque
Remove one customer from the front of the deque using pop_front()
Remove one customer from the back of the deque using pop_back()
Print the remaining customers in the deque separated by ->
💡 Why This Matters
🌍 Real World
Deques are useful in real-world situations like managing lines, undo-redo stacks, or sliding window problems where you need to add or remove items from both ends efficiently.
💼 Career
Understanding deque operations is important for software developers working on performance-critical applications, game development, or systems programming where efficient data structure manipulation is required.
Progress0 / 4 steps
1
Create the initial deque
Create a variable called line that is a VecDeque containing these exact customers in order: "Alice", "Bob", "Charlie", "Diana", "Ethan".
DSA Rust
Hint
Use VecDeque::from with a vec! of the exact customer names.
2
Remove one customer from the front
Use pop_front() on the line deque to remove one customer from the front. Store the removed customer in a variable called front_customer.
DSA Rust
Hint
Call pop_front() on line and assign it to front_customer.
3
Remove one customer from the back
Use pop_back() on the line deque to remove one customer from the back. Store the removed customer in a variable called back_customer.
DSA Rust
Hint
Call pop_back() on line and assign it to back_customer.
4
Print the remaining customers
Print the remaining customers in line separated by -> . Use println! with join on an iterator of line.
DSA Rust
Hint
Use line.iter() to get an iterator, then cloned() to copy the &str, collect into a Vec<&str>, then join(" -> ") to make a string.
Practice
(1/5)
1. What does the pop_front() operation do in a dequeue?
easy
A. Removes and returns the element at the front of the dequeue
B. Removes and returns the element at the back of the dequeue
C. Adds an element to the front of the dequeue
D. Adds an element to the back of the dequeue
Solution
Step 1: Understand pop_front() operation
The pop_front() removes the first element from the front of the dequeue.
Step 2: Compare with other operations
Unlike pop_back() which removes from the back, pop_front() targets the front element.
Final Answer:
Removes and returns the element at the front of the dequeue -> Option A
Quick Check:
pop_front() = remove front element [OK]
Hint: pop_front() always removes from the front [OK]
Common Mistakes:
Confusing pop_front() with pop_back()
Thinking pop_front() adds elements
Mixing push and pop operations
2. Which of the following is the correct Rust syntax to remove an element from the back of a VecDeque named dq?
easy
A. dq.pop_front();
B. dq.pop_back();
C. dq.remove_back();
D. dq.pop();
Solution
Step 1: Identify VecDeque method for back removal
The correct method to remove from the back is pop_back().
Step 2: Check other options
pop_front() removes from front, remove_back() and pop() are invalid methods for VecDeque.
Final Answer:
dq.pop_back(); -> Option B
Quick Check:
pop_back() removes back element [OK]
Hint: Use pop_back() to remove from back in VecDeque [OK]
Common Mistakes:
Using pop() which is for Vec, not VecDeque
Using remove_back() which does not exist
Confusing pop_front() with pop_back()
3. What is the output of the following Rust code?
use std::collections::VecDeque;
fn main() {
let mut dq = VecDeque::new();
dq.push_back(10);
dq.push_back(20);
dq.push_front(5);
dq.pop_back();
dq.push_front(1);
println!("{:?}", dq);
}
medium
A. [5, 10, 20]
B. [1, 10, 20]
C. [10, 20, 1]
D. [1, 5, 10]
Solution
Step 1: Trace push_back and push_front calls
After push_back(10) and push_back(20), dq = [10, 20]. Then push_front(5) makes dq = [5, 10, 20].
Step 2: Apply pop_back and push_front
pop_back() removes 20, dq = [5, 10]. Then push_front(1) makes dq = [1, 5, 10].
Final Answer:
[1, 5, 10] -> Option D
Quick Check:
Operations result in [1, 5, 10] [OK]
Hint: Track each operation step-by-step on the deque [OK]
Common Mistakes:
Forgetting pop_back removes last element
Mixing order of push_front and push_back
Misreading the final print format
4. Identify the error in this Rust code that tries to remove an element from the front of a VecDeque named dq:
use std::collections::VecDeque;
fn main() {
let mut dq = VecDeque::new();
dq.push_back(1);
dq.push_back(2);
let front = dq.pop();
println!("{:?}", front);
}
medium
A. VecDeque has no method named pop()
B. pop() removes from back, not front
C. dq is not mutable
D. push_back() is used incorrectly
Solution
Step 1: Check VecDeque methods
VecDeque does not have a method named pop(). It uses pop_front() or pop_back().
Step 2: Identify the error cause
Calling dq.pop() causes a compile-time error because the method does not exist.
Final Answer:
VecDeque has no method named pop() -> Option A
Quick Check:
pop() method missing in VecDeque [OK]
Hint: Use pop_front() or pop_back() for VecDeque removals [OK]
Common Mistakes:
Using pop() from Vec on VecDeque
Ignoring compiler error messages
Assuming pop() removes front element
5. Given a VecDeque with elements [3, 6, 9, 12], which sequence of operations will result in the dequeue [1, 3, 6]?
hard
A. dq.pop_back(); dq.pop_front(); dq.push_front(1);
B. dq.pop_front(); dq.pop_back(); dq.push_front(1);
C. dq.pop_back(); dq.pop_back(); dq.push_front(1);
D. dq.pop_front(); dq.pop_front(); dq.push_back(1);
Solution
Step 1: Start with dq = [3, 6, 9, 12]
Initial dequeue has elements 3, 6, 9, 12 in order.
Step 2: Apply operations in dq.pop_back(); dq.pop_back(); dq.push_front(1);
First pop_back() removes 12, dq = [3, 6, 9]. Second pop_back() removes 9, dq = [3, 6]. Then push_front(1) adds 1 at front, dq = [1, 3, 6].
Final Answer:
dq.pop_back(); dq.pop_back(); dq.push_front(1); -> Option C
Quick Check:
Operations produce [1, 3, 6] [OK]
Hint: Remove from back twice, then add 1 at front [OK]
Common Mistakes:
Removing from front instead of back
Adding 1 at back instead of front
Wrong operation order
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.