u
This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
package ds
|
||||
|
||||
// ds-deque.go
|
||||
// 泛型双端队列,基于环形缓冲。PushFront/PushBack/PopFront/PopBack 全 O(1) 均摊。
|
||||
// 当容量不足时扩容为 2 倍,自动重新对齐。
|
||||
|
||||
// Deque 双端队列,零值可用。
|
||||
type Deque[T any] struct {
|
||||
buf []T
|
||||
head int // 队首索引,逆时针(向后)增长
|
||||
tail int // 队尾索引 +1
|
||||
n int // 元素个数
|
||||
}
|
||||
|
||||
// Len 元素个数。
|
||||
func (d *Deque[T]) Len() int { return d.n }
|
||||
|
||||
// Empty 是否为空。
|
||||
func (d *Deque[T]) Empty() bool { return d.n == 0 }
|
||||
|
||||
// PushBack 尾部插入。
|
||||
func (d *Deque[T]) PushBack(v T) {
|
||||
d.grow()
|
||||
d.buf[d.tail] = v
|
||||
d.tail = (d.tail + 1) % len(d.buf)
|
||||
d.n++
|
||||
}
|
||||
|
||||
// PushFront 头部插入。
|
||||
func (d *Deque[T]) PushFront(v T) {
|
||||
d.grow()
|
||||
d.head = (d.head - 1 + len(d.buf)) % len(d.buf)
|
||||
d.buf[d.head] = v
|
||||
d.n++
|
||||
}
|
||||
|
||||
// PopBack 尾部弹出;空返回零值和 false。
|
||||
func (d *Deque[T]) PopBack() (T, bool) {
|
||||
var zero T
|
||||
if d.n == 0 {
|
||||
return zero, false
|
||||
}
|
||||
d.tail = (d.tail - 1 + len(d.buf)) % len(d.buf)
|
||||
v := d.buf[d.tail]
|
||||
d.buf[d.tail] = zero
|
||||
d.n--
|
||||
return v, true
|
||||
}
|
||||
|
||||
// PopFront 头部弹出;空返回零值和 false。
|
||||
func (d *Deque[T]) PopFront() (T, bool) {
|
||||
var zero T
|
||||
if d.n == 0 {
|
||||
return zero, false
|
||||
}
|
||||
v := d.buf[d.head]
|
||||
d.buf[d.head] = zero
|
||||
d.head = (d.head + 1) % len(d.buf)
|
||||
d.n--
|
||||
return v, true
|
||||
}
|
||||
|
||||
// Front 查看头部,不移除。
|
||||
func (d *Deque[T]) Front() (T, bool) {
|
||||
var zero T
|
||||
if d.n == 0 {
|
||||
return zero, false
|
||||
}
|
||||
return d.buf[d.head], true
|
||||
}
|
||||
|
||||
// Back 查看尾部,不移除。
|
||||
func (d *Deque[T]) Back() (T, bool) {
|
||||
var zero T
|
||||
if d.n == 0 {
|
||||
return zero, false
|
||||
}
|
||||
return d.buf[(d.tail-1+len(d.buf))%len(d.buf)], true
|
||||
}
|
||||
|
||||
// grow 容量不足时扩容并重新对齐。
|
||||
func (d *Deque[T]) grow() {
|
||||
if d.buf == nil {
|
||||
d.buf = make([]T, 8)
|
||||
return
|
||||
}
|
||||
if d.n < len(d.buf) {
|
||||
return
|
||||
}
|
||||
oldCap := len(d.buf)
|
||||
newCap := oldCap * 2
|
||||
nb := make([]T, newCap)
|
||||
// 把 head..head+n 的环形数据复制到新缓冲区前端。
|
||||
for i := 0; i < d.n; i++ {
|
||||
nb[i] = d.buf[(d.head+i)%oldCap]
|
||||
}
|
||||
d.buf = nb
|
||||
d.head = 0
|
||||
d.tail = d.n
|
||||
}
|
||||
Reference in New Issue
Block a user