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}