zoukankan      html  css  js  c++  java
  • 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)
            }
        }
    }
  • 相关阅读:
    SmartSql = Dapper + MyBatis + Cache(Memory | Redis) + ZooKeeper + R/W Splitting + ......
    SmartSql For Asp.Net Core 最佳实践
    如何通过本地化事件正确实现微服务内部强一致性,事件总线跨微服务间最终一致性
    Netty入门搭建
    IO同步阻塞与同步非阻塞
    NIO的缓冲区、通道、选择器关系理解
    SpringBoot整合ActiveMQ
    ActiveMQ的介绍及使用
    nginx入门(一)
    垃圾回收器及tomcat调优
  • 原文地址:https://www.cnblogs.com/xiximayou/p/12006353.html
Copyright © 2011-2022 走看看