2019-09-20 11:37:38 +02:00
|
|
|
pub trait Stackable {
|
2019-09-19 23:05:17 +02:00
|
|
|
type Item;
|
2019-09-19 00:18:36 +02:00
|
|
|
|
2019-09-19 23:05:17 +02:00
|
|
|
fn is_empty(&self) -> bool;
|
|
|
|
fn as_slice(&self) -> &[Self::Item];
|
|
|
|
fn push(&mut self, item: Self::Item);
|
|
|
|
fn pop1(&mut self) -> Option<Self::Item>;
|
|
|
|
fn pop(&mut self, n: usize) -> Option<Vec<Self::Item>>;
|
2019-09-19 00:18:36 +02:00
|
|
|
}
|
|
|
|
|
2019-09-20 11:55:19 +02:00
|
|
|
#[derive(Debug, Default)]
|
|
|
|
pub struct Stack<T>
|
|
|
|
where
|
|
|
|
T: Default,
|
|
|
|
{
|
2019-09-19 23:05:17 +02:00
|
|
|
inner: Vec<T>,
|
|
|
|
}
|
|
|
|
|
2019-09-20 11:55:19 +02:00
|
|
|
impl<T> Stack<T>
|
|
|
|
where
|
|
|
|
T: Default,
|
|
|
|
{
|
2019-09-19 23:05:17 +02:00
|
|
|
pub fn new() -> Self {
|
2019-09-20 11:55:19 +02:00
|
|
|
Self {
|
|
|
|
..Default::default()
|
|
|
|
}
|
2019-09-19 00:18:36 +02:00
|
|
|
}
|
2019-09-19 23:05:17 +02:00
|
|
|
}
|
|
|
|
|
2019-09-20 11:55:19 +02:00
|
|
|
impl<T> Stackable for Stack<T>
|
|
|
|
where
|
|
|
|
T: Default,
|
|
|
|
{
|
2019-09-19 23:05:17 +02:00
|
|
|
type Item = T;
|
2019-09-19 00:18:36 +02:00
|
|
|
|
2019-09-19 23:05:17 +02:00
|
|
|
fn is_empty(&self) -> bool {
|
2019-09-19 00:18:36 +02:00
|
|
|
self.inner.is_empty()
|
|
|
|
}
|
|
|
|
|
2019-09-19 23:05:17 +02:00
|
|
|
fn as_slice(&self) -> &[Self::Item] {
|
|
|
|
self.inner.as_slice()
|
|
|
|
}
|
|
|
|
|
|
|
|
fn push(&mut self, item: Self::Item) {
|
2019-09-19 00:18:36 +02:00
|
|
|
self.inner.push(item);
|
|
|
|
}
|
|
|
|
|
2019-09-19 23:05:17 +02:00
|
|
|
fn pop1(&mut self) -> Option<Self::Item> {
|
2019-09-19 00:18:36 +02:00
|
|
|
self.inner.pop()
|
|
|
|
}
|
|
|
|
|
2019-09-19 23:05:17 +02:00
|
|
|
fn pop(&mut self, n: usize) -> Option<Vec<Self::Item>> {
|
|
|
|
if self.inner.len() < n {
|
|
|
|
None
|
|
|
|
} else {
|
|
|
|
let items = self
|
|
|
|
.inner
|
|
|
|
.drain(self.inner.len() - n..)
|
|
|
|
.rev()
|
|
|
|
.collect::<Vec<Self::Item>>();
|
|
|
|
|
|
|
|
assert!(items.len() == n);
|
|
|
|
|
|
|
|
Some(items)
|
|
|
|
}
|
2019-09-19 00:18:36 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
mod tests {
|
2019-09-19 23:05:17 +02:00
|
|
|
use super::{Stack, Stackable};
|
2019-09-19 00:18:36 +02:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_is_empty() {
|
|
|
|
let mut stack = Stack::new();
|
|
|
|
assert_eq!(stack.is_empty(), true);
|
|
|
|
|
|
|
|
stack.push(1);
|
|
|
|
assert_eq!(stack.is_empty(), false);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
2019-09-19 23:05:17 +02:00
|
|
|
fn test_push_pop1() {
|
2019-09-19 00:18:36 +02:00
|
|
|
let mut stack = Stack::new();
|
|
|
|
stack.push(1);
|
|
|
|
|
2019-09-19 23:05:17 +02:00
|
|
|
assert_eq!(stack.pop1(), Some(1));
|
2019-09-19 00:18:36 +02:00
|
|
|
assert_eq!(stack.is_empty(), true);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
2019-09-19 23:05:17 +02:00
|
|
|
fn test_pop() {
|
2019-09-19 00:18:36 +02:00
|
|
|
let mut stack = Stack::new();
|
|
|
|
stack.push(1);
|
|
|
|
stack.push(2);
|
|
|
|
stack.push(3);
|
|
|
|
stack.push(4);
|
|
|
|
stack.push(5);
|
|
|
|
stack.push(6);
|
|
|
|
|
2019-09-19 23:05:17 +02:00
|
|
|
assert_eq!(stack.pop(1), Some(vec![6]));
|
|
|
|
assert_eq!(stack.pop(2), Some(vec![5, 4]));
|
|
|
|
assert_eq!(stack.pop(3), Some(vec![3, 2, 1]));
|
2019-09-19 00:18:36 +02:00
|
|
|
assert_eq!(stack.is_empty(), true);
|
|
|
|
}
|
|
|
|
}
|