pub struct Stack<T> {
data: [Option<T>; 100],
top: isize,
}
impl<T> Stack<T> {
pub fn new() -> Self {
Stack {
data: [(); 100].map(|_| None),
top: -1,
}
}
pub fn push(&mut self, value: T) -> Result<(), &str> {
if self.top + 1 >= self.data.len() as isize {
Err("Stack Overflow")
} else {
self.top += 1;
self.data[self.top as usize] = Some(value);
Ok(())
}
}
pub fn pop(&mut self) -> Option<T> {
if self.top == -1 {
None
} else {
let value = self.data[self.top as usize].take();
self.top -= 1;
value
}
}
pub fn peek(&self) -> Option<&T> {
if self.top == -1 {
None
} else {
self.data[self.top as usize].as_ref()
}
}
pub fn is_empty(&self) -> bool {
self.top == -1
}
pub fn size(&self) -> isize { self.top + 1 }
}