rust_algorithms/data_structures/
queue.rs1#[derive(Debug)]
30pub struct Queue<T> {
31 buf: Vec<Option<T>>,
32 head: usize,
33 len: usize,
34}
35
36impl<T> Default for Queue<T> {
37 fn default() -> Self {
38 Self::new()
39 }
40}
41
42impl<T> Queue<T> {
43 pub fn new() -> Self {
45 Self {
46 buf: Vec::new(),
47 head: 0,
48 len: 0,
49 }
50 }
51
52 pub fn enqueue(&mut self, item: T) {
54 if self.len == self.buf.len() {
55 self.grow();
56 }
57 let idx = (self.head + self.len) % self.buf.len();
58 self.buf[idx] = Some(item);
59 self.len += 1;
60 }
61
62 pub fn dequeue(&mut self) -> Option<T> {
64 if self.len == 0 {
65 return None;
66 }
67 let item = self.buf[self.head].take();
68 self.head = (self.head + 1) % self.buf.len();
69 self.len -= 1;
70 item
71 }
72
73 pub fn front(&self) -> Option<&T> {
75 if self.len == 0 {
76 None
77 } else {
78 self.buf[self.head].as_ref()
79 }
80 }
81
82 pub fn len(&self) -> usize {
84 self.len
85 }
86
87 pub fn is_empty(&self) -> bool {
89 self.len == 0
90 }
91
92 fn grow(&mut self) {
94 let yangi_hajm = if self.buf.is_empty() {
95 4
96 } else {
97 self.buf.len() * 2
98 };
99 let mut yangi: Vec<Option<T>> = (0..yangi_hajm).map(|_| None).collect();
100 for i in 0..self.len {
101 let eski = (self.head + i) % self.buf.len();
102 yangi[i] = self.buf[eski].take();
103 }
104 self.buf = yangi;
105 self.head = 0;
106 }
107}
108
109impl<T> FromIterator<T> for Queue<T> {
110 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
111 let mut q = Queue::new();
112 for x in iter {
113 q.enqueue(x);
114 }
115 q
116 }
117}
118
119#[cfg(test)]
120mod tests {
121 use super::*;
122
123 #[test]
124 fn fifo_tartibi() {
125 let mut q: Queue<i32> = (1..=5).collect();
126 let chiqish: Vec<i32> = std::iter::from_fn(|| q.dequeue()).collect();
127 assert_eq!(chiqish, vec![1, 2, 3, 4, 5]);
128 }
129
130 #[test]
131 fn bosh_navbat() {
132 let mut q: Queue<i32> = Queue::new();
133 assert!(q.is_empty());
134 assert_eq!(q.dequeue(), None);
135 assert_eq!(q.front(), None);
136 }
137
138 #[test]
139 fn halqa_boylab_oraladi() {
140 let mut q = Queue::new();
141 for tur in 0..20 {
143 for i in 0..7 {
144 q.enqueue(tur * 100 + i);
145 }
146 for i in 0..7 {
147 assert_eq!(q.dequeue(), Some(tur * 100 + i));
148 }
149 assert!(q.is_empty());
150 }
151 }
152
153 #[test]
154 fn aralash_amallar() {
155 let mut q = Queue::new();
156 q.enqueue(1);
157 q.enqueue(2);
158 assert_eq!(q.dequeue(), Some(1));
159 q.enqueue(3);
160 q.enqueue(4);
161 assert_eq!(q.len(), 3);
162 assert_eq!(q.dequeue(), Some(2));
163 assert_eq!(q.dequeue(), Some(3));
164 assert_eq!(q.dequeue(), Some(4));
165 assert_eq!(q.dequeue(), None);
166 }
167}