Mental Model
Add a new item to the back of a line so everyone waits their turn in order.
Analogy: Imagine a queue at a ticket counter where new people join only at the end of the line.
front -> 1 -> 2 -> 3 -> null ā rear ā
front -> 1 -> 2 -> 3 -> null ā rear ā
new_node: 4 -> null
1 -> 2 -> 3 -> [rear->4] -> null
front -> 1 -> 2 -> 3 -> [rear->4] -> null
front -> 1 -> 2 -> 3 -> 4 -> null ā rear
use std::rc::Rc; use std::cell::RefCell; #[derive(Debug)] struct Node { value: i32, next: Option<Rc<RefCell<Node>>>, } #[derive(Debug)] struct Queue { front: Option<Rc<RefCell<Node>>>, rear: Option<Rc<RefCell<Node>>>, } impl Queue { fn new() -> Self { Queue { front: None, rear: None } } fn enqueue(&mut self, val: i32) { let new_node = Rc::new(RefCell::new(Node { value: val, next: None })); // If queue is empty, front and rear both point to new node if self.rear.is_none() { self.front = Some(Rc::clone(&new_node)); self.rear = Some(Rc::clone(&new_node)); return; } // Link current rear's next to new node if let Some(rear_node) = &self.rear { rear_node.borrow_mut().next = Some(Rc::clone(&new_node)); } // Update rear to new node self.rear = Some(Rc::clone(&new_node)); } fn print_queue(&self) { let mut current = self.front.as_ref().map(Rc::clone); while let Some(node) = current { print!("{} -> ", node.borrow().value); current = node.borrow().next.as_ref().map(Rc::clone); } println!("null"); } } fn main() { let mut queue = Queue::new(); queue.enqueue(1); queue.enqueue(2); queue.enqueue(3); queue.enqueue(4); queue.print_queue(); }
let new_node = Rc::new(RefCell::new(Node { value: val, next: None }));if self.rear.is_none() { self.front = Some(Rc::clone(&new_node)); self.rear = Some(Rc::clone(&new_node)); return; }if let Some(rear_node) = &self.rear { rear_node.borrow_mut().next = Some(Rc::clone(&new_node)); }self.rear = Some(Rc::clone(&new_node));if self.rear.is_none() { self.front = Some(Rc::clone(&new_node)); self.rear = Some(Rc::clone(&new_node)); return; }
enqueue operation do in a queue data structure?5 into a queue implemented as a VecDeque named queue?VecDeque uses push_back to add elements at the end.queue.push_back(5); correctly adds 5 at the back.use std::collections::VecDeque;
fn main() {
let mut queue = VecDeque::new();
queue.push_back(10);
queue.push_back(20);
queue.push_back(30);
queue.push_back(40);
println!("{:?}", queue);
}use std::collections::VecDeque;
fn main() {
let mut queue = VecDeque::new();
queue.enqueue(15);
println!("{:?}", queue);
}Vec where enqueue adds elements at the end and dequeue removes from the front. Which of the following code snippets correctly enqueues the element 7?push adds element at the back.push(7) which correctly adds 7 at the end. Others either insert at front or remove elements.Pass the test and this pattern moves unknown