leetcode_rust/
design_circular_queue.rs1#![allow(dead_code)]
2#![allow(unused_variables)]
3
4use std::iter;
5
6#[derive(Debug, Clone)]
8pub struct MyCircularQueue {
9 q: Vec<i32>,
10 head: usize,
11 tail: usize,
12 size: usize,
13}
14
15impl MyCircularQueue {
16 pub fn new(k: i32) -> Self {
18 let size = k as usize + 1;
19 let q = iter::repeat(0).take(size.clone()).collect::<Vec<i32>>();
20 Self {
21 q,
22 head: 0,
23 tail: 0,
24 size,
25 }
26 }
27 pub fn en_queue(&mut self, value: i32) -> bool {
29 if self.is_full() {
30 false
31 } else {
32 self.q[self.tail] = value;
33 self.tail += 1;
34 self.tail %= self.size;
35 true
36 }
37 }
38 pub fn de_queue(&mut self) -> bool {
40 if self.is_empty() {
41 false
42 } else {
43 self.head += 1;
44 self.head %= self.size;
45 true
46 }
47 }
48 pub fn front(&self) -> i32 {
50 if self.is_empty() {
51 -1
52 } else {
53 self.q[self.head]
54 }
55 }
56 pub fn rear(&self) -> i32 {
58 if self.is_empty() {
59 -1
60 } else {
61 self.q[(self.tail + self.size - 1) % self.size]
62 }
63 }
64
65 pub fn is_empty(&self) -> bool {
67 self.head == self.tail
68 }
69
70 pub fn is_full(&self) -> bool {
72 (self.tail + 1) % self.size == self.head
73 }
74}
75
76#[cfg(test)]
77mod tests {
78 use super::*;
79
80 #[test]
81 fn test1() {
82 let k = 10;
83 let value = 10;
84 let mut obj = MyCircularQueue::new(k);
85 let ret_1: bool = obj.en_queue(value);
86 let ret_2: bool = obj.de_queue();
87 let ret_3: i32 = obj.front();
88 let ret_4: i32 = obj.rear();
89 let ret_5: bool = obj.is_empty();
90 let ret_6: bool = obj.is_full();
91 }
92}