1#[derive(Debug)]
2pub struct Stack<T> {
3 size: usize,
4 data: Vec<T>,
5}
6
7impl<T> Stack<T> {
8 pub fn new() -> Self {
9 Stack {
10 size: 0,
11 data: Vec::new(),
12 }
13 }
14
15 pub fn is_empty(&self) -> bool {
16 self.size == 0
17 }
18
19 pub fn push(&mut self, item: T) {
20 self.data.push(item);
21 self.size += 1;
22 }
23
24 pub fn pop(&mut self) -> Option<T> {
25 if self.size == 0 {
26 None
27 } else {
28 self.size -= 1;
29 self.data.pop()
30 }
31 }
32
33 pub fn peek(&self) -> Option<&T> {
34 if self.size == 0 {
35 None
36 } else {
37 self.data.last()
38 }
39 }
40
41 pub fn size(&self) -> usize {
42 self.size
43 }
44
45 pub fn clear(&mut self) {
46 self.data.clear();
47 }
48
49 pub fn into_iter(self) -> IntoIter<T> {
50 IntoIter(self)
51 }
52
53 pub fn iter(&self) -> Iter<T> {
54 Iter {
55 stack: self.data.iter().collect(),
56 }
57 }
58
59 pub fn iter_mut(&mut self) -> IterMut<T> {
60 IterMut {
61 stack: self.data.iter_mut().collect(),
62 }
63 }
64}
65
66pub struct IntoIter<T>(Stack<T>);
67impl<T: Clone> Iterator for IntoIter<T> {
68 type Item = T;
69
70 fn next(&mut self) -> Option<Self::Item> {
71 if self.0.is_empty() {
72 None
73 } else {
74 self.0.size -= 1;
75 self.0.data.pop()
76 }
77 }
78}
79
80pub struct Iter<'a, T: 'a> {
81 stack: Vec<&'a T>,
82}
83impl<'a, T> Iterator for Iter<'a, T> {
84 type Item = &'a T;
85
86 fn next(&mut self) -> Option<Self::Item> {
87 self.stack.pop()
88 }
89}
90pub struct IterMut<'a, T: 'a> {
91 stack: Vec<&'a mut T>,
92}
93impl<'a, T> Iterator for IterMut<'a, T> {
94 type Item = &'a mut T;
95
96 fn next(&mut self) -> Option<Self::Item> {
97 self.stack.pop()
98 }
99}
100
101#[cfg(test)]
102mod tests {
103 use super::*;
104
105 #[test]
106 fn test_stack_new() {
107 let stack = Stack::<i32>::new();
108
109 assert_eq!(stack.size, 0);
110 }
111 #[test]
112 fn test_stack_is_empty() {
113 let stack = Stack::<i32>::new();
114
115 assert!(stack.is_empty());
116 }
117
118 #[test]
119 fn test_stack_push() {
120 let mut stack = Stack::<i32>::new();
121 stack.push(1);
122 stack.push(2);
123 stack.push(3);
124
125 assert_eq!(stack.size, 3);
126 }
127
128 #[test]
129 fn test_stack_pop() {
130 let mut stack = Stack::<i32>::new();
131 stack.push(1);
132 stack.push(2);
133 stack.push(3);
134
135 assert_eq!(stack.pop(), Some(3));
136 }
137
138 #[test]
139 fn test_stack_peek() {
140 let mut stack = Stack::<i32>::new();
141 stack.push(1);
142 stack.push(2);
143 stack.push(3);
144
145 assert_eq!(stack.peek(), Some(&3));
146 }
147
148 #[test]
149 fn test_stack_into_iter() {
150 let mut stack = Stack::<i32>::new();
151 stack.push(1);
152 stack.push(2);
153 stack.push(3);
154
155 let mut iter = stack.into_iter();
156 assert_eq!(iter.next(), Some(3));
157 assert_eq!(iter.next(), Some(2));
158 assert_eq!(iter.next(), Some(1));
159 assert_eq!(iter.next(), None);
160 }
161
162 #[test]
163 fn test_stack_iter() {
164 let mut stack = Stack::<i32>::new();
165 stack.push(1);
166 stack.push(2);
167 stack.push(3);
168
169 let mut iter = stack.iter();
170 assert_eq!(iter.next(), Some(&3));
171 assert_eq!(iter.next(), Some(&2));
172 assert_eq!(iter.next(), Some(&1));
173 assert_eq!(iter.next(), None);
174 }
175
176 #[test]
177 fn test_stack_iter_mut() {
178 let mut stack = Stack::<i32>::new();
179 stack.push(1);
180 stack.push(2);
181 stack.push(3);
182
183 let mut iter = stack.iter_mut();
184
185 assert_eq!(iter.next(), Some(&mut 3));
186 assert_eq!(iter.next(), Some(&mut 2));
187 assert_eq!(iter.next(), Some(&mut 1));
188 }
189}