队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已,我们把它简称为链队列。
为了操作上的方便,我们将队头指针指向链队列的头结点,而队尾指针指向终端结点。链队列示意图:
当队列为空时,front和rear都指向头结点。
实例代码:
package main
import (
"errors"
"fmt"
)
type qelemType int
//数据节点(链表形式)
type QNode struct {
data qelemType
next *QNode
}
type queuePtr *QNode
//定义队列
type LinkQueue struct {
front, rear queuePtr
}
//创建头结点
func createHeadNode(q *LinkQueue) {
s := queuePtr(new(QNode))
s.next = nil
q.front = s
q.rear = s
}
//如队列操作
func enQueue(q *LinkQueue, e qelemType) {
s := queuePtr(new(QNode))
s.data = e
s.next = nil //队尾为空
q.rear.next = s
q.rear = s //rear指向新添加的数据(保证指向最后一个元素)
}
//出队列
func deQueue(q *LinkQueue) (err error, res qelemType) {
if q.front == q.rear {
err = errors.New("队列为空,没有数据出队列")
return
}
s := q.front.next
res = s.data
q.front.next = s.next
if q.rear == s {
q.rear = q.front
}
return
}
func main() {
var p LinkQueue
/*
注意 需要创建头结点,不然头结点为空,操作它的.next 会发生异常,异常信息如下:
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x0 pc=0x48b5c9]
*/
createHeadNode(&p)
enQueue(&p, qelemType(123))
enQueue(&p, qelemType(345))
enQueue(&p, qelemType(567))
_, res := deQueue(&p)
fmt.Println(res)
_, res = deQueue(&p)
fmt.Println(res)
_, res = deQueue(&p)
fmt.Println(res)
err, res := deQueue(&p)
fmt.Println(err, res)
}
运行效果: