You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.1 KiB
51 lines
1.1 KiB
package container
|
|
|
|
// LimitedQueue 是一个具有有限容量的泛型队列
|
|
type LimitedQueue[T any] struct {
|
|
capacity int
|
|
queue []T
|
|
}
|
|
|
|
// NewLimitedQueue 创建一个新的 LimitedQueue
|
|
func NewLimitedQueue[T any](capacity int) *LimitedQueue[T] {
|
|
return &LimitedQueue[T]{
|
|
capacity: capacity,
|
|
queue: make([]T, 0, capacity),
|
|
}
|
|
}
|
|
|
|
// Enqueue 向队列中添加一个元素
|
|
func (lq *LimitedQueue[T]) Enqueue(value T) {
|
|
if len(lq.queue) >= lq.capacity {
|
|
lq.queue = lq.queue[1:]
|
|
}
|
|
lq.queue = append(lq.queue, value)
|
|
}
|
|
|
|
// Dequeue 从队列中移除最早添加的元素
|
|
func (lq *LimitedQueue[T]) Dequeue() *T {
|
|
if len(lq.queue) == 0 {
|
|
return nil
|
|
}
|
|
elem := lq.queue[0]
|
|
lq.queue = lq.queue[1:]
|
|
return &elem
|
|
}
|
|
|
|
// Len 返回队列的长度
|
|
func (lq *LimitedQueue[T]) Len() int {
|
|
return len(lq.queue)
|
|
}
|
|
|
|
// Peek 返回队列的第一个元素但不移除它
|
|
func (lq *LimitedQueue[T]) Peek() *T {
|
|
if len(lq.queue) == 0 {
|
|
return nil
|
|
}
|
|
return &lq.queue[0]
|
|
}
|
|
|
|
// ToSlice 返回队列中所有元素的切片
|
|
func (lq *LimitedQueue[T]) ToSlice() []T {
|
|
return append([]T(nil), lq.queue...)
|
|
}
|
|
|