基本介绍
队列是一个有序的列表,可以用数组或者链表来实现。
队列遵循先进先出的原则,即先存入队列的数据先取出,后存入的数据后取出。
单向队列

代码如下:
package mainimport ("errors""fmt")type Queue struct {maxSize intqueue [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] = numreturn}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 stringvar value intfmt.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
