44 lines
		
	
	
		
			827 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			44 lines
		
	
	
		
			827 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
pub struct Stack<T> {
 | 
						|
    head: Link<T>,
 | 
						|
}
 | 
						|
 | 
						|
enum Link<T> {
 | 
						|
    Empty,
 | 
						|
    More(Box<Node<T>>),
 | 
						|
}
 | 
						|
 | 
						|
struct Node<T> {
 | 
						|
    data: T,
 | 
						|
    next: Link<T>,
 | 
						|
}
 | 
						|
 | 
						|
impl<T> Stack<T> {
 | 
						|
    pub fn new() -> Self {
 | 
						|
        Stack { head: Link::Empty }
 | 
						|
    }
 | 
						|
 | 
						|
    pub fn push(&mut self, data: T) {
 | 
						|
        self.head = Link::More(Box::new(Node {
 | 
						|
            data,
 | 
						|
            next: std::mem::replace(&mut self.head, Link::Empty),
 | 
						|
        }));
 | 
						|
    }
 | 
						|
 | 
						|
    pub fn pop(&mut self) -> Option<T> {
 | 
						|
        match std::mem::replace(&mut self.head, Link::Empty) {
 | 
						|
            Link::Empty => None,
 | 
						|
            Link::More(node) => {
 | 
						|
                self.head = node.next;
 | 
						|
                Some(node.data)
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
impl<T> Iterator for Stack<T> {
 | 
						|
    type Item = T;
 | 
						|
    fn next(&mut self) -> Option<Self::Item> {
 | 
						|
        self.pop()
 | 
						|
    }
 | 
						|
}
 |