#[derive(Debug)]
pub struct OrderedStack {
pub items: Vec<i32>,
}
impl OrderedStack {
pub fn new() -> Self {
Self { items: Vec::new() }
}
pub fn is_empty(&self) -> bool {
self.items.is_empty()
}
pub fn push_direct(&mut self, item: i32) {
self.items.push(item);
}
pub fn peek(&self) -> Option<i32> {
self.items.last().copied()
}
pub fn push(&mut self, item: i32) {
let mut temp_stack = OrderedStack::new();
match self.peek() {
None => self.push_direct(item),
Some(top) if item > top => self.push_direct(item),
Some(_) => {
while !self.is_empty()
&& item < self.peek().unwrap()
{
temp_stack.push_direct(self.pop().unwrap());
}
self.push_direct(item);
while let Some(value) = temp_stack.pop() {
self.push_direct(value);
}
}
}
}
pub fn pop(&mut self) -> Option<i32> {
self.items.pop()
}
pub fn size(&self) -> usize {
self.items.len()
}
}