代码拉取完成,页面将自动刷新
package queue
type ResetFunc func()
var _ Queue = (*Circular)(nil)
// Circular 环型队列
type Circular struct {
resetFunc ResetFunc
items []interface{}
head int
tail int
size int
isFull bool
}
func NewCircular(size int, resetFunc ResetFunc) *Circular {
return &Circular{
resetFunc: resetFunc,
items: make([]interface{}, size),
size: size,
}
}
func (cr *Circular) Add(it interface{}) error {
if cr.size == 0 {
return ErrIsReleased
}
if cr.isFull {
return ErrIsFull
}
cr.items[cr.tail] = it
cr.tail++
if cr.tail == cr.size {
cr.tail = 0
}
if cr.tail == cr.head {
cr.isFull = true
}
return nil
}
func (cr *Circular) Pop() interface{} {
if cr.Empty() {
return nil
}
w := cr.items[cr.head]
cr.items[cr.head] = nil
cr.head++
if cr.head == cr.size {
cr.head = 0
}
cr.isFull = false
return w
}
func (cr *Circular) Peek() interface{} {
if cr.Empty() {
return nil
}
return cr.items[cr.head]
}
func (cr *Circular) Len() int {
if cr.size == 0 {
return 0
}
if cr.head == cr.tail {
if cr.isFull {
return cr.size
}
return 0
}
if cr.tail > cr.head {
return cr.tail - cr.head
}
return cr.size - cr.head + cr.tail
}
// Find return index -1 not found.
func (cr *Circular) Find(fn IndexFunc) (interface{}, int) {
var (
cursor = -1
va interface{}
)
for {
va, cursor = cr.Next(cursor)
if cursor == -1 {
break
}
if fn(va, cursor) {
return va, cursor
}
}
return nil, -1
}
func (cr *Circular) Empty() bool {
return cr.head == cr.tail && !cr.isFull
}
func (cr *Circular) Next(index int) (interface{}, int) {
if cr.Empty() {
return nil, -1
}
if index < 0 {
index = cr.head
}
if index == cr.tail {
return nil, -1
}
w := cr.items[index]
index++
if index == cr.size {
index = 0
}
return w, index
}
func (cr *Circular) Reset() {
if cr.Empty() {
return
}
if cr.resetFunc != nil {
cr.resetFunc()
}
cr.items = make([]interface{}, cr.size)
cr.head = 0
cr.tail = 0
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。