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());
}
}