参考学习自:韩顺平老师。
队列是什么,如何理解队列?
- 队列一般称queue,是一个有序列表
- 队列一般的原则为:先进先出【谁先来,谁先走】
- 队列一般的场景可以想象:银行取现排队,移动营业厅排队,买咖啡排队等例子
用数组来模拟队列的思路
- 队列本身是一个有序列表,我们需要一个maxSize ,表示这个队列最大的长度。
-
队列有头部和尾部,我们用 front/rear 来定义头尾,默认都为-1
image.png
代码实现参考,具体含义在代码中有注释
package main
import (
"fmt"
"os"
)
// 用数组实现一个非环形的queue队列
// 思路分析:
// 1。创建一个array的数组(front前端 rear后端,默认值为-1)[存在在结构体中]
// 2。front(前) 初始化为-1
// 3。rear(队列尾部)初始化为 -1
// 4。完成对基本操作:
// AddQueue:加入数据到队列
// GetQueue:从队列读取数据
// ShowQueue:查看队列显示
// 用结构体管理队列
type Queue struct {
maxSize int // 数组的最大值
array [5]int // 定义的数组
front int // 表示指向队列的头部
rear int // 表示指向队列的尾部
}
// AddQueue 添加数据到队列
func (this *Queue) AddQueue(data int) error {
// 先判断队列是否已满.
if this.rear == this.maxSize-1 { // rear是队列尾部,包含队尾
return fmt.Errorf("队列已满,error")
}
// 如果队列没有满, rear 往后娜一个位置
this.rear++
this.array[this.rear] = data
return nil
}
func (this *Queue) ShowQueue() {
// 要找到头,然后遍历到尾部
fmt.Printf("队列当前的情况是:")
for i := this.front + 1; i <= this.rear; i++ {
fmt.Printf("arrary[%d]=%d\t", i, this.array[i])
}
fmt.Println()
}
func (this *Queue) GetQueue() (val int, err error) {
// 从队列中取出数据
// 判断队列是否为空
if this.front == this.rear {
return 0, fmt.Errorf("队列为空")
}
// front 对首(不包含队首)
this.front++ // 首部往后退一下
val = this.array[this.front]
return val, nil
}
// 入口主函数
func main() {
data := &Queue{
maxSize: 5,
front: -1,
rear: -1,
}
// 添加数据.
var key string
var val int
for {
fmt.Println("1 输入add表示添加数据到queue")
fmt.Println("2 输入get 表示获取queue队列")
fmt.Println("3 输入show 表示显示queue队列")
fmt.Println("4 输入exit 表示退出")
fmt.Scanln(&key)
switch key {
case "add":
fmt.Println("请输入要添加的数据")
fmt.Scanln(&val)
err := data.AddQueue(val)
if err != nil {
fmt.Println("添加失败了!")
return
}
fmt.Println("添加成功")
case "get":
val, err := data.GetQueue()
if err != nil {
fmt.Println("error", err)
return
}
fmt.Println("value is", val)
case "show":
data.ShowQueue()
case "exit":
os.Exit(0)
}
}
}