my_lib/stack/
stack.rs

1pub struct Stack<T> {
2    items: Vec<T>,
3}
4
5impl<T> Stack<T> {
6    pub fn new() -> Self {
7        Stack { items: Vec::new() }
8    }
9
10    pub fn push(&mut self, val: T) {
11        self.items.push(val)
12    }
13
14    pub fn pop(&mut self) -> Option<T> {
15        self.items.pop()
16    }
17
18    pub fn is_empty(&self) -> bool {
19        self.items.len() == 0
20    }
21
22    pub fn size(&self) -> usize {
23        self.items.len()
24    }
25
26    pub fn top(&mut self) -> Option<&T> {
27        self.items.last()
28    }
29}
30
31#[cfg(test)]
32mod tests {
33    use super::*;
34
35    #[test]
36    fn test_push() {
37        let mut stack = Stack::<i32>::new();
38        stack.push(1);
39        stack.push(2);
40        assert_eq!(stack.size(), 2);
41        assert_eq!(stack.top(), Some(&2));
42    }
43
44    #[test]
45    fn test_pop() {
46        let mut stack = Stack::<i32>::new();
47        stack.push(1);
48        stack.push(2);
49        assert_eq!(stack.pop(), Some(2));
50        assert_eq!(stack.size(), 1);
51        assert_eq!(stack.top(), Some(&1));
52    }
53
54    #[test]
55    fn test_size() {
56        let mut stack = Stack::<i32>::new();
57        assert_eq!(stack.size(), 0);
58        stack.push(1);
59        assert_eq!(stack.size(), 1);
60        stack.push(2);
61        assert_eq!(stack.size(), 2);
62    }
63
64    #[test]
65    fn test_top() {
66        let mut stack = Stack::<i32>::new();
67        stack.push(1);
68        assert_eq!(stack.top(), Some(&1));
69        stack.push(2);
70        assert_eq!(stack.top(), Some(&2));
71        stack.pop();
72        assert_eq!(stack.top(), Some(&1));
73    }
74}