Go语言 大话数据结构——队列的链式存储结构

队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已,我们把它简称为链队列

为了操作上的方便,我们将队头指针指向链队列的头结点,而队尾指针指向终端结点。链队列示意图:

这里写图片描述

当队列为空时,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)

}

运行效果:

猜你喜欢

转载自blog.csdn.net/weixin_42117918/article/details/81839833