얼마전 @dimohy 뵙고 의욕생겨서 해본 ㅎㅎㅎ
Single-Linked 방식으로 만들었습니다.
use std::rc::Rc;
#[derive(Clone)]
pub struct SingleSideNode<T>
{
pub value: T,
pub next_node: NextNode<T>,
}
pub enum NextNode<T>
{
Nil,
Next(Rc<SingleSideNode<T>>),
}
impl<T> Clone for NextNode<T> {
fn clone(&self) -> Self {
match self {
NextNode::Nil => NextNode::Nil,
NextNode::Next(n) => NextNode::Next(n.clone())
}
}
}
impl<T> SingleSideNode<T>
{
pub fn new(x: Option<T>, next: NextNode<T>) -> SingleSideNode<T> {
{
return SingleSideNode
{
value: match x {
Some(v) => v,
None => panic!("Cannot create a node with a None value"),
},
next_node: match next {
NextNode::Nil => { NextNode::Nil }
NextNode::Next(n) => NextNode::Next(n)
},
};
}
}
}
use std::rc::Rc;
use crate::single_side_node::{NextNode, SingleSideNode};
pub struct Stack<T>
where T: Clone
{
pub count: i64,
last: Option<Rc<SingleSideNode<T>>>,
}
impl<'a, T> Stack<T>
where
T: Clone + 'a,
{
pub fn new() -> Stack<T>
{
Stack {
count: 0,
last: None
}
}
pub fn push(&mut self, value: T)
{
self.count += 1;
let mut new_node = SingleSideNode::new(Some(value), NextNode::Nil);
match &self.last {
None => {
self.last = Some(Rc::new(new_node));
}
Some(node) => {
new_node.next_node = NextNode::Next(node.clone());
let strong = Rc::new(new_node);
self.last = Some(strong);
}
}
}
pub fn pop(&mut self) -> Option<T>
{
match &self.last {
None => None,
Some(node) => {
let node = node.clone();
let value = node.value.clone();
self.last = match &node.next_node {
NextNode::Next(n) => Some(n.clone()),
NextNode::Nil => None,
};
self.count -= 1;
Some(value)
}
}
}
}
mod my_stack;
mod single_side_node;
mod single_linked_list;
fn main() {
println!("Hello, world!");
let mut st : my_stack::Stack<i32> = my_stack::Stack::new();
st.push(1);
st.push(5);
st.pop();
st.push(7);
st.pop();
st.push(2);
println!("{:?}", st.pop());
println!("{:?}", st.pop());
println!("{:?}", st.pop());
}
솔직히 잘 되는건지도 잘 모르겠습니다…
틀린 점 보이면 차차 고쳐보려구요…
Output을
Option<T>
로 했습니다.
pop을 과하게 하면(바닥에서 요청 할 경우) None을 리턴 하게 해뒀어요.
Iterator를 넣어서 들어있는 항목 다 보여주는 것도 하고 싶은데 너무 복잡해져서…
24-07-09 수정
다듬으면서 안 쓰는 부분 정리하고,
컴파일러 빌드로 0 warnings 달성!
메모리 누수 걱정도 해 봤는데, Rc 자체가 어느 정도 잡아주지 않을까 싶네요.
이런 부분은 어떻게 신경 써야 할 지 배울게 많다고 느꼈습니다.