What is a stack and what principle does it follow?
A stack is a data structure that stores items in a Last In, First Out (LIFO) order. This means the last item added is the first one to be removed.
Click to reveal answer
intermediate
Why use a linked list to implement a stack?
A linked list allows dynamic memory use, so the stack can grow or shrink without a fixed size. It also makes push and pop operations efficient by adding or removing nodes at the head.
Click to reveal answer
intermediate
In Rust, what is the role of the Option type in a linked list stack?
Option is used to represent the possibility of a node being present or absent (None). It helps safely handle the end of the list (null) without unsafe code.
Click to reveal answer
beginner
What does the push operation do in a stack implemented with a linked list?
Push adds a new node at the start (head) of the linked list, making it the new top of the stack.
Click to reveal answer
beginner
How does the pop operation work in a linked list stack?
Pop removes the node at the head of the linked list and returns its value, updating the head to the next node.
Click to reveal answer
What order does a stack follow?
AFirst In, First Out (FIFO)
BLast In, First Out (LIFO)
CRandom Order
DSorted Order
✗ Incorrect
Stacks follow Last In, First Out (LIFO) order, meaning the last element added is the first to be removed.
In a linked list stack, where is the new element added during push?
AIn the middle of the list
BAt the tail (end) of the list
CAt the head (start) of the list
DAt a random position
✗ Incorrect
Push adds the new element at the head of the linked list to keep push and pop operations efficient.
What does the Option type represent in Rust linked list nodes?
APresence or absence of a node
BThe value of the node
CThe size of the stack
DThe type of data stored
✗ Incorrect
Option is used to represent whether a node exists (Some) or not (None), replacing null pointers safely.
What happens when you pop from an empty stack implemented with a linked list?
ADoes nothing silently
BReturns the last element
CAdds a new element
DReturns None or an error indicating empty stack
✗ Incorrect
Popping from an empty stack returns None or an error because there is no element to remove.
Why is a linked list preferred over an array for stack implementation in some cases?
ABecause it allows dynamic size without resizing
BBecause arrays are slower
CBecause linked lists use less memory always
DBecause arrays cannot store data
✗ Incorrect
Linked lists allow the stack to grow or shrink dynamically without needing to resize, unlike arrays.
Explain how push and pop operations work in a stack implemented using a linked list.
Think about adding and removing from the start of the list.
You got /4 concepts.
Describe the advantages of using a linked list to implement a stack compared to using an array.
Consider memory and operation efficiency.
You got /4 concepts.
Practice
(1/5)
1. What is the main advantage of implementing a stack using a linked list instead of an array?
easy
A. It allows random access to elements
B. It uses less memory than an array
C. The stack can grow dynamically without a fixed size limit
D. It is easier to sort the stack elements
Solution
Step 1: Understand stack size limitation in arrays
Arrays have fixed size, so stacks implemented with arrays have a maximum capacity.
Step 2: Linked list dynamic size property
Linked lists can grow or shrink dynamically by adding or removing nodes, so stack size is not fixed.
Final Answer:
The stack can grow dynamically without a fixed size limit -> Option C
Quick Check:
Dynamic size = Advantage of linked list stack [OK]
Hint: Linked list stacks grow dynamically, arrays don't [OK]
Common Mistakes:
Thinking linked list uses less memory always
Confusing stack with queue behavior
Assuming random access is possible in linked list
2. Which of the following Rust code snippets correctly defines a node struct for a linked list stack?
easy
A. struct Node { data: i32, next: Option }
B. struct Node { data: i32, next: Node }
C. struct Node { data: i32, next: &Node }
D. struct Node { data: i32, next: Box<Node> }
Solution
Step 1: Understand Rust ownership and recursive types
Recursive types like linked lists require indirection using Box and Option for nullable pointers.
Step 2: Analyze each option
struct Node { data: i32, next: Option } uses Option which allows nullable next pointer; struct Node { data: i32, next: Node } and struct Node { data: i32, next: &Node } are invalid due to recursive type without indirection; struct Node { data: i32, next: Box<Node> } misses Option, so no null pointer.
3. Consider the following Rust code for pushing elements onto a linked list stack:
struct Node {
data: i32,
next: Option,
}
struct Stack {
head: Option,
}
impl Stack {
fn push(&mut self, val: i32) {
let new_node = Box::new(Node { data: val, next: self.head.take() });
self.head = Some(new_node);
}
}
fn main() {
let mut stack = Stack { head: None };
stack.push(10);
stack.push(20);
stack.push(30);
// What is the top element's data now?
println!("{}", stack.head.as_ref().unwrap().data);
}
medium
A. 30
B. 20
C. 10
D. None
Solution
Step 1: Trace push operations
Push 10: head points to node with data 10; Push 20: head points to node with data 20, next is 10; Push 30: head points to node with data 30, next is 20.
Step 2: Identify top element
After pushes, top element is the head node's data, which is 30.
Final Answer:
30 -> Option A
Quick Check:
Last pushed = top element = 30 [OK]
Hint: Top is last pushed element in stack [OK]
Common Mistakes:
Confusing order of nodes in linked list
Assuming head points to bottom element
Not using take() causing borrow errors
4. The following Rust code for popping an element from a linked list stack has an error. What is the error?
D. Using unwrap() on Option without handling ownership
Solution
Step 1: Analyze unwrap() usage on self.head
unwrap() consumes the Option, but self.head is borrowed mutably, causing ownership error.
Step 2: Correct way is to use take() to move ownership
Using self.head.take() moves ownership out safely, allowing access to node and updating head.
Final Answer:
Using unwrap() on Option without handling ownership -> Option D
Quick Check:
unwrap() consumes Option, use take() instead [OK]
Hint: Use take() to move Option ownership safely [OK]
Common Mistakes:
Using unwrap() causing borrow checker errors
Ignoring empty stack check
Confusing references and ownership
5. You want to implement a function reverse_stack that reverses the elements of a linked list stack without using extra data structures. Which approach correctly achieves this in Rust?
hard
A. Iteratively pop elements and push them onto a new stack, then replace original stack
B. Recursively pop elements, reverse the rest, then push popped element back
C. Traverse linked list and swap data values between nodes from head to tail
D. Use a vector to collect elements, reverse vector, then rebuild stack
Solution
Step 1: Understand constraints - no extra data structures allowed
Options A and D use extra stacks or vectors, so they violate constraints.
Step 2: Recursive approach explanation
Recursively pop elements until stack is empty, then push elements back in reverse order, effectively reversing stack without extra storage.
Step 3: Swapping data values is complex and error-prone
Traverse linked list and swap data values between nodes from head to tail requires traversal and swapping data, which is complicated and not idiomatic in Rust linked lists.
Final Answer:
Recursively pop elements, reverse the rest, then push popped element back -> Option B
Quick Check:
Recursion reverses stack without extra structures [OK]
Hint: Use recursion to reverse stack without extra storage [OK]
Common Mistakes:
Using extra data structures despite constraints
Trying to swap node data directly
Ignoring ownership rules in recursion
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.