Stacks
A stack is a collection that is based on the Last In First Out (LIFO) policy.
The following figure presents a sample stack:
To implement a simple functional stack, we need to provide push
, pop
, isEmpty
, and size
operations. We implemented a functional LinkedList
in the previous section, which can be used to implement a simple functional stack with the following operations:
- push: The cons operation in
LinkedList
- pop:
- isEmpty: The isEmpty operation in
LinkedList
- size: The size method in
LinkedList
As seen here, the only operation that is missing is pop
. Let's implement that:
func pop() -> (element: Element, list: Stack)? { switch self { case .node(let data, let next): return (data, next) case .end: return nil } }
To test this, we can execute the following:
let stack = Stack<Int>.end.cons(1).cons(2).cons(3) if let (elment, stack) = stack.pop() { print(elment) if let newStack = stack.pop() { print(newStack) } else { ...