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}