u
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
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 }
|
||||
Reference in New Issue
Block a user