• golang数据结构之队列


    队列可以用数组或链表实现,遵从先入先出。

    目录结构:

    在main中调用queue包中的属性和方法,如何调用参考另一篇文章: https://www.cnblogs.com/xiximayou/p/12005480.html

    一个队列需要有四要素:容量、队首指针、队尾指针、存储数据的数组

    当队尾指针==容量-1时,此时队列已满,就不能再有数据进队;

    当队首指针==队尾指针时,此时队列已空,就不能再从队列中取出数据;

    同时可以发现,这种队列只能使用一次,因为那时队首和队尾都指向队尾了。

    代码如下:

    queue.go

    package queue
    
    import (
        "errors"
        "fmt"
    )
    
    //Queue 使用结构体管理队列
    type Queue struct {
        MaxSize int
        Array   [4]int //模拟队列
        Front   int    //队列首位
        Rear    int    //队列尾部
    }
    
    //AddQueue 向队列中添加一个值
    func (q *Queue) AddQueue(val int) (err error) {
        q.MaxSize = 4
        //先判断队列是否已满
        if q.Rear == q.MaxSize-1 {
            return errors.New("队列已满")
        }
        q.Rear++
        q.Array[q.Rear] = val
        return
    }
    
    //GetQueue 得到一个值
    func (q *Queue) GetQueue() (val int, err error) {
        if q.Front == q.Rear {
            return -1, errors.New("队列已空")
        }
        q.Front++
        val = q.Array[q.Front]
        return val, err
    }
    
    //ShowQueue 显示队列
    func (q *Queue) ShowQueue() {
        for i := q.Front + 1; i <= q.Rear; i++ {
            fmt.Printf("queue[%d]=%v	", i, q.Array[i])
        }
    }

    main.go

    package main
    
    import (
        "fmt"
        "go_code/data_structure/queue"
        "os"
    )
    
    func main() {
        var key string
        var val int
        q := &queue.Queue{
            MaxSize: 4,
            Front:   -1,
            Rear:    -1,
        }
        for {
            fmt.Println("------------------------------")
            fmt.Println("1.输入add表示添加数据到队列")
            fmt.Println("2.输入get表示从队列中获取数据")
            fmt.Println("3.输入show表示显示队列")
            fmt.Println("4.输入exit表示退出")
            fmt.Println("------------------------------")
            fmt.Scanln(&key)
            switch key {
            case "add":
                fmt.Println("请输入要添加的值:")
                fmt.Scanln(&val)
                err := q.AddQueue(val)
                if err != nil {
                    fmt.Println(err)
                } else {
                    fmt.Println("添加成功")
                    fmt.Println("Rear:", q.Rear)
                }
            case "get":
                val, err := q.GetQueue()
                if err != nil {
                    fmt.Println(err)
                } else {
                    fmt.Println("得到的值为:", val)
                    fmt.Println("Front", q.Front)
                }
    
            case "show":
                q.ShowQueue()
                fmt.Println()
            case "exit":
                os.Exit(0)
            }
        }
    }
  • 相关阅读:
    javascript中 分号的问题
    IIFE(立即执行函数表达式)
    函数_回调函数
    数据_变量_内存
    严格区别变量类型与数据类型
    什么时候给变量赋值为null
    JavaScript Promise迷你书(中文版)
    python txt文件读写(追加、覆盖)
    python re:正向肯定预查(?=)和反向肯定预查(?<=)
    python re:正则表达式中使用变量
  • 原文地址:https://www.cnblogs.com/xiximayou/p/12006353.html
Copyright © 2020-2023  润新知