006 go 语言实现 单链式队列

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)
}

你可能感兴趣的:(006 go 语言实现 单链式队列)