首页 > 其他分享 >数据结构一: golang 单向队列

数据结构一: golang 单向队列

时间:2022-09-18 02:44:18浏览次数:85  
标签:尾部 队列 golang int 数组 front 数据结构 rear

队列是什么,如何理解队列?

  • 队列一般称queue,是一个有序列表
  • 队列一般的原则为:先进先出【谁先来,谁先走】
  • 队列一般的场景可以想象:银行取现排队,移动营业厅排队,买咖啡排队等例子

用数组来模拟队列的思路

  • 队列本身是一个有序列表,我们需要一个maxSize ,表示这个队列最大的长度。
  • 队列有头部和尾部,我们用 front/rear 来定义头尾,默认都为-1

package main

import (
    "fmt"
    "os"
)

// 用数组实现一个非环形的queue队列

// 思路分析:
// 1。创建一个array的数组(front前端 rear后端,默认值为-1)[存在在结构体中]
// 2。front(前) 初始化为-1
// 3。rear(队列尾部)初始化为 -1
// 4。完成对基本操作:
//    AddQueue:加入数据到队列
//    GetQueue:从队列读取数据
//    ShowQueue:查看队列显示

// 用结构体管理队列

type Queue struct {
    maxSize int    // 数组的最大值
    array   [5]int // 定义的数组
    front   int    // 表示指向队列的头部
    rear    int    // 表示指向队列的尾部
}

// AddQueue 添加数据到队列
func (this *Queue) AddQueue(data int) error {

    // 先判断队列是否已满.
    if this.rear == this.maxSize-1 { // rear是队列尾部,包含队尾
        return fmt.Errorf("队列已满,error")
    }

    // 如果队列没有满, rear 往后娜一个位置
    this.rear++
    this.array[this.rear] = data

    return nil
}

func (this *Queue) ShowQueue() {
    // 要找到头,然后遍历到尾部
    fmt.Printf("队列当前的情况是:")
    for i := this.front + 1; i <= this.rear; i++ {
        fmt.Printf("arrary[%d]=%d\t", i, this.array[i])
    }
    fmt.Println()

}

func (this *Queue) GetQueue() (val int, err error) {
    // 从队列中取出数据

    // 判断队列是否为空
    if this.front == this.rear {
        return 0, fmt.Errorf("队列为空")
    }

    // front 对首(不包含队首)
    this.front++ // 首部往后退一下
    val = this.array[this.front]

    return val, nil
}

// 入口主函数
func main() {
    data := &Queue{
        maxSize: 5,
        front:   -1,
        rear:    -1,
    }

    // 添加数据.
    var key string
    var val int

    for {
        fmt.Println("1 输入add表示添加数据到queue")
        fmt.Println("2 输入get 表示获取queue队列")
        fmt.Println("3 输入show  表示显示queue队列")
        fmt.Println("4 输入exit  表示退出")

        fmt.Scanln(&key)

        switch key {
        case "add":
            fmt.Println("请输入要添加的数据")
            fmt.Scanln(&val)
            err := data.AddQueue(val)
            if err != nil {
                fmt.Println("添加失败了!")
                return
            }
            fmt.Println("添加成功")

        case "get":
            val, err := data.GetQueue()
            if err != nil {
                fmt.Println("error", err)
                return
            }
            fmt.Println("value is", val)

        case "show":
            data.ShowQueue()

        case "exit":
            os.Exit(0)
        }
    }

}

 

标签:尾部,队列,golang,int,数组,front,数据结构,rear
From: https://www.cnblogs.com/wuchangblog/p/16704099.html

相关文章

  • 一文理解golang中的链表
    每节运煤车就是单链表里的元素,每节车厢里的煤炭就是元素中保存的数据。前后车通过锁链相连,作为单链表运煤车,从1号车厢开始,每节车厢都知道后面拉着哪一节车厢,却不知道前面是......
  • 数据结构实验(二)递归函数练习
    6-1递归法求Fibonacci数列第n项的值这道题就是写一个简单的递归函数即可intfun(intn){if(n==1||n==2)return1;returnfun(n-1)+fun(n-2);}......
  • 用 Redis 做一个可靠的延迟队列
    我们先看看以下业务场景:当订单一直处于未支付状态时,如何及时的关闭订单,并退还库存?新创建店铺,N天内没有上传商品,系统如何知道该信息,并发送激活短信?上述场景最简单直接的......
  • [数据结构10分钟入门] 面向初学者从零实现 -- 单链表
    一、链表是什么链表是一种通过指针串联在一起的线性结构,在内存中是分散存储的(数组在内存中连续分布),链表由一系列节点组成,每个节点都由数据域和指针域组成。主要有三种类......
  • Golang中使用new和make
    一、何时使用make和new?二、make和new的区别1.new这个内置函数用来分配内存。第一个参数是类型,而不是值,返回值是指向该类型的新分配的零值(默认值)的指针。例如:此时......
  • 一个关于算法与数据结构的可视化平台
    旧金山大学官网的数据可视化(算法与数据结构):数据结构可视化(usfca.edu)......
  • 延宕执行,妙用无穷,Go lang1.18入门精炼教程,由白丁入鸿儒,Golang中defer关键字延迟调
    先行定义,延后执行。不得不佩服Golang设计者天才的设计,事实上,defer关键字就相当于Python中的try{...}except{...}finally{...}结构设计中的finally语法块,函数结束时强制......
  • c语言数据结构复习
    c语言数据结构复习第1章:基本概念第2章:线性结构2.1--线性表及其实现2.1.1-引子:多项式及其表示法1:顺序存储直接表示多项式法2:用顺序存储结构表示多项式说明:以上例......
  • .NET 处理类(批量任务队列,List分页处理,配置文件管理)
    ///<summary>///任务队列接口///</summary>publicinterfaceITaskQueue<T>{///<summary>///增加一个对象//......
  • JS版数据结构-链表
    链表代码随笔(JS)/**链表节点*/classNode{el=null;next=null;constructor(el=null,next=null){this.el=el;this.next=next;}}......