Go数据结构----队列操作

news/2024/11/24 2:28:42/

四、实现数组队列ArrayQueue

队列先进先出,和栈操作顺序相反,我们这里只实现入队,和出队操作,其他操作和栈一样。

package mainimport "sync"// 数组队列,先进先出
type ArrayQueue struct {array []string   //底层切片size  int        //队列元素的数量lock  sync.Mutex //为了并发安全使用的锁
}// 入队操作
func (queue *ArrayQueue) Add(v string) {queue.lock.Lock()defer queue.lock.Unlock()//放入切片中,后进的元素放在数组最后面queue.array = append(queue.array, v)//队中元素数量+1queue.size += 1}//直接将元素放在数组最后面即可,和栈一样,时间复杂度为:O(n)。//出队操作func (queue *ArrayQueue) Pop() string {queue.lock.Lock()queue.lock.Unlock()//如果队列为空的话if queue.size == 0 {panic("队列已空")}//取出队列最前端的数据,但你要考了不后续元素补位问题v := queue.array[0]/*相当于处理方式1直接原位进行移动,但缩容的后续的空间不会被释放for i := 0; i < queue.size; i++ {//从第一位开始进行数据移动操作queue.array[i-1]=queue.array[i]}//并且原数组缩容queue.array=queue.array[0:queue.size-1]*///下面使用第二种开辟新数组进行操作newArray := make([]string, queue.size-1, queue.size-1)for i := 1; i < queue.size; i++ {//从原数组的第一位进行开始数据移动newArray[i-1] = queue.array[i]}queue.array = newArray//然后队中元素数量-1queue.size = queue.size - 1return v
}
func main() {}

注意:

出队,把数组的第一个元素的值返回,并对数据进行空间挪位,挪位有两种:

  1. 原地挪位,依次补位 queue.array[i-1] = queue.array[i],然后数组缩容:queue.array = queue.array[0 : queue.size-1],但是这样切片缩容的那部分内存空间不会释放。
  2. 创建新的数组,将老数组中除第一个元素以外的元素移动到新数组。

时间复杂度是:O(n)

五、实现链表队列LinkQueue

​ 队列先进先出,和栈操作顺序相反,无非和上述实现方式不一样罢了

package mainimport "sync"//链表队列,先进先出type LinkQueue struct {root *LinkNode //链表起点size intlock sync.Mutex
}
type LinkNode struct {next  *LinkNodeValue string
}// 入队操作
func (queue *LinkQueue) Add(v string) {queue.lock.Lock()defer queue.lock.Unlock()//如果栈为空,就进行增加节点操作if queue.root == nil {queue.root = new(LinkNode)queue.root.Value = v} else {//如果不为空,将新元素加入到我们的链表的末尾//新节点的创建newNode := new(LinkNode)newNode.Value = v// 一直遍历到链表尾部nowNode := queue.rootfor nowNode.next != nil {newNode = nowNode.next}//然后将新节点放在链表末尾nowNode.next = newNode}//队中元素数量+1queue.size = queue.size + 1
}//将元素放在链表的末尾,所以需要遍历链表,时间复杂度为:O(n)。//出队操作
func (queue *LinkQueue) Remove() string {queue.lock.Lock()defer queue.lock.Unlock()//队列元素已为空if queue.size == 0 {panic("队列为空")}//出队操作topNode := queue.rootv := topNode.Value//然后将顶部元素的后续链接连接上queue.root = topNode.next//并且队中元素数量-1queue.size = queue.size - 1return v}
//链表第一个节点出队即可,时间复杂度为:O(1)。
func main() {}

http://www.ppmy.cn/news/69570.html

相关文章

pyinstaller 打包 py脚本中有子进程的问题

打包成的exe会开启一个一模一样界面的子进程 在if __name__ __main__: 中加入&#xff1a;multiprocessing.freeze_support()

【Linux】多线程概念再理解

文章目录 1. 物理内存与磁盘的关系如何理解物理内存&#xff1f;凭什么物理内存要分为一个个4KB大小&#xff1f;若以块方式存储&#xff0c;则多出的空间是否浪费&#xff1f; 2. 虚拟地址到物理地址的转换3. 缺页中断4. 为什么字符常量区是不允许被修改的&#xff1f;5. 线程…

记一次springboot项目漏洞挖掘

前言 前段时间的比赛将该cms作为了题目考察&#xff0c;这个cms的洞也被大佬们吃的差不多了&#xff0c;自己也就借此机会来浅浅测试下这个cms残余漏洞&#xff0c;并记录下这一整个流程&#xff0c;谨以此记给小白师傅们分享下思路&#xff0c;有错误的地方还望大佬们请以指正…

Ada语言学习(1)Basic Knowledge

文章目录 说在前头命名注释数字变量变量类型signed integersEnumerationsFloating Points 类型重用&#xff08;继承&#xff09;类型转换 运算符属性&#xff08;Attributes&#xff09;练习 说在前头 本系列教程将会通过提问的方式来完成整个学习过程&#xff0c;因为当你能…

RabbitMQ --- 惰性队列、MQ集群

一、惰性队列 1.1、消息堆积问题 当生产者发送消息的速度超过了消费者处理消息的速度&#xff0c;就会导致队列中的消息堆积&#xff0c;直到队列存储消息达到上限。之后发送的消息就会成为死信&#xff0c;可能会被丢弃&#xff0c;这就是消息堆积问题。 解决消息堆积有三种…

Redis高可用实现

Redis高可用方案 一、高可用概述1.1 高可用概述1.2 Redis高可用方案主从复制模式Redis Sentinel模式Redis Cluster模式 1.3 常见高可用方案比较 二、高可用实践-集群2.1 集群概述2.2 集群配置2.2.1 IP地址与端口规划2.2.2 配置文件修改2.2.3 集群启动与测试 2.3 集群扩展与缩容…

轻松搭建冒险岛服务器-冒险岛私服搭建详细教程

想要拥有一个属于自己的冒险岛世界吗&#xff1f;想要一步步学习如何架设冒险岛服务器吗&#xff1f;本文将从如何选择服务器、安装系统、配置环境、搭建数据库、部署网站、上传文件、启动服务等8个方面&#xff0c;一步步为大家详细讲解冒险岛架设教程。让你轻松打造属于自己的…

数据分类分级 数据识别-excel分类分级模版文件导入、解析

前面讲了数据分类分级 数据识别-实现部分敏感数据识别,本次针对模版导入展开,excel导入采用的是easyexcel 目录 easyexcel介绍easyexcel实战添加依赖读取数据监听器的实现数据读取方法读取结果上面图片是AI创作生成!如需咒语可私戳哦! easyexcel介绍 之前的excel导入解析…