pub mod nodes {
#[derive(Debug, Clone)]
pub struct Node<T>
where
T: Clone,
{
next: Box<Option<Node<T>>>,
prev: Box<Option<Node<T>>>,
val: T,
}
impl<T: std::clone::Clone> Node<T> {
pub fn new(next: Option<Node<T>>, prev: Option<Node<T>>, val: T) -> Node<T> {
Node {
next: Box::new(next),
prev: Box::new(prev),
val,
}
}
pub fn get_prev(&self) -> Option<Node<T>> {
*self.prev.clone()
}
pub fn set_prev(&mut self, new_prev: Option<Node<T>>) {
self.prev = Box::new(new_prev);
}
pub fn get_next(&self) -> Option<Node<T>> {
*self.next.clone()
}
pub fn set_next(&mut self, new_next: Option<Node<T>>) {
self.next = Box::new(new_next);
}
pub fn get_val(&self) -> T {
self.val.clone()
}
pub fn set_val(&mut self, new_val: T) {
self.val = new_val;
}
}
}
pub mod stacks {
use crate::stack::nodes::Node;
#[derive(Debug, Clone)]
pub struct Stack<T: std::clone::Clone> {
top: Option<Node<T>>,
len: usize,
}
impl<T: std::clone::Clone> Stack<T> {
pub fn new() -> Stack<T> {
Stack { top: None, len: 0 }
}
pub fn push(&mut self, val: T) {
let new_top: Node<T> = Node::new(None, self.top.clone(), val);
self.top = Some(new_top);
self.len += 1;
}
pub fn pop(&mut self) -> Option<T> {
if self.len == 0 {
return None;
}
match self.top.clone() {
Some(top) => {
let retval = top.get_val().clone();
let new_top = match top.clone().get_prev() {
Some(mut n) => {
n.set_next(None);
Some(n)
}
None => None,
};
self.top = new_top;
self.len -= 1;
Some(retval)
}
None => None,
}
}
pub fn len(&self) -> usize {
self.len
}
}
#[derive(Debug, Clone)]
pub struct Queue<T: Clone> {
top: Option<Node<T>>,
bottom: Option<Node<T>>,
len: usize,
}
impl<T: Clone> Queue<T> {
pub fn new() -> Queue<T> {
Queue {
top: None,
bottom: None,
len: 0,
}
}
pub fn push(&mut self, val: T) {
let new_top: Node<T> = Node::new(None, self.top.clone(), val);
self.top = Some(new_top.clone());
if self.len == 0 {
self.bottom = Some(new_top.clone());
} else if self.len == 1 {
self.bottom = Some(Node::new(self.top.clone(), None, self.bottom.clone().unwrap().get_val()))
}
self.len += 1;
}
pub fn pop(&mut self) -> Option<T> {
if self.len == 0 {
return None;
}
match self.bottom.clone() {
Some(bottom) => {
let val = bottom.get_val().clone();
let new_bottom = match bottom.clone().get_next() {
Some(mut n) => {
n.set_prev(None);
Some(n)
}
None => None,
};
self.bottom = new_bottom;
self.len -= 1;
Some(val)
}
None => None,
}
}
pub fn len(&self) -> usize {
self.len
}
}
}