Go的数据结构与实现【Queue】

介绍

与栈一样,队列也是最基本的数据结构之一。队列也是值的一种容器,其中值的插入和删除遵循“先进先出”(First-In-First-Out, FIFO)的原则⎯⎯也就是说,每次删除的只能是最先插入的值。

实现

队列的抽象数据类型就是一个数组,其中的值排成一个序列,我们只能访问和取出排在最前端(Front)的对象,只能在队列的尾部(Rear)插入新值。正是按照这一规则,才能保证最先被插入的对象首先被删除(FIFO)。

队列首先支持下面的两个基本方法:

在这里插入图片描述

此外,与栈类似,队列还支持如下的方法:
在这里插入图片描述

基于数组的简单实现

我们使用一个数组来模拟队列,队列的数据结构定义如下:

type T inttype Queue struct {sync.RWMutexarray []T
}

我们依次去实现队列的方法,对于进队Enqueue()方法,直接利用go原生语句将值添加到数组切片中。

// Enqueue adds t to the end of the queue
func (q *Queue) Enqueue(t T) {q.Lock()q.array = append(q.array, t)q.Unlock()
}

出队Dequeue()和取队首元素Front()时注意数组空判断。

// Dequeue removes the start of from the queue
func (q *Queue) Dequeue() (error, *T) {q.Lock()if len(q.array) == 0 {q.Unlock()return fmt.Errorf("queue is empty"), nil}ret := q.array[0]q.array = q.array[1:len(q.array)]q.Unlock()return nil, &ret
}// Front returns the start in the queue, without removing it
func (q *Queue) Front() (error, *T) {q.Lock()if len(q.array) == 0 {q.Unlock()return fmt.Errorf("queue is empty"), nil}ret := q.array[0]q.Unlock()return nil, &ret
}

剩下Size()以及IsEmpty()即对队列的数组大小进行判断取值。

// Size returns the size of the queue
func (q *Queue) Size() int {q.RLock()defer q.RUnlock()return len(q.array)
}// IsEmpty returns true if the queue is empty
func (q *Queue) IsEmpty() bool {q.RLock()defer q.RUnlock()return len(q.array) == 0
}

单元测试

这里测试进队和出队方法:

import "testing"var (t1 T = 1t2 T = 2t3 T = 3
)func TestQueue_Enqueue(t *testing.T) {queue := NewQueue()queue.Enqueue(t1)queue.Enqueue(t2)queue.Enqueue(t3)if size := queue.Size(); size != 3 {t.Errorf("wrong count, expected 3 and got %d", size)}
}func TestQueue_Dequeue(t *testing.T) {queue := NewQueue()queue.Enqueue(t1)queue.Enqueue(t2)queue.Enqueue(t3)_, ret := queue.Dequeue()if *ret != t1 {t.Errorf("wrong result, expected %d and got %d", *ret, t1)}_, _ = queue.Dequeue()_, ret = queue.Dequeue()if *ret != t3 {t.Errorf("wrong result, expected %d and got %d", *ret, t3)}err, _ := queue.Dequeue()if !queue.IsEmpty() {t.Errorf("IsEmpty should return true")}if err == nil {t.Errorf("cannot operate dequeue when queue is empty")}
}

至此,单元测试通过,我们就完成了队列数据结构的实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/779981.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《数据结构学习笔记---第六篇》---栈和队列的实现

目录 1.栈 1.1栈的概念及结构 1.2栈的实现 2.队列 2.1队列的概念及结构 ​2.2队列的实现 3.顺序栈的具体实现 3.1建头文Stack.h” 3.2创建具体接口实现文件Stack.c 3.2.1初始化 3.2.2入栈出栈 3.2.4判空 3.2.5栈的大小 3.2.6销毁栈 3.3主函数的实现 4.链队的具体实现…

linux 没有rc.local文件的解决方法

新的Linux发行版已经没有rc.local文件了。因为已经将其服务化了。 1.设置rc-local.service sudo vim /etc/systemd/system/rc-local.service内容如下: [Unit]Description/etc/rc.local CompatibilityConditionPathExists/etc/rc.local[Service]TypeforkingExecSt…

webpack-dev-server 如何直接用IP打开

当你需要使用IP来访问服务器时,可能需要对 webpack-dev-server 进行相关设置; 当你使用PD虚拟机在Windows上调试时,可能会用到; 一、设置 host 通过webpack.config.js设置 devServer: {host: 0.0.0.0, }通过CLI设置 webpack-dev-s…

【pytest】测试数据存储在 Excel 或 TXT 文件中,如何参数化

如果测试数据存储在 Excel 或 TXT 文件中,你可以使用外部库来读取这些数据,并将其转化为参数化测试所需的格式。下面我将分别展示如何从这两种文件中读取数据,并用于参数化测试。 从 Excel 文件中读取测试数据 你可以使用 pandas 库来读取 …

SAMRTFORMS 转换PDF 发送邮件

最终成果: *&---------------------------------------------------------------------**& Report ZLC_FIND_EXIT*&---------------------------------------------------------------------**&根据T-CODE / 程序名查询出口、BADI增强*&-------…

2024年大广赛联通沃派命题解析:赛题内容一览

2024大广赛又又又又又出新命题了,它就是助力青少年积极向上,乐观自信,探享多彩人生的5G时代潮牌——联通沃派,让我们来看看命题详情吧! 联联通沃派是中国联通面向青少年群体推出的客户品牌,契合目标群体特…

基于SSM框架的校园失物招领系统:从设计思路到实现细节

末尾获取源码作者介绍:大家好,我是墨韵,本人4年开发经验,专注定制项目开发 更多项目:CSDN主页YAML墨韵 学如逆水行舟,不进则退。学习如赶路,不能慢一步。 目录 一、项目简介 二、开发技术与环…

安全算法 - 加密算法

加密算法是一种在信息安全领域中广泛应用的算法,能够将数据进行加密转换,以保证数据的保密性和安全性。 它具有保密性、对称加密和非对称加密、密钥管理、数据完整性和认证等重要特点和应用。 加密算法可以分为对称加密和非对称加密两种类型&#xff1…

5.11 Vue配置Element UI框架

Vue配置Element UI框架 目录一、 概要二、 开发前准备1. 搭建Vue框架 三、 安装 Element UI1. 引入 Element UI 依赖2. 在 mian.js 中引入 Element UI 和相关样式:3. 按需引入(非必须, 可忽略)4. 简单构建一个主页面 目录 一、 概要 Element UI 是一个基于 Vue.js …

Java的Prim算法知识点(含面试大厂题和源码)

Prim算法是一种用于求解加权无向图的最小生成树问题的贪心算法。最小生成树是指在一个加权无向图中,连接所有顶点的权值最小的树。Prim算法通过逐步增加新的边和顶点来构建最小生成树。以下是Prim算法的一些关键知识点: 1. 算法概述 Prim算法从图中的任…

备考ICA----Istio实验13---使用 Istio Ingress 暴露应用

备考ICA----Istio实验13—使用Istio Ingress TLS暴露应用 1. 环境部署 清理之前实验遗留,并重新部署httpbin服务进行测试 # 清理之前的环境 kubectl delete vs httpbin kubectl delete gw mygateway # 部署httpbin kubectl apply -f istio/samples/httpbin/httpbin.yaml 确认…

C#WPF将变量或自定义数据类绑定到控件实例

本文实例讲解C#WPF将变量或自定义数据类如何绑定到控件。 目录 一、将普通变量绑定到控件实例 方式一 仅使用XAML来创建数据绑定。

c++11 标准模板(STL)本地化库 - std::isgraph(std::locale) 检查字符是否被本地环境分类为图形字符

本地化库 本地环境设施包含字符分类和字符串校对、数值、货币及日期/时间格式化和分析,以及消息取得的国际化支持。本地环境设置控制流 I/O 、正则表达式库和 C 标准库的其他组件的行为。 检查字符是否被本地环境分类为图形字符 std::isgraph(std::locale) templat…

vue3使用vuedraggable实现拖拽(有过渡)

1. 安装与使用 vue中vuedraggable安装: pnpm i -S vuedraggablenext或者 yarn add vuedraggablenext注意:vue2和vue3安装的是不同版本的vuedraggable,写法上也会有一些区别。 比如在vue3中使用拖拽,要以插槽的方式,…

【微服务】Sentinel(熔断降级,热点限流)

文章目录 1.熔断降级1.基本介绍1.线程堆积引出熔断降级2.示意图3.熔断,降级,限流三者之间的关系 2.熔断降级策略(以分钟为基本单位)1.慢调用比例2.异常比例3.异常数 3.熔断降级实例—慢调用比例1.需求分析2.com/sun/springcloud/c…

个人简历主页搭建系列-05:部署至 Github

前面只是本地成功部署网站,网站运行的时候我们可以通过 localhost: port 进行访问。不过其他人是无法访问我们本机部署的网站的。 接下来通过 Github Pages 服务把网站部署上去,这样大家都可以通过特定域名访问我的网站了! 创建要部署的仓库…

CAS、AQS、ReentrantLock机制以原理

1、CAS 1.1 基本概念 CAS 是 compare and swap 的简写,即比较并交换。它是指一种操作机制,而不是某个具体的类或方法。在 Java 平台上对这种操作进行了包装。在 Unsafe 类中,调用代码如下 这里无法用Unsafe类看,我使用的是Atomi…

绿联 部署vocechat,搭建私人聊天服务器,用于小型团队和家庭环境

1、镜像 privoce/vocechat-server:latest 2、安装 2.1、基础设置 重启策略:容器退出时总是重启容器。 2.2、网络 桥接即可。 2.3、存储空间 装载路径:/home/vocechat-server/data不可变更,权限读写。 2.4、端口设置 容器端口3000不可变…

go实现哈夫曼编码

package main import ( "bytes" "fmt" ) // 定义节点类型 type Node struct { Weight int Left *Node Right *Node } // 构建哈夫曼树 func buildHuffmanTree(weights []int) *Node { var nodes []*Node for _, weig…

鸿蒙OS开发教学:【编程之重器-装饰器】

HarmonyOS 有19种装饰器 必须【2】 绘制一个页面,这两个肯定会用到 EntryComponent 可选【17】 StatePropLinkObjectLinkWatchStylesStoragePropStorageLinkProvideConsumeObservedBuilderBuilderParamLocalStoragePropLocalStorageLinkExtendConcurrent 如果…