pub struct SequentialStack<T>{
capacity:usize,
data:Vec<T>,
top:usize,
}
impl<T> SequentialStack<T>{
pub fn new(capacity:usize)->SequentialStack<T>{
SequentialStack { capacity, data:Vec::with_capacity(capacity), top:0 }
}
pub fn is_empty(&self)->bool{
self.top==0
}
pub fn is_full(&self)->bool{
self.top>=self.capacity
}
pub fn push(&mut self,item:T)->Result<(),&'static str>{
if self.is_full(){
return Err("栈满!!!");
}
self.data.push(item);
self.top +=1;
Ok(())
}
pub fn pop(&mut self)->Result<T,&'static str>{
if self.is_empty() {
return Err("空栈!!!");
}
self.top -=1;
Ok(self.data.pop().unwrap())
}
pub fn get_top(&self)->Option<&T>{
if self. is_empty(){
return None;
}
Some(&self.data[self.top-1])
}
pub fn get_top_mut(&mut self)->Option<&mut T>{
if self.is_empty() {
return None;
}
Some(&mut self.data[self.top-1])
}
}
#[cfg(test)]
mod test{
use crate::linear::stack::SequentialStack;
#[test]
fn stack(){
let mut stack=SequentialStack::<i32>::new(10);
for i in 0..10 {
let item=10+i;
stack.push(item).unwrap();
}
assert_eq!(stack.top,10);
assert_eq!(stack.top,stack.data.len());
let item=stack.pop().unwrap();
assert_eq!(item,19);
assert_eq!(stack.top,9);
assert_eq!(stack.top,stack.data.len());
assert_eq!(*stack.get_top().unwrap(),18);
let item=stack.get_top_mut().unwrap();
*item +=100;
assert_eq!(*item,118);
}
}