📖 Scenario: You are building a simple program to manage a stack of books. You want to see which book is currently on top without removing it.
🎯 Goal: Create a stack using a vector, add some books, then peek at the top book without removing it.
📋 What You'll Learn
Create a vector called stack with exact book titles
Add a variable called top_book to hold the peeked book
Use the last() method to peek at the top book
Print the top_book value
💡 Why This Matters
🌍 Real World
Stacks are used in many real-world applications like undo features in text editors, browser history, and managing function calls.
💼 Career
Understanding how to peek at the top of a stack is important for software developers working with data structures, algorithms, and system design.
Progress0 / 4 steps
1
Create the stack with books
Create a vector called stack with these exact book titles as strings: "The Hobbit", "1984", "Brave New World"
DSA Rust
Hint
Use vec![...] to create a vector with the exact strings inside.
2
Add a variable to hold the top book
Add a variable called top_book that uses stack.last() to peek at the top book without removing it
DSA Rust
Hint
Use stack.last() to get a reference to the last element in the vector.
3
Handle the peeked value safely
Use a match statement on top_book to get the book title or print "Stack is empty" if there is no top book
DSA Rust
Hint
Use match to check if top_book is Some or None.
4
Print the top book
Print the top book using println!("Top book: {}", book) inside the Some arm of the match statement
DSA Rust
Hint
The program should print exactly: Top book: Brave New World
Practice
(1/5)
1. What does the peek operation do in a stack data structure?
easy
A. Returns the top element without removing it
B. Removes the top element and returns it
C. Adds a new element to the top
D. Checks if the stack is empty
Solution
Step 1: Understand stack operations
A stack stores elements in a last-in, first-out order. Common operations include push, pop, and peek.
Step 2: Define peek operation
Peek returns the top element without removing it, allowing you to see the current top value safely.
Final Answer:
Returns the top element without removing it -> Option A
Quick Check:
Peek = top element without removal [OK]
Hint: Peek shows top without changing stack [OK]
Common Mistakes:
Confusing peek with pop operation
Thinking peek adds elements
Assuming peek checks emptiness
2. Which of the following Rust code snippets correctly peeks the top element of a stack implemented as a Vec<i32> named stack?
easy
A. let top = stack.last();
B. let top = stack[0];
C. let top = stack.pop();
D. let top = stack.first();
Solution
Step 1: Understand Rust Vec methods for stack
In Rust, Vec can be used as a stack. pop() removes and returns the last element, last() returns a reference to the last element without removing it.
Step 2: Identify correct peek method
Peek means to see the top element without removing it, so stack.last() is correct. stack.pop() removes it, stack[0] accesses the first element, and stack.first() returns the first element, not the top.
Final Answer:
let top = stack.last(); -> Option A
Quick Check:
Peek = stack.last() [OK]
Hint: Use .last() to peek top element in Rust Vec stack [OK]
Common Mistakes:
Using pop() which removes element
Accessing first() instead of last()
Using index 0 which is bottom of stack
3. What will be the output of the following Rust code?
let mut stack = vec![10, 20, 30];
if let Some(top) = stack.last() {
println!("{}", top);
} else {
println!("Stack is empty");
}
medium
A. 20
B. 30
C. 10
D. Stack is empty
Solution
Step 1: Understand stack contents and last()
The stack vector contains [10, 20, 30]. The last element is 30.
Step 2: Trace the if let statement
The stack.last() returns Some(&30), so the if block prints 30.
Final Answer:
30 -> Option B
Quick Check:
stack.last() = 30 [OK]
Hint: stack.last() returns top element reference [OK]
Common Mistakes:
Printing bottom element instead of top
Confusing last() with pop() output
Assuming stack is empty
4. Identify the error in the following Rust code that tries to peek the top element of a stack and fix it:
let stack = vec![1, 2, 3];
let top = stack.pop().unwrap();
println!("Top element: {}", top);
medium
A. No error, code works correctly
B. pop() removes element; use last() to peek instead
C. unwrap() causes panic; use expect() instead
D. stack should be mutable to use pop()
Solution
Step 1: Check mutability for pop()
pop() removes the last element, so the vector must be mutable. Here, stack is immutable.
Step 2: Fix by making stack mutable
Change let stack = vec![1, 2, 3]; to let mut stack = vec![1, 2, 3]; to allow pop().
Final Answer:
stack should be mutable to use pop() -> Option D
Quick Check:
pop() needs mutable stack [OK]
Hint: pop() requires mutable stack variable [OK]
Common Mistakes:
Ignoring mut keyword error
Confusing pop() with peek operation
Assuming unwrap() always safe
5. Given a stack implemented as Vec<i32>, write a Rust function peek_top that returns the top element as Option<i32> without removing it. What is the correct implementation?
hard
A. fn peek_top(stack: &mut Vec<i32>) -> Option<i32> { stack.pop() }
B. fn peek_top(stack: &Vec<i32>) -> i32 { *stack.last().unwrap() }
C. fn peek_top(stack: &Vec<i32>) -> Option<i32> { stack.last().copied() }
D. fn peek_top(stack: Vec<i32>) -> Option<i32> { stack.first().copied() }
Solution
Step 1: Understand function requirements
The function must peek without removing, so it should borrow stack immutably and return Option<i32>.
Step 2: Analyze options
fn peek_top(stack: &Vec<i32>) -> Option<i32> { stack.last().copied() } uses stack.last().copied() which returns Option<i32> by copying the reference. fn peek_top(stack: &mut Vec<i32>) -> Option<i32> { stack.pop() } removes element (pop), fn peek_top(stack: &Vec<i32>) -> i32 { *stack.last().unwrap() } unwraps and returns i32 (not Option), fn peek_top(stack: Vec<i32>) -> Option<i32> { stack.first().copied() } uses first() which is bottom element.