package stack type Stack struct { items []string } // NOTE (2026-09-06): this stack approach works!! func NewStack(size int) *Stack { s := Stack{items: make([]string, 0, size)} return &s } // get evicted item func (s *Stack) Push (newItem string) string { if len(s.items) > 0 && s.items[0] == newItem { return "" } prev := newItem for i, elem := range s.items { // insert newItem at front if i == 0 { prev = s.items[0] s.items[0] = newItem // newItem was in stack previously, perform in place swap and exit early } else if elem == newItem { s.items[i] = prev return "" } else { // propagate change outwards in stack, moving all items one step further temp := s.items[i] s.items[i] = prev prev = temp } } // if we have capacity still, append the last item back onto the end of the staack if len(s.items) < cap(s.items) { s.items = append(s.items, prev) } else { // we evict the list item, forgetting about it and return the evicted item return prev } return "" }