1定义
所有代码以及测试代码见 : https://gitee.com/babyb/data_srtuct/tree/master/006queue
通过执行 go test -v 命令 即可查看测试结果
队列的定义: 只允许在一端进行插入操作, 而在另一端进行弹出操作的线性表
先进先出 First In First Out 简称FIFO , 允许插入的一端称为队尾, 允许删除的一端为队头
2 数据结构
/*
Object 用于存放任何数据
*/
type Object interface{}
/*
Node 队列的数据
*/
type Node struct {
data Object
next *Node
}
/*
Queue 队列
*/
type Queue struct {
head *Node
tail *Node
}
3 实现的方法
3.1 队列初始化
func InitQueue() Queue {
q := Queue{}
q.head = nil
return q
}
3.2 向链式队列中插入数据
func (q *Queue) Push(d Object) {
newNode := &Node{
data: d,
}
// 第一种写法, temp变量作为游标, 遍历到最后一个元素, 缺点是当数据变大之后, 插入会变慢
// temp := q.head
// for temp.next != nil {
// temp = temp.next
// }
// temp.next = newNode
//第二种写法, Queue 中增加一个tail 变量, 用于存放最后一个元素, 判断
if q.Empty() {
//队列为空的时候, 头和尾都是newNode
q.head = newNode
q.tail = newNode
} else {
//队列不为空时, 直接操作尾元素即可
q.tail.next = newNode
q.tail = newNode
}
}
3.3 判断链表是否为空
func (q *Queue) Empty() bool {
if q.head == nil {
return true
}
return false
}
3.4 弹出队头元素
func (q *Queue) Pop() (data Object, err error) {
if q.Empty() {
fmt.Println("链表为空无法继续弹出")
return 0, errors.New("链表为空无法继续弹出")
}
head := q.head
q.head = head.next
return head.data, nil
}
3.5 展示队列所有内容
func (q *Queue) Show() {
temp := q.head
for temp != nil {
fmt.Printf("%v, ", temp.data)
temp = temp.next
}
fmt.Println("展示完所有内容")
}
4 测试代码
package queue
import (
"fmt"
"testing"
)
func Test(t *testing.T) {
fmt.Println("队列测试")
queue := InitQueue()
empty := queue.Empty()
fmt.Println("队列是否为空", empty)
// queue.Push("小明")
// queue.Push("小红")
// queue.Push("小花")
// queue.Show()
queue.Push("小明")
queue.Push("小红")
a1, err := queue.Pop()
fmt.Println("a1 : ", a1, "错误是,", err)
a2, err := queue.Pop()
fmt.Println("a2 : ", a2, "错误是,", err)
a3, err := queue.Pop()
fmt.Println("a3 : ", a3, "错误是,", err)
}