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  }