#[derive(Debug)]
pub struct Stack<T> {
size: usize,
data: Vec<T>,
}
impl<T> Stack<T> {
pub fn new() -> Self {
Stack {
size: 0,
data: Vec::new(),
}
}
pub fn is_empty(&self) -> bool {
self.size == 0
}
pub fn push(&mut self, item: T) {
self.data.push(item);
self.size += 1;
}
pub fn pop(&mut self) -> Option<T> {
if self.size == 0 {
None
} else {
self.size -= 1;
self.data.pop()
}
}
pub fn peek(&self) -> Option<&T> {
if self.size == 0 {
None
} else {
self.data.last()
}
}
pub fn size(&self) -> usize {
self.size
}
pub fn clear(&mut self) {
self.data.clear();
}
pub fn into_iter(self) -> IntoIter<T> {
IntoIter(self)
}
pub fn iter(&self) -> Iter<T> {
Iter {
stack: self.data.iter().collect(),
}
}
pub fn iter_mut(&mut self) -> IterMut<T> {
IterMut {
stack: self.data.iter_mut().collect(),
}
}
}
pub struct IntoIter<T>(Stack<T>);
impl<T: Clone> Iterator for IntoIter<T> {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
if self.0.is_empty() {
None
} else {
self.0.size -= 1;
self.0.data.pop()
}
}
}
pub struct Iter<'a, T: 'a> {
stack: Vec<&'a T>,
}
impl<'a, T> Iterator for Iter<'a, T> {
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
self.stack.pop()
}
}
pub struct IterMut<'a, T: 'a> {
stack: Vec<&'a mut T>,
}
impl<'a, T> Iterator for IterMut<'a, T> {
type Item = &'a mut T;
fn next(&mut self) -> Option<Self::Item> {
self.stack.pop()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_stack_new() {
let stack = Stack::<i32>::new();
assert_eq!(stack.size, 0);
}
#[test]
fn test_stack_is_empty() {
let stack = Stack::<i32>::new();
assert!(stack.is_empty());
}
#[test]
fn test_stack_push() {
let mut stack = Stack::<i32>::new();
stack.push(1);
stack.push(2);
stack.push(3);
assert_eq!(stack.size, 3);
}
#[test]
fn test_stack_pop() {
let mut stack = Stack::<i32>::new();
stack.push(1);
stack.push(2);
stack.push(3);
assert_eq!(stack.pop(), Some(3));
}
#[test]
fn test_stack_peek() {
let mut stack = Stack::<i32>::new();
stack.push(1);
stack.push(2);
stack.push(3);
assert_eq!(stack.peek(), Some(&3));
}
#[test]
fn test_stack_into_iter() {
let mut stack = Stack::<i32>::new();
stack.push(1);
stack.push(2);
stack.push(3);
let mut iter = stack.into_iter();
assert_eq!(iter.next(), Some(3));
assert_eq!(iter.next(), Some(2));
assert_eq!(iter.next(), Some(1));
assert_eq!(iter.next(), None);
}
#[test]
fn test_stack_iter() {
let mut stack = Stack::<i32>::new();
stack.push(1);
stack.push(2);
stack.push(3);
let mut iter = stack.iter();
assert_eq!(iter.next(), Some(&3));
assert_eq!(iter.next(), Some(&2));
assert_eq!(iter.next(), Some(&1));
assert_eq!(iter.next(), None);
}
#[test]
fn test_stack_iter_mut() {
let mut stack = Stack::<i32>::new();
stack.push(1);
stack.push(2);
stack.push(3);
let mut iter = stack.iter_mut();
assert_eq!(iter.next(), Some(&mut 3));
assert_eq!(iter.next(), Some(&mut 2));
assert_eq!(iter.next(), Some(&mut 1));
}
}