use alloc::vec::Vec;
#[derive(Debug)]
pub struct Stack<T> {
data: Vec<T>,
top: usize,
}
impl<T: Clone> Default for Stack<T> {
fn default() -> Self {
Self::new()
}
}
impl<T: Clone> Stack<T> {
pub fn new() -> Stack<T> {
Self {
data: Vec::new(),
top: 0,
}
}
pub fn is_empty(&self) -> bool {
self.top == 0
}
pub fn push(&mut self, element: T) {
self.top += 1;
self.data.push(element);
}
pub fn pop(&mut self) -> anyhow::Result<T> {
if self.is_empty() {
Err(anyhow::anyhow!("underflow"))
} else {
self.top -= 1;
Ok(self.data.remove(self.top))
}
}
pub fn peek(&self) -> Option<&T> {
if self.is_empty() {
return None;
}
self.data.get(self.top - 1)
}
pub fn size(&self) -> usize {
self.top
}
}