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 { 
  ...