algo-rs 0.1.0

Set of data structures and algorithms.
Documentation
use crate::data_structure::stack::Stack;

pub struct FixedStack<T> {
    inner: Vec<T>,
    size: usize,
}

impl<T> FixedStack<T> {
    pub fn new(size: usize) -> Self {
        Self {
            size,
            inner: Vec::<T>::with_capacity(size),
        }
    }
}

impl<T> Stack<T> for FixedStack<T> {
    fn push(&mut self, item: T) {
        if self.inner.len() == self.size {
            panic!("stack is full")
        }
        self.inner.push(item);
    }

    fn pop(&mut self) -> Option<T> {
        self.inner.pop()
    }

    fn top(&self) -> Option<&T> {
        self.inner.last()
    }

    fn is_empty(&self) -> bool {
        self.inner.is_empty()
    }
}

#[cfg(test)]
mod tests {
    use crate::data_structure::stack::fixed_stack::FixedStack;
    use crate::data_structure::stack::Stack;

    #[test]
    fn test_push_pop() {
        let mut stack = FixedStack::<i32>::new(10);
        stack.push(1);
        stack.push(2);
        stack.push(3);
        assert_eq!(Some(3), stack.pop());
        assert_eq!(Some(2), stack.pop());
        assert_eq!(Some(1), stack.pop());
        assert_eq!(None, stack.pop());
    }

    #[test]
    fn test_is_empty() {
        let mut stack = FixedStack::<i32>::new(10);
        assert_eq!(true, stack.is_empty());
        stack.push(1);
        assert_eq!(false, stack.is_empty());
        stack.pop();
        assert_eq!(true, stack.is_empty());
    }

    #[test]
    #[should_panic(expected = "stack is full")]
    fn test_push_full_stack() {
        let mut stack = FixedStack::new(0);
        stack.push(1);
    }

    #[test]
    fn test_top() {
        let mut stack = FixedStack::<i32>::new(3);
        assert_eq!(None, stack.top());
        stack.push(1);
        assert_eq!(Some(&1), stack.top());
        stack.push(2);
        assert_eq!(Some(&2), stack.top());
        stack.pop();
        assert_eq!(Some(&1), stack.top());
        stack.pop();
        assert_eq!(None, stack.top());
    }
}