Files
go-pkg/listpkg/list_array.go
2022-03-04 17:24:23 +08:00

86 lines
1.6 KiB
Go

package listpkg
import "sync"
const (
defaultCap = 128
)
// ArrayList 切片实现的队列
type ArrayList struct {
mu *sync.Mutex
data []interface{}
}
func NewArrayList() *ArrayList {
return &ArrayList{
mu: &sync.Mutex{},
data: make([]interface{}, 0, defaultCap),
}
}
// LPush 从队首添加元素
func (array *ArrayList) LPush(datas ...interface{}) {
array.mu.Lock()
defer array.mu.Unlock()
n := len(datas)
if n == 0 {
return
}
length := len(array.data)
capacity := cap(array.data)
switch length == capacity {
case true: // 如果已经放满了,需要扩容
na := make([]interface{}, length+1, capacity+capacity/2)
copy(na[1:], array.data)
na[0] = datas
array.data = na
default: // 没有放满的话
array.data = append(array.data, nil)
for i := length; i > 0; i-- {
array.data[i] = array.data[i-1]
}
array.data[0] = datas
}
}
// LPop 从队首取数据
func (array *ArrayList) LPop() (data interface{}) {
array.mu.Lock()
defer array.mu.Unlock()
if len(array.data) == 0 {
return
}
data = array.data[0]
array.data = array.data[1:]
return
}
// RPush 从队尾添加元素
func (array *ArrayList) RPush(data interface{}) {
array.mu.Lock()
array.data = append(array.data, data)
array.mu.Unlock()
}
// RPop 从队尾取出并删除元素
func (array *ArrayList) RPop() (data interface{}) {
array.mu.Lock()
defer array.mu.Unlock()
n := len(array.data)
if n == 0 {
return
}
data = array.data[n-1]
array.data = array.data[:n-1]
return data
}
func (array *ArrayList) Data() []interface{} {
return array.data
}