42 lines
963 B
Go
42 lines
963 B
Go
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 }
|