parent
b09ac8e0fb
commit
ac36750923
@ -1,2 +1,3 @@
|
|||||||
pub mod linked;
|
pub mod linked;
|
||||||
pub mod linked_im;
|
pub mod linked_im;
|
||||||
|
pub mod queue;
|
||||||
|
@ -0,0 +1,109 @@
|
|||||||
|
use std::ptr;
|
||||||
|
|
||||||
|
type Link<T> = Option<Box<Node<T>>>;
|
||||||
|
|
||||||
|
pub struct Queue<T> {
|
||||||
|
length: usize,
|
||||||
|
front: Link<T>,
|
||||||
|
rear: *mut Node<T>,
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Node<T> {
|
||||||
|
value: T,
|
||||||
|
prev: Link<T>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> Queue<T> {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Queue {
|
||||||
|
length: 0,
|
||||||
|
front: Option::None,
|
||||||
|
rear: ptr::null_mut(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn len(&self) -> usize {
|
||||||
|
self.length
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn enqueue(&mut self, value: T) {
|
||||||
|
let mut item = Box::new(Node {
|
||||||
|
value,
|
||||||
|
prev: Option::None,
|
||||||
|
});
|
||||||
|
|
||||||
|
let raw_rear: *mut _ = &mut *item;
|
||||||
|
|
||||||
|
if self.rear.is_null() {
|
||||||
|
self.front = Some(item);
|
||||||
|
} else {
|
||||||
|
unsafe {
|
||||||
|
(*self.rear).prev = Some(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self.rear = raw_rear;
|
||||||
|
|
||||||
|
self.length = self.length + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn dequeue(&mut self) -> Option<T> {
|
||||||
|
self.front.take().map(|node| {
|
||||||
|
let front = *node;
|
||||||
|
self.front = front.prev;
|
||||||
|
|
||||||
|
if self.front.is_none() {
|
||||||
|
self.rear = ptr::null_mut();
|
||||||
|
}
|
||||||
|
|
||||||
|
front.value
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_new_queue() {
|
||||||
|
let queue: Queue<i32> = Queue::new();
|
||||||
|
assert_eq!(queue.len(), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_enqueue_len() {
|
||||||
|
let mut queue = Queue::new();
|
||||||
|
queue.enqueue(32);
|
||||||
|
assert_eq!(queue.len(), 1);
|
||||||
|
queue.enqueue(50);
|
||||||
|
assert_eq!(queue.len(), 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_deqeue() {
|
||||||
|
let mut queue: Queue<u32> = Queue::new();
|
||||||
|
let result = queue.dequeue();
|
||||||
|
assert_eq!(result, Option::None);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_enqueue_dequeue() {
|
||||||
|
let mut queue = Queue::new();
|
||||||
|
queue.enqueue(32);
|
||||||
|
queue.enqueue(50);
|
||||||
|
assert_eq!(queue.dequeue().unwrap(), 32);
|
||||||
|
assert_eq!(queue.dequeue().unwrap(), 50);
|
||||||
|
assert_eq!(queue.dequeue(), None);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_enq_after_deq() {
|
||||||
|
// Specificially calls out hanging rear case
|
||||||
|
let mut queue = Queue::new();
|
||||||
|
queue.enqueue(32);
|
||||||
|
queue.dequeue();
|
||||||
|
queue.enqueue(100);
|
||||||
|
assert_eq!(queue.dequeue().unwrap(), 100);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue