GO 语言队列实现

队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。

队列是一种先进先出的t(First In First Out)的线性表,简称FIFO。允许插入的一端为队尾,允许删除的一端为队头。队列不允许在中间部位进行操作!假设队列是q=(a1,a2,……,an),那么a1就是队头元素,而an是队尾元素。这样我们就可以删除时,总是从a1开始,而插入时,总是在队列最后。这也比较符合我们通常生活中的习惯,排在第一个的优先出列,最后来的当然排在队伍最后。如下图:

package main

import (
        "fmt"
)

type QueueNode struct {
        Data interface{}
        Next *QueueNode
}

//创建链列(数据)
func (queue *QueueNode) Create(Data ...interface{}) {
        if queue == nil {
                return
        }
        if len(Data) == 0 {
                return
        }

        //创建链列
        for _, v := range Data {
                newNode := new(QueueNode)
                newNode.Data = v

                queue.Next = newNode
                queue = queue.Next
        }

}

//打印链列
func (queue *QueueNode) Print() {
        if queue == nil {
                return
        }
        for queue != nil {
                if queue.Data != nil {
                        fmt.Print(queue.Data, " ")
                }
                queue = queue.Next
        }
        fmt.Println()
}

//链列个数
func (queue *QueueNode) Length() int {
        if queue == nil {
                return -1
        }

        i := 0
        for queue.Next != nil {
                i++
                queue = queue.Next
        }
        return i
}

//入列(insert)
func (queue *QueueNode) Push(Data interface{}) {
        //放在队列的末尾

        if queue == nil {
                return
        }
        if Data == nil {
                return
        }

        //找到队列末尾
        for queue.Next != nil {
                queue = queue.Next
        }

        //创建新节点 将新节点加入队列末尾
        newNode := new(QueueNode)
        newNode.Data = Data

        queue.Next = newNode
}

//出队(delete)
func (queue *QueueNode) Pop() {
        //队头出列
        if queue == nil {
                return
        }
        //记录列队第一个的节点
        //node:=queue.Next
        //queue.Next=node.Next

        queue.Next = queue.Next.Next
}