一、Golang数据结构-队列(数组)

1.基本介绍

(1)队列是一个有序列表,可以用数组或者是链表来实现。
(2)遵循先入先出原则。即:先存入队列的数据,要先取出。后存入的要后取出

2.处理方法

数组模拟队列

(1)队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下:

type Queue struct{
	maxSize int
	array [5]int	//数组-> 模拟队列
	front int 		//表示指向队列首
	rear int		//表示指向队列尾
}

(2)因为队列的输出、输入分别从前后端来处理,因此需要两个变量front及rear分别记录队列前后端的下标,front会随着数据输出而改变,而rear则是随着数据输入而改变
(3)当我们将数据存入队列时成为“addqueue”,“addqueu”的处理需要有两个步骤:
① 将尾指针后移:rear + 1。当front == rear 时,队列为空
②若尾指针rear小于等于队列的最大下标MaxSize - 1,则将数据存入rear所指的数组元素中,否则无法存入数据
注意:rear指队列队尾,包含队尾元素;front指队列队首,并不包含队首元素

二、使用步骤

1.使用一个结构体管理队列

代码如下:

package main
import(
	"fmt"
	"errors"
	"os"
)
//使用一个结构体管理队列
type Queue struct{
	maxSize int
	array [5]int	//数组-> 模拟队列
	front int 		//表示指向队列首
	rear int		//表示指向队列尾
}

2.添加队列数据

代码如下:

	func (this *Queue) AddQueue(val int)(err error){
	//先判断队列是否已满
	if this.rear == this.maxSize - 1{	//重要的提示 rear是队列尾部,包含最后元素
		return errors.New("queue full")
	} 
	this.rear++	//rear后移
	this.array[this.rear] = val
	return
}
	

3.显示队列,找到队首,然后遍历到队尾

代码如下:

	func (this *Queue) ShowQueue(){
	fmt.Println("队列当前情况是")
	//this.front不包含队首的元素
	for i := this.front + 1; i <= this.rear; i++{
		fmt.Printf("array[%d] = %d\t", i, this.array[i])
	}
	fmt.Println()
}

4.从队列中取出数据

代码如下:

	func (this *Queue) GetQueue()(val int, err error){
	//判断队列是否为空
	if this.rear == this.front {
		return -1, errors.New("queue empty")
	}
	this.front++
	val = this.array[this.front]
	return val,err
}

5.编写一个主函数测试

代码如下:

	func main(){
	//先创建一个队列
	queue := &Queue{
		maxSize : 5,
		front : -1,
		rear : -1,
	}
	var key string
	var val int
	for {
		fmt.Println("1. 输入add 表示添加数据到队列")
		fmt.Println("2. 输入get 表示从队列获取数据")
		fmt.Println("3. 输入show 表示显示队列")
		fmt.Println("4. 输入exit 表示退出队列")
		fmt.Scanln(&key)
		switch key{
		case "add":
			fmt.Println("请输入要添加的数据")
			fmt.Scanln(&val)
			err := queue.AddQueue(val)
			if err != nil {
				fmt.Println(err.Error())
			}else{
				fmt.Println("加入队列成功!")
			}
		case "get":
			val, err := queue.GetQueue()
			if err != nil {
				fmt.Println(err.Error())
			}else{
				fmt.Println("从队列中取出一个数为:",val)
			}
		case "show":
			queue.ShowQueue()
		case "exit":
			os.Exit(0)
		}
	}
}

三、运行结果

在这里插入图片描述

在这里插入图片描述

总结

上面代码实现了基本队列结构,但是没有有效的利用数组空间。需要使用数组实现一个环形的队列来解决这个问题。