队列是一种先进先出的线性表,简称FIFO。在go语言中通过定义结构体实现队列
定义结构体,data表示存储队列中的内容;size为队列的长度。定义NewSliceQueue方法,返回结构体。后期在主函数中通过调用该方法进行操作队列。
type SliceQueue struct {
data []interface{}
size int
}
func NewSliceQueue() *SliceQueue {
return &SliceQueue{}
}
给结构体绑定IsEmpty方法用于判断队列是否为空,绑定IsSize方法用于输出队列的长度
func (this *SliceQueue) IsEmpty() bool {
return this.size == 0
}
func (this *SliceQueue) IsSize() int {
return this.size
}
IsPot方法返回队列中第一个元素,因为队列是先进先出的因此直接返回队列的第一个元素就可以。
func (this *SliceQueue) IsPot() interface{} {
if this.IsEmpty() {
return nil
}
return this.data[0]
}
两种入队列的操作,第一种为一个一个添加,通过append内置函数进行操作;第二种为一次性添加多个元素,通过for ...range...循环操作。
func (this *SliceQueue) Push(v interface{}) {
this.data = append(this.data, v)
this.size++
}
func (this *SliceQueue) Pushs(v ...interface{}) {
for _, v := range v {
this.Push(v)
}
}
出队列操作,每次弹出队列的第一个元素
func (this *SliceQueue) Pop() interface{} {
if this.IsEmpty() {
fmt.Println("空队列")
return nil
}
v := this.data[0]
this.data = this.data[1:]
this.size--
return v
}
Peek方法通过for...range...循环显示队列种的元素
func (this *SliceQueue) Peek() {
if this.IsEmpty() {
fmt.Println("空栈")
return
}
fmt.Println("当前队列中的元素:")
for k, v := range this.data {
fmt.Printf("k:%d,v:%v\n", k, v)
}
}
主函数
func main() {
slicequeue := NewSliceQueue()
if slicequeue.IsEmpty() {
fmt.Println("空队列")
} else {
fmt.Println("当前队列长度为:", slicequeue.IsSize())
}
fmt.Println("入队列:")
slicequeue.Push("1")
slicequeue.Push("2")
slicequeue.Push("3")
slicequeue.Pushs(4, "golang", 123)
fmt.Println("当前队列长度为:", slicequeue.IsSize())
slicequeue.Peek()
fmt.Println("当前队首元素为:", slicequeue.IsPot())
fmt.Println("出队列元素:", slicequeue.Pop())
fmt.Println("当前队首元素为:", slicequeue.IsPot())
}
程序整体运行结果