前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >golang数据结构之队列

golang数据结构之队列

作者头像
西西嘛呦
发布2020-08-26 14:56:10
3170
发布2020-08-26 14:56:10
举报

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

目录结构:

在main中调用queue包中的属性和方法,如何调用参考另一篇文章: https://cloud.tencent.com/developer/article/1686952

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

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

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

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

代码如下:

queue.go

代码语言:javascript
复制
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\t", i, q.Array[i])
    }
}

main.go

代码语言:javascript
复制
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)
        }
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-12-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档