rocal_ui/data_types/
stack.rs1use std::{cell::RefCell, rc::Rc};
2
3#[derive(Debug)]
4pub struct Stack<T>
5where
6 T: Clone,
7{
8 top: Option<Rc<RefCell<LinkedList<T>>>>,
9 pub len: u64,
10}
11
12impl<T> Stack<T>
13where
14 T: Clone,
15{
16 pub fn new() -> Self {
17 Self { top: None, len: 0 }
18 }
19
20 pub fn push(&mut self, node: T) {
21 let node = Rc::new(RefCell::new(LinkedList {
22 next: self.top.clone(),
23 value: node,
24 }));
25
26 self.top = Some(node.clone());
27 self.len += 1;
28 }
29
30 pub fn pop(&mut self) -> Option<T> {
31 if let Some(top) = self.top.clone() {
32 self.top = top.borrow().next.clone();
33 self.len -= 1;
34 Some(top.borrow().get_value().to_owned())
35 } else {
36 None
37 }
38 }
39
40 pub fn peek(&self) -> Option<T> {
41 if let Some(top) = self.top.clone() {
42 Some(top.borrow().get_value().to_owned())
43 } else {
44 None
45 }
46 }
47}
48
49#[derive(Debug)]
50struct LinkedList<T>
51where
52 T: Clone,
53{
54 next: Option<Rc<RefCell<LinkedList<T>>>>,
55 value: T,
56}
57
58impl<T> LinkedList<T>
59where
60 T: Clone,
61{
62 pub fn get_value(&self) -> &T {
63 &self.value
64 }
65}