simple_stack/lib.rs
1use std::fmt::{self, Debug};
2
3#[derive(Clone)]
4pub struct Stack<T> {
5 head: Option<Box<Node<T>>>,
6 size: usize,
7}
8
9impl<T> Stack<T> {
10 /// Creates an empty stack.
11 ///
12 /// # Examples
13 /// ```
14 /// use simple_stack::Stack;
15 /// let stack: Stack<i32> = Stack::new();
16 /// ```
17 pub fn new() -> Self {
18 Self {
19 head: None,
20 size: 0,
21 }
22 }
23
24 /// Adds an item to the top of a stack.
25 ///
26 /// # Examples
27 /// ```
28 /// use simple_stack::Stack;
29 ///
30 /// let mut stack = Stack::new();
31 /// stack.push(3);
32 ///
33 /// assert_eq!(stack.peek(), Some(&3));
34 /// ```
35 pub fn push(&mut self, val: T) {
36 self.size += 1;
37 self.head = Some(Box::new(Node {
38 val,
39 next: self.head.take(),
40 }));
41 }
42
43 /// Removes the top item from a stack and returns it, or <code>None</code>
44 /// if the stack is empty.
45 ///
46 /// # Examples
47 /// ```
48 /// use simple_stack::Stack;
49 ///
50 /// let mut stack = Stack::new();
51 /// stack.push(3);
52 /// stack.push(7);
53 ///
54 /// assert_eq!(stack.pop(), Some(7));
55 /// assert_eq!(stack.pop(), Some(3));
56 /// assert_eq!(stack.pop(), None);
57 /// ```
58 pub fn pop(&mut self) -> Option<T> {
59 self.head.take().map(|head| {
60 self.size -= 1; // only decrease size if the stack isn't empty
61 self.head = head.next;
62
63 head.val
64 })
65 }
66
67 /// Returns a reference to the top item of a stack, or <code>None</code> if
68 /// the stack is empty.
69 ///
70 /// # Examples
71 /// ```
72 /// use simple_stack::Stack;
73 ///
74 /// let mut stack = Stack::new();
75 ///
76 /// assert_eq!(stack.peek(), None);
77 ///
78 /// stack.push(4);
79 ///
80 /// assert_eq!(stack.peek(), Some(&4));
81 /// ```
82 pub fn peek(&self) -> Option<&T> {
83 self.head.as_ref().map(|head| &head.val)
84 }
85 /// Returns a mutable reference to the top item of a stack, or <code>None</code> if
86 /// the stack is empty.
87 ///
88 /// # Examples
89 /// ```
90 /// use simple_stack::Stack;
91 ///
92 /// let mut stack = Stack::new();
93 ///
94 /// stack.push(11);
95 ///
96 /// assert_eq!(stack.peek_mut(), Some(&mut 11));
97 /// *stack.peek_mut().unwrap() += 1;
98 /// assert_eq!(stack.peek_mut(), Some(&mut 12));
99 /// ```
100 pub fn peek_mut(&mut self) -> Option<&mut T> {
101 self.head.as_mut().map(|head| &mut head.val)
102 }
103
104 /// Returns the number of items in the stack.
105 ///
106 /// # Examples
107 /// ```
108 /// use simple_stack::Stack;
109 ///
110 /// let mut stack = Stack::new();
111 ///
112 /// assert_eq!(stack.size(), 0);
113 /// stack.push(1);
114 /// stack.push(9);
115 /// assert_eq!(stack.size(), 2);
116 /// ```
117 pub fn size(&self) -> usize {
118 self.size
119 }
120}
121
122impl<T> Default for Stack<T> {
123 fn default() -> Self {
124 Self::new()
125 }
126}
127
128impl<T> Debug for Stack<T>
129where
130 T: Debug,
131{
132 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
133 let mut vec = Vec::with_capacity(self.size);
134 let mut cur_node = &self.head;
135 while let Some(node) = cur_node {
136 vec.push(&node.val);
137 cur_node = &node.next;
138 }
139 vec.reverse();
140
141 f.debug_list().entries(vec).finish()
142 }
143}
144
145#[derive(Clone)]
146struct Node<T> {
147 val: T,
148 next: Option<Box<Node<T>>>,
149}