package diffmatchpatch import ( "fmt" ) type Stack struct { top *Element size int } type Element struct { value interface{} next *Element } // Len returns the stack's length func (s *Stack) Len() int { return s.size } // Push appends a new element onto the stack func (s *Stack) Push(value interface{}) { s.top = &Element{value, s.top} s.size++ } // Pop removes the top element from the stack and return its value // If the stack is empty, return nil func (s *Stack) Pop() (value interface{}) { if s.size > 0 { value, s.top = s.top.value, s.top.next s.size-- return } return nil } // Peek returns the value of the element on the top of the stack // but don't remove it. If the stack is empty, return nil func (s *Stack) Peek() (value interface{}) { if s.size > 0 { value = s.top.value return } return -1 } // Clear empties the stack func (s *Stack) Clear() { s.top = nil s.size = 0 } func main() { stack := new(Stack) stack.Push("Things") stack.Push("and") stack.Push("Stuff") for stack.Len() > 0 { fmt.Printf("%s ", stack.Pop().(string)) } fmt.Println() }