stdlib_rs/collections/
min_stack.rs

1#![deny(missing_docs)]
2
3use std::cmp::min;
4use std::fmt::Debug;
5use std::mem;
6use std::ops::{Deref, DerefMut, Index};
7
8impl<T> MinStack<T>
9where
10    T: Clone + Ord + Default,
11{
12    /// Moves all the elements of `other` into `Self`, leaving other empty.
13    /// ## Panics
14    /// Panics if the number of elements in the `MinStack` overflows a `usize`.
15    /// ## Examples
16    /// ```
17    /// # use stdlib_rs::min_stack;
18    /// # use stdlib_rs::collections::min_stack::MinStack;
19    /// let mut left = min_stack![1];
20    /// let mut right = min_stack![2];
21    /// left.append(&mut right);
22    /// assert_eq!(left, min_stack![1, 2]);
23    /// ```
24    pub fn append(&mut self, other: &mut Self) {
25        let other = mem::take(other);
26        for item in other {
27            self.push(item.0);
28        }
29    }
30}
31
32impl<T> MinStack<T>
33where
34    T: Clone + Ord,
35{
36    /// Finds the minimum item of the stack in O(1) time.
37    /// If the stack is empty, returns `None`.
38    /// ## Examples
39    /// ```
40    /// # use stdlib_rs::min_stack;
41    /// # use stdlib_rs::collections::min_stack::MinStack;
42    /// let stack = min_stack![1, 2];
43    /// let empty: MinStack<i32> = min_stack![];
44    /// assert_eq!(stack.min(), Some(1));
45    /// assert_eq!(empty.min(), None);
46    /// ```
47    pub fn min(&self) -> Option<T> {
48        self.0.last().map(|item| item.1.clone())
49    }
50
51    /// Look at the top item of the stack in O(1) time.
52    /// If the stack is empty, returns `None`.
53    /// ## Examples
54    /// ```
55    /// # use stdlib_rs::min_stack;
56    /// # use stdlib_rs::collections::min_stack::MinStack;
57    /// let stack = min_stack![1, 2];
58    /// let empty: MinStack<i32> = min_stack![];
59    /// assert_eq!(stack.peek(), Some(2));
60    /// assert_eq!(empty.peek(), None);
61    /// ```
62    pub fn peek(&self) -> Option<T> {
63        self.0.last().map(|item| item.0.clone())
64    }
65
66    /// Adds an item to the end of the stack in O(1) time.
67    /// ## Examples
68    /// ```
69    /// # use stdlib_rs::min_stack;
70    /// # use stdlib_rs::collections::min_stack::MinStack;
71    /// let mut stack = min_stack![1];
72    /// stack.push(2);
73    /// assert_eq!(stack.len(), 2);
74    /// ```
75    pub fn push(&mut self, item: T) {
76        if !self.0.is_empty() {
77            let curr_min = self.min().clone().unwrap();
78            let new_min = min(curr_min, item.clone());
79            self.0.push((item, new_min));
80        } else {
81            self.0.push((item.clone(), item));
82        }
83    }
84
85    /// Creates a min_stack from a vector.
86    /// ## Examples
87    /// ```
88    /// # use stdlib_rs::min_stack;
89    /// # use stdlib_rs::collections::min_stack::MinStack;
90    /// let v = vec![1, 2, 3];
91    /// let stack: MinStack<i32> = MinStack::from(v);
92    /// assert_eq!(stack, min_stack![1, 2, 3]);
93    /// ```
94    pub fn from(vec: Vec<T>) -> Self {
95        let mut stack = MinStack::new();
96        for item in vec {
97            stack.push(item);
98        }
99        stack
100    }
101}
102
103/// A Stack data type that supports accessing the minimum item
104/// in the stack in O(1) time.
105#[derive(Default, Debug, Clone, PartialEq, Eq, PartialOrd)]
106pub struct MinStack<T: Ord>(Vec<(T, T)>);
107
108impl<T> IntoIterator for MinStack<T>
109where
110    T: Ord,
111{
112    type Item = (T, T);
113    type IntoIter = std::vec::IntoIter<Self::Item>;
114
115    fn into_iter(self) -> Self::IntoIter {
116        self.0.into_iter()
117    }
118}
119
120impl<T> Deref for MinStack<T>
121where
122    T: Ord,
123{
124    type Target = [(T, T)];
125
126    fn deref(&self) -> &Self::Target {
127        self.0.deref()
128    }
129}
130
131impl<T> DerefMut for MinStack<T>
132where
133    T: Ord,
134{
135    fn deref_mut(&mut self) -> &mut [(T, T)] {
136        self.0.deref_mut()
137    }
138}
139
140impl<T> Index<usize> for MinStack<T>
141where
142    T: Ord,
143{
144    type Output = (T, T);
145
146    fn index(&self, index: usize) -> &Self::Output {
147        &self.0[index]
148    }
149}
150
151impl<T> MinStack<T>
152where
153    T: Ord,
154{
155    /// Creates a new MinStack.
156    pub fn new() -> Self {
157        MinStack(vec![])
158    }
159
160    /// Extracts a slice containing the Min Stack.
161    /// Equivalent to `&s[..]`.
162    pub fn as_slice(&self) -> &[(T, T)] {
163        &self.0
164    }
165
166    /// Returns a raw pointer to the min_stack.
167    pub fn as_ptr(&self) -> *const (T, T) {
168        self.0.as_ptr()
169    }
170
171    /// Returns a mutable pointer to the min_stack.
172    pub fn as_mut_ptr(&mut self) -> *mut (T, T) {
173        self.0.as_mut_ptr()
174    }
175
176    /// Clears the MinStack, removing all values.
177    /// ## Examples
178    /// ```
179    /// # use stdlib_rs::min_stack;
180    /// # use stdlib_rs::collections::min_stack::*;
181    /// let mut stack = min_stack![1,2,3];
182    /// stack.clear();
183    /// assert_eq!(stack, min_stack![]);
184    /// ```
185    pub fn clear(&mut self) {
186        self.0.clear()
187    }
188
189    /// Creates a new MinStack with the given capacity.
190    /// ## Examples
191    /// ```
192    /// # use stdlib_rs::min_stack;
193    /// # use stdlib_rs::collections::min_stack::*;
194    /// let stack: MinStack<i32> = MinStack::with_capacity(10);
195    /// assert!(stack.capacity() >= 10);
196    /// ```
197    pub fn with_capacity(capacity: usize) -> MinStack<T> {
198        let mut stack = MinStack::new();
199        stack.0 = Vec::with_capacity(capacity);
200        stack
201    }
202
203    /// Reserves capacity for at least `additional` more elements to be inserted
204    /// in the given `MinStack<T>`. The collection may reserve more space to
205    /// avoid frequent reallocations. After calling reserve, capacity will be
206    /// greater than or equal to self.len() + additional.
207    /// Does nothing if capacity is already sufficient.
208    /// ## Examples
209    /// ```
210    /// # use stdlib_rs::min_stack;
211    /// # use stdlib_rs::collections::min_stack::*;
212    /// let mut stack = min_stack![1];
213    /// stack.reserve(10);
214    /// assert!(stack.capacity() >= 11);
215    /// ```
216    pub fn reserve(&mut self, additional: usize) {
217        self.0.reserve(additional)
218    }
219
220    /// Returns the number of elements the vector can hold without reallocating.
221    /// ## Examples
222    /// ```
223    /// # use stdlib_rs::min_stack;
224    /// # use stdlib_rs::collections::min_stack::*;
225    /// let stack: MinStack<i32> = MinStack::with_capacity(10);
226    /// assert!(stack.capacity() >= 10);
227    /// ```
228    pub fn capacity(&self) -> usize {
229        self.0.capacity()
230    }
231
232    /// Removes the last element from a vector and returns it, or `None` if it is empty.
233    /// ## Examples
234    /// ```
235    /// # use stdlib_rs::min_stack;
236    /// # use stdlib_rs::collections::min_stack::*;
237    /// let mut stack = min_stack![1, 2, 3];
238    /// let mut empty: MinStack<i32> = min_stack![];
239    /// assert_eq!(stack.pop(), Some(3));
240    /// assert_eq!(empty.pop(), None);
241    /// ```
242    pub fn pop(&mut self) -> Option<T> {
243        match self.0.pop() {
244            Some(item) => Some(item.0),
245            None => None,
246        }
247    }
248
249    /// Returns `true` if the MinStack has no elements.
250    /// ## Examples
251    /// ```
252    /// # use stdlib_rs::min_stack;
253    /// # use stdlib_rs::collections::min_stack::*;
254    /// let stack = min_stack![1, 2, 3];
255    /// let empty: MinStack<i32> = min_stack![];
256    /// assert_eq!(stack.is_empty(), false);
257    /// assert_eq!(empty.is_empty(), true);
258    /// ```
259    pub fn is_empty(&self) -> bool {
260        self.0.is_empty()
261    }
262
263    /// Returns the number of elements in the stack.
264    /// ## Examples
265    /// ```
266    /// # use stdlib_rs::min_stack;
267    /// # use stdlib_rs::collections::min_stack::*;
268    /// let stack = min_stack![1, 2, 3];
269    /// assert_eq!(stack.len(), 3);
270    /// ```
271    pub fn len(&self) -> usize {
272        self.0.len()
273    }
274}
275
276/// Create a new min_stack with the elements inside the macro.
277/// Works like the `vec![]` macro.
278/// ## Examples
279/// ```
280/// # use stdlib_rs::min_stack;
281/// # use stdlib_rs::collections::min_stack::*;
282/// let stack = min_stack![1, 2, 3];
283/// let empty: MinStack<i32> = min_stack![];
284/// let mut other = MinStack::new();
285/// other.push(1);
286/// other.push(2);
287/// other.push(3);
288/// assert_eq!(stack, other);
289/// assert_eq!(empty, MinStack::new());
290/// ```
291#[macro_export]
292macro_rules! min_stack [
293    ($($e:expr),*) => ({
294        let mut _temp  = MinStack::new();
295        $(_temp.push($e);)*
296        _temp
297    })
298];
299
300#[cfg(test)]
301mod tests {
302    use super::MinStack;
303
304    #[test]
305    fn min_test_1() {
306        let min = min_stack![1, 2, 3].min();
307        assert_eq!(min, Some(1));
308    }
309
310    #[test]
311    fn min_test_empty() {
312        let empty: MinStack<i32> = min_stack![];
313        assert_eq!(empty.min(), None);
314    }
315
316    #[test]
317    fn peek_test_1() {
318        let stack = min_stack![1, 2, 3].peek();
319        assert_eq!(stack, Some(3));
320    }
321
322    #[test]
323    fn peek_test_empty() {
324        let empty: MinStack<i32> = min_stack![];
325        assert_eq!(empty.peek(), None);
326    }
327
328    #[test]
329    fn empty_test() {
330        let empty: MinStack<i32> = min_stack![];
331        assert_eq!(empty.is_empty(), true);
332    }
333
334    #[test]
335    fn non_empty_test() {
336        let empty: MinStack<i32> = min_stack![1];
337        assert_eq!(empty.is_empty(), false);
338    }
339
340    #[test]
341    fn empty_len_test() {
342        let empty: MinStack<i32> = min_stack![];
343        assert_eq!(empty.len(), 0);
344    }
345
346    #[test]
347    fn one_item_stack_len() {
348        let empty: MinStack<i32> = min_stack![1];
349        assert_eq!(empty.len(), 1);
350    }
351
352    #[test]
353    fn into_iter_test_1() {
354        let mut stack = min_stack![1, 2, 3].into_iter();
355        assert_eq!(stack.next(), Some((1, 1)));
356        assert_eq!(stack.next(), Some((2, 1)));
357        assert_eq!(stack.next(), Some((3, 1)));
358    }
359
360    #[test]
361    fn from_vec_test_1() {
362        let vec = vec![1, 2, 3];
363        assert_eq!(MinStack::from(vec), min_stack![1, 2, 3]);
364    }
365
366    #[test]
367    fn test_index_1() {
368        let stack = min_stack![1];
369        assert_eq!(stack[0], (1, 1));
370    }
371
372    #[test]
373    fn test_reserve_1() {
374        let mut stack = min_stack![1];
375        stack.reserve(10);
376        assert!(stack.capacity() >= 11);
377    }
378
379    #[test]
380    fn test_as_slice_1() {
381        let stack = min_stack![1, 2, 3];
382        assert_eq!([(1, 1), (2, 1), (3, 1)], stack.as_slice());
383    }
384
385    #[test]
386    fn append_empty_stack() {
387        let mut left = min_stack![1];
388        let mut right = min_stack![];
389        left.append(&mut right);
390        assert_eq!(left, min_stack![1]);
391        assert_eq!(right, min_stack![]);
392    }
393
394    #[test]
395    fn append_to_empty_stack() {
396        let mut left = min_stack![];
397        let mut right = min_stack![1];
398        left.append(&mut right);
399        assert_eq!(left, min_stack![1]);
400        assert_eq!(right, min_stack![]);
401    }
402
403    #[test]
404    fn append_two_empty_stacks() {
405        let mut left: MinStack<i32> = min_stack![];
406        let mut right = min_stack![];
407        left.append(&mut right);
408        assert_eq!(left, min_stack![]);
409        assert_eq!(right, min_stack![]);
410    }
411
412    #[test]
413    fn append_two_stacks() {
414        let mut left = min_stack![1];
415        let mut right = min_stack![2];
416        left.append(&mut right);
417        assert_eq!(left, min_stack![1, 2]);
418        assert_eq!(right, min_stack![]);
419    }
420
421    #[test]
422    fn test_eq_stacks_1() {
423        let left = min_stack![1, 2];
424        let right = min_stack![1, 2];
425        assert_eq!(left, right);
426    }
427
428    #[test]
429    fn test_neq_stacks_1() {
430        let left = min_stack![2, 1];
431        let right = min_stack![1, 2];
432        assert_ne!(left, right);
433    }
434}