• 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]=%v	", 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)
            }
        }
    }

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

  • 相关阅读:
    对于基础资料的关联操作
    单据关联关系记录
    单据转换插件中新增行
    APK签名校验绕过
    android 安全需要关注
    安卓从业者应该关注:Android 6.0的运行时权限
    让阿里云的Centos,PHP组件 ImageMagick支持png和jpeg格式
    cocos2d-x 常规库的图文件配置
    cocos2d-x 添加 libLocalStorage 库...
    cocos2d-x3.9 默认是 gnustl_static 配置,但是 这个库缺少c++的基础功能... c++_static 功能全面些
  • 原文地址:https://www.cnblogs.com/xiximayou/p/12010938.html
Copyright © 2020-2023  润新知