基本介绍
队列是一个有序的列表,可以用数组或者链表来实现。
队列遵循先进先出的原则,即先存入队列的数据先取出,后存入的数据后取出。
单向队列
代码如下:
package main
import (
"errors"
"fmt"
)
type Queue struct {
maxSize int
queue [5]int // 模拟队列
front int // 队首
rear int // 队尾
}
func (q *Queue) AddQueue(num int) (err error) {
// 当队尾在最后就不能再加入了
if q.rear == q.maxSize-1 {
err = errors.New("队列已满")
return
}
q.rear++
q.queue[q.rear] = num
return
}
func (q *Queue) ShowQueue() {
// 找到队首,遍历到队尾
for i := q.front + 1; i <= q.rear; i++ {
fmt.Printf("queue[%d]=%d\n", i, q.queue[i])
}
}
func (q *Queue) GetQueue() (err error) {
// 如果队列为空,则取不出数据
if q.rear == q.front {
err = errors.New("队列为空")
return err
}
q.front ++
fmt.Printf("出队列的数为:%d\n",q.queue[q.front])
return
}
func main() {
// 初始化
queue := Queue{
maxSize: 5,
queue: [5]int{},
front: -1,
rear: -1,
}
for {
fmt.Println("====================")
fmt.Println("输入add 添加数据到队列")
fmt.Println("输入get 从队列获取数据")
fmt.Println("输入show 查询队列消息")
fmt.Println("====================")
var key string
var value int
fmt.Print("请输入选择:")
_, _ = fmt.Scanln(&key)
switch key {
case "add":
fmt.Print("请输入需要添加的数据:")
_, _ = fmt.Scanln(&value)
err := queue.AddQueue(value)
if err != nil {
fmt.Println(err)
}
case "get":
fmt.Println("")
err := queue.GetQueue()
if err != nil {
fmt.Println(err)
}
case "show":
fmt.Println("查看队列消息")
queue.ShowQueue()
default:
fmt.Println("选择错误")
}
}
}
环形队列
思路:
- 当(tail + 1) % maxSize == head的时候队列满
- tail == head 表示队列为空
- 初始化时,tail =0 head = 0
- 统计队列元素:(tail + maxSize - head) % maxSize