github.com/frodejac/aoc-2022@v0.0.0-20221213081734-037c741b1c89/pkg/datastructures/stack/stack.go (about) 1 package stack 2 3 type Stack[T any] struct { 4 values []T 5 } 6 7 func New[T any](values []T) *Stack[T] { 8 return &Stack[T]{values: values} 9 } 10 11 func (s *Stack[T]) Push(value T) { 12 s.values = append(s.values, value) 13 } 14 15 func (s *Stack[T]) PushLeft(value T) { 16 s.values = append([]T{value}, s.values...) 17 } 18 19 func (s *Stack[T]) Pop() T { 20 if len(s.values) == 0 { 21 panic("stack is empty") 22 } 23 value := s.values[len(s.values)-1] 24 s.values = s.values[:len(s.values)-1] 25 return value 26 } 27 28 func (s *Stack[T]) PopLeft() T { 29 if len(s.values) == 0 { 30 panic("stack is empty") 31 } 32 value := s.values[0] 33 s.values = s.values[1:] 34 return value 35 } 36 37 func (s *Stack[T]) PopN(count int) []T { 38 if len(s.values) < count { 39 panic("not enough values") 40 } 41 values := s.values[len(s.values)-count:] 42 s.values = s.values[:len(s.values)-count] 43 return values 44 } 45 46 func (s *Stack[T]) PushN(values []T) { 47 s.values = append(s.values, values...) 48 } 49 50 func (s *Stack[T]) Peek() T { 51 return s.values[len(s.values)-1] 52 } 53 54 func (s *Stack[T]) Reverse() { 55 for i := 0; i < len(s.values)/2; i++ { 56 s.values[i], s.values[len(s.values)-1-i] = s.values[len(s.values)-1-i], s.values[i] 57 } 58 } 59 60 func (s *Stack[T]) Size() int { 61 return len(s.values) 62 }