golang数据结构之环形队列

时间:2022-07-23
本文章向大家介绍golang数据结构之环形队列,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

目录结构:

circlequeue.go

package queue

import (
    "errors"
    "fmt"
)

//CircleQueue 环型队列
type CircleQueue struct {
    MaxSize int
    Array   [5]int
    Front   int
    Rear    int
}

//Push 向队列中添加一个值
func (q *CircleQueue) Push(val int) (err error) {
    //先判断队列是否已满
    if q.IsFull() {
        return errors.New("队列已满")
    }
    q.Array[q.Rear] = val
    //队尾不包含元素
    //q.Rear++
    q.Rear = (q.Rear + 1) % q.MaxSize
    return
}

//Pop 得到一个值
func (q *CircleQueue) Pop() (val int, err error) {
    if q.IsEmpty() {
        return -1, errors.New("队列已空")
    }
    //队首包含元素
    val = q.Array[q.Front]
    //q.Front++
    q.Front = (q.Front + 1) % q.MaxSize
    return val, err
}

//IsFull 队列是否满了
func (q *CircleQueue) IsFull() bool {
    return (q.Rear+1)%q.MaxSize == q.Front
}

//IsEmpty 队列是否为空
func (q *CircleQueue) IsEmpty() bool {
    return q.Front == q.Rear
}

//Size 队列的大小
func (q *CircleQueue) Size() int {
    return (q.Rear + q.MaxSize - q.Front) % q.MaxSize
}

//Show 显示队列
func (q *CircleQueue) Show() {
    //取出当前队列有多少元素
    size := q.Size()
    if size == 0 {
        fmt.Println("队列为空")
    }
    //辅助变量,指向Front
    tmpFront := q.Front
    for i := 0; i < size; i++ {
        fmt.Printf("queue[%d]=%vt", tmpFront, q.Array[tmpFront])
        tmpFront = (tmpFront + 1) % q.MaxSize
    }

}

main.go

package main

import (
    "fmt"
    "go_code/data_structure/queue"
    "os"
)

func main() {

    var key string
    var val int
    q := &queue.CircleQueue{
        MaxSize: 5,
        Front:   0,
        Rear:    0,
    }
    for {
        fmt.Println("------------------------------")
        fmt.Println("1.输入push表示添加数据到队列")
        fmt.Println("2.输入pop表示从队列中获取数据")
        fmt.Println("3.输入show表示显示队列")
        fmt.Println("4.输入exit表示退出")
        fmt.Println("------------------------------")
        fmt.Scanln(&key)
        switch key {
        case "push":
            fmt.Println("请输入要添加的值:")
            fmt.Scanln(&val)
            err := q.Push(val)
            if err != nil {
                fmt.Println(err)
            } else {
                fmt.Println("添加成功")
                fmt.Println("Rear:", q.Rear)
            }
        case "pop":
            val, err := q.Pop()
            if err != nil {
                fmt.Println(err)
            } else {
                fmt.Println("得到的值为:", val)
                fmt.Println("Front:", q.Front)
            }

        case "show":
            q.Show()
            fmt.Println()
        case "exit":
            os.Exit(0)
        }
    }
}

注意标红的地方,这是循环队列的核心。