package ds // ds-stack.go // 泛型切片栈。Push/Pop/Peek 均 O(1)。 // Pop 前先读值再缩切片,并把被弹出位置置零,避免底层数组持有引用导致内存泄漏。 // Stack 泛型栈,零值可用。 type Stack[T any] struct { data []T } // Push 入栈。 func (s *Stack[T]) Push(v T) { s.data = append(s.data, v) } // Pop 出栈;空栈返回零值和 false。 func (s *Stack[T]) Pop() (T, bool) { var zero T if len(s.data) == 0 { return zero, false } n := len(s.data) - 1 v := s.data[n] s.data[n] = zero // 置零,释放引用 s.data = s.data[:n] return v, true } // Peek 查看栈顶,不移除;空栈返回零值和 false。 func (s *Stack[T]) Peek() (T, bool) { var zero T if len(s.data) == 0 { return zero, false } return s.data[len(s.data)-1], true } // Len 栈元素个数。 func (s *Stack[T]) Len() int { return len(s.data) } // Empty 是否为空。 func (s *Stack[T]) Empty() bool { return len(s.data) == 0 }