pub struct Stack { head: Link, } enum Link { Empty, More(Box>), } struct Node { data: T, next: Link, } impl Stack { 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 { match std::mem::replace(&mut self.head, Link::Empty) { Link::Empty => None, Link::More(node) => { self.head = node.next; Some(node.data) } } } } impl Iterator for Stack { type Item = T; fn next(&mut self) -> Option { self.pop() } }