leetcode_rust/
design_circular_queue.rs

1#![allow(dead_code)]
2#![allow(unused_variables)]
3
4use std::iter;
5
6// One more space
7#[derive(Debug, Clone)]
8pub struct MyCircularQueue {
9    q: Vec<i32>,
10    head: usize,
11    tail: usize,
12    size: usize,
13}
14
15impl MyCircularQueue {
16    /** Initialize your data structure here. Set the size of the queue to be k. */
17    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    /** Insert an element into the circular queue. Return true if the operation is successful. */
28    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    /** Delete an element from the circular queue. Return true if the operation is successful. */
39    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    /** Get the front item from the queue. */
49    pub fn front(&self) -> i32 {
50        if self.is_empty() {
51            -1
52        } else {
53            self.q[self.head]
54        }
55    }
56    /** Get the last item from the queue. */
57    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    /** Checks whether the circular queue is empty or not. */
66    pub fn is_empty(&self) -> bool {
67        self.head == self.tail
68    }
69
70    /** Checks whether the circular queue is full or not. */
71    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}