go语言结构体实现数据结构队列(先进先出)存储数据(逐行注释)

正在学习go语言中,欢迎提出宝贵意见

import ("fmt""sync"
)// 数据队列以链表的形式存储数据,每个节点存储一个任意类型的数据,
// 创建数据队列、添加数据、删除数据、获取队列长度,每个数据存储在一个节点中。
// 先进先出// 数据节点
type DataNode struct {data interface{} // 节点中的数据next *DataNode   // 指向下一个节点
}// 数据队列,存贮数据节点
type WorkQueue struct {root  *DataNode  // 指向头结点size  int        // 队列长度mutex sync.Mutex // 锁
}// 创建数据队列
func NewWorkQueue() *WorkQueue {wq := &WorkQueue{root: nil, size: 0}return wq
}// 数据入队
// 切片数据:wq.Add([]string{"aaa", "bbb"})
// 字符串数据:wq.Add("ccc")
// 字典数据:wq.Add(map[string]string{"a": "aa", "b": "bb"})
func (wq *WorkQueue) Add(data interface{}) {wq.mutex.Lock()         // 加锁defer wq.mutex.Unlock() // 解锁if wq.root == nil {     // 队列为空wq.root = new(DataNode) // 创建节点,赋值给头节点wq.root.data = data     // 节点数据赋值} else {dn := new(DataNode)    // 创建节点dn.data = data         // 节点数据赋值node := wq.root        // 获取队列头节点for node.next != nil { // 从头节点开始向下寻找尾节点node = node.next // 有下一个节点时,将下一个节点置为当前节点}node.next = dn // 将新节点连接到最后一个节点位置}wq.size++ // 数据队列长度+1
}// 获取队首数据,并从队列中删除节点。
// 返回数据可能为nil,使用前需判断过滤nil值。
func (wq *WorkQueue) Pop() interface{} {wq.mutex.Lock()         // 加锁defer wq.mutex.Unlock() // 解锁if wq.root == nil {     // 数据队列为空return nil} else {node := wq.root     // 获取首节点v := node.data      // 获取首节点数据wq.root = node.next // 首节点设置为第二个节点wq.size--           // 数据队列长度-1return v            // 返回首节点数据}
}// 获取数据队列长度
func (wq *WorkQueue) Size() int {return wq.size
}// 遍历输出所有数据
func (wq *WorkQueue) ShowValue() {if wq.root == nil { // 队列为空fmt.Println("队列为空队列!")} else {size := wq.sizefmt.Println("队列元素数:", size)node := wq.root // 获取队列头节点n := 1fmt.Printf("第%d个元素是:%v\n", n, node.data)for node.next != nil { // 从头节点开始向下寻找尾节点node = node.next // 有下一个节点时,将下一个节点置为当前节点n++fmt.Printf("第%d个元素是:%v\n", n, node.data)}}
}

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

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

相关文章

Excel + Notepad + CMD 命令行批量修改文件名

注意:该方式为直接修改原文件的文件名,不会生成新文件 新建Excel文件 A列:固定为 renB列:原文件名称C列:修改后保存的名称B列、C列,需要带文件后缀,为txt文件就是.txt结尾,为png图片…

数据结构-排序(来自于王道)

排序的基本概念 插入排序 在这个算法中,除了输入的数组本身,没有使用额外的数据结构来存储数据,所有的操作都是在原数组上进行的。因此,无论输入数组的大小 n 是多少,算法执行过程中所占用的额外空间是固定的&#xff…

MySQL中DELETE、DROP和TRUNCATE的区别是什么?

MySQL中,DELETE、DROP和TRUNCATE是用于数据管理的三个重要命令,但它们之间存在显著的区别。以下是它们的主要差异: 一、用法不同 DROP 用途:用于删除整个表及其结构。语法:DROP TABLE 表名;特点:在执行DRO…

算力介绍与解析

算力(Computing Power)是指计算机系统在单位时间内处理数据和执行计算任务的能力。算力是衡量计算机性能的重要指标,直接影响计算任务的速度和效率。 算力的分类和单位 a. 基础算力:以CPU的计算能力为主。适用于各个领域的计算。…

SVN(Subversion)教程

SVN(Subversion)教程:版本控制入门 什么是 SVN? SVN(Subversion)是一个集中式版本控制系统,用于管理代码、文档等文件的版本历史。它帮助团队协作开发,提供版本跟踪、文件还原和冲…

vite搭建前端工程

vite简介 vite预构建 将非 ESM 规范的代码转换为符合 ESM 规范的代码,另外就是将第三方依赖内部的多个文件合并为一个,减少 http 请求数量 简单来说,vite在一开始将应用中的模块区分为依赖和源码两类 「依赖部分」更多指的是代码中使用到的第三方模块,比如 vue、lodash、r…

【编译器】传统编译器和AI/ML编译器总结

前言 本文总结了传统编译器和AI/ML编译器,可作为学习、研究、研发的参考资料。 1.编译器-GC Clang Clang是一个C、C、Objective-C和Objective-C编程语言的编译器前端。它采用了LLVM作为其后端,由LLVM2.6开始,一起发布新版本。它的目标是提供一…

使用阿里云Certbot-DNS-Aliyun插件自动获取并更新免费SSL泛域名(通配符)证书

进入nginx docker,一般是Alpine Linux系统 1. 依次执行命令: sudo docker-compose exec nginx bashapk updateapk add certbot apk add --no-cache python3 python3-dev build-baseapk add python3 py3-pippip3 install --upgrade pippip3 install certbot-dns-ali…

IMUX6LL嵌入式-Linux开发中的头文件汇总介绍

sys/mman.h 详见 https://blog.csdn.net/wenhao_ir/article/details/144487608 sys/types.h 详见 https://blog.csdn.net/wenhao_ir/article/details/144487608 sys/stat.h 详见 https://blog.csdn.net/wenhao_ir/article/details/144487608 unistd.h 详见 https://blog…

spring boot框架优劣势分析

优势(Advantages): 1. 快速开发(Rapid Development): • Spring Boot通过提供大量的默认配置和自动配置功能,极大地减少了开发过程中的配置工作量,从而加快了开发速度。 2. 简化部署&#xff08…

【设计模式】如何用C++实现观察者模式【发布订阅机制】

【设计模式】如何用C实现观察者模式【发布订阅机制】 一、问题背景 代码质量影响生活质量。最近工作中频繁接触各种设计模式,深刻体会到优秀的设计模式不仅能显著降低后续维护的压力,还能提升开发效率。观察者模式作为一种降低耦合度、提高扩展性的利器…

企业架构划分探讨:业务架构与IT架构的利与弊

在企业架构(EA)的江湖里,大家一直致力于如何把企业的复杂性简化成有条有理的架构蓝图。有人选择把企业架构分成业务架构和IT架构,而IT架构又进一步细分为应用架构、数据架构和技术架构。但一提到这种划分方式,总有人跳…

QT:在线安装与离线安装

QT 学习系列 QT:在线安装与离线安装 QT 学习系列一、安装(一)离线安装windows系统Linux 系统Mac 系统 (二)在线安装 二、 环境变量配置三、验证总结 一、安装 (一)离线安装 windows系统 获取…

FFmpeg功能使用

步骤:1,安装FFmpeg Download FFmpeg 在这里点击->Windows builds from gyan.dev;如下图 会跳到另外的下载界面: 在里面下拉选择点击ffmpeg-7.1-essentials_build.zip: 即可下载到FFmpeg; 使用&#…

ARM/Linux嵌入式面经(五六):科华数据

经典3分钟自我介绍,然后有两个面试官,第一个面试官偏基础八股, 文章目录 1、c++11和17的主要区别C++11的新特性C++17的新特性及与C++11的区别面试官追问及回答2、stl中使用的比较多的容器3、map的底层实现数据结构问题回答面试官追问及回答4、有没有使用过其他的数据结构5、…

etcd集群常见日志

1、节点失去领导者 {"level":"info","ts":"2024-05-07T01:54:04.948Z","logger":"raft","caller":"etcdserver/zap_raft.go:77","msg":"raft.node: 9afce9447872453 lost le…

【Python网络爬虫笔记】11- Xpath精准定位元素

目录 一、Xpath 在 Python 网络爬虫中的作用(一)精准定位元素(二)应对动态网页(三)数据结构化提取 二、Xpath 的常用方法(一)节点选取(二)谓词筛选&#xff0…

Vue 学习-基础

1 声明式渲染 能在改变时触发更新的状态被称作是响应式的。我们可以使用 Vue 的 reactive() API 来声明响应式状态。reactive() 只适用于对象 (包括数组和内置类型,如 Map 和 Set)。而另一个 API ref() 则可以接受任何值类型。ref 会返回一个包裹对象,并…

24. 生成器

一、什么是生成器 利用迭代器,我们可以每次迭代获取数据(通过 next() 方法)时按照特定的规律进行生成。但是在实现一个迭代器时,关于当前迭代的状态需要我们自己记录,进而才能根据当前状态生成下一个数据。为了达到记录…

软件测试等级说明

Level 0 (冒烟测试-Smoke Test):位于最顶部,是所有测试的基础,用来快速验证新构建是否稳定。Level 1 (基本功能测试):在冒烟测试之下,它比冒烟测试更深入,确保主要功能按预期工作。Level 2 (集成测试)&…