参考学习自:韩顺平老师。


队列是什么,如何理解队列?

  • 队列一般称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)
        }
    }

}