用go实现一个循环队列

目录

  • 队列
    • 数组队列的“假溢出”现象
    • 循环队列
    • 三种判断队列空和满的方法
      • 无下标(链式)
      • 有下标(顺序)
      • 长度标记
    • go用顺序表实现一个循环队列
    • 队列的链式存储结构

队列

队列(queue)是只允许在一端进行插入操作,在另一端进行删除操作的线性表,简称“队”。

队列是一种先进先出(First In First Out)的线性表,简称FIFO。

允许插入的一端称为队尾(rear),允许删除的一端称为队头(front)。

向队列中插入新的数据元素称为入队,新入队的元素就成为了队列的队尾元素。

从队列中删除队头元素称为出队,其后继元素成为新的队头元素。
在这里插入图片描述
队列有很多种,按照存储结构划分,有链式队列,循环队列,单向队列,双端队列。实现队列的方式也有很多种,如基于链式存储结构的链接队列(又称链队列),基于顺序存储结构的队列。

数组队列的“假溢出”现象

在队列的顺序存储结构中,除了用一组地址连续的存储单元依次存放从队列头到队列尾的元素之外,还需要设置头尾两个指针front和rear,分别指示队列头元素及队尾元素的位置。

  1. 初始化建立空队列时,令front=rear=0
  2. 每当插入新的队尾元素时,“尾指针增1”
  3. 每当删除队头元素时,“头指针增1”
  4. 在非空队列中,头指针始终指向队列头元素,尾指针始终指向队列尾元素的下一个位置

在这里插入图片描述

在入队和出队的操作中,头尾指针只增加不减小,致使被删除元素的空间永远无法重新利用,因此,尽管队列中实际的元素个数远远小于向量空间的规模,但也可能由于尾指针巳超出向量空间的上界而不能做入队操作,该现象称为假溢出。

解决办法:将顺序队列臆造为一个环状的空间,称之为循环队列

循环队列

在这里插入图片描述
队列的头尾相接的顺序存储结构称为循环队列。

问题:当循环对列为空或满时,都是队尾指针等于队头指针,即rearfront 。当rearfront时,该是判满还是判空呢?

解决方案:

  1. 方案一:设置一个计数器,开始时计数器设为0,新元素入队时,计数器加1,元素出队,计数器减1。当计数器MAXSIZE时,队满;计数器0时,队空。

  2. 方案二:保留一个元素空间,当队尾指针指的空闲单元的后继单元是队头元素所在单元时,队满。

三种判断队列空和满的方法

无下标(链式)

在这里插入图片描述

当队列为空时条件:rear == front

当队列满时条件为:rear+1 == front

有下标(顺序)

在这里插入图片描述
当队列为空时条件:rear == front

当队列满时条件为:(rear+1)% maxsize == front

长度标记

设置一个标记位:

队列为空时,count == 0

当有元素入队时,count++,当count和队列的maxsize相等时,代表队列已满

go用顺序表实现一个循环队列

初始化结构体:

type LoopQueue struct {mem []int// length & capcap int// indexfront, rear int
}func Queue(size int) *LoopQueue {return &LoopQueue{mem:   make([]int, size),cap:   size,front: 0,rear:  0,}
}

判空,判满:

func (q *LoopQueue) IsEmpty() bool {return q.front == q.rear
}func (q *LoopQueue) IsFull() bool {return (q.rear+1)%q.cap == q.front
}

push,pop操作:

func (q *LoopQueue) Push(val int) error {if q.IsFull() {return errors.New("queue is full")}q.mem[q.rear] = val// 当尾达到最大index就不能简单自增而是要循环q.rear = (q.rear + 1) % q.capreturn nil
}func (q *LoopQueue) Pop() (int, error) {if q.IsEmpty() {return -1, errors.New("empty queue")}pop := q.mem[q.front]// 当头达到最大index就不能简单自增而是要循环q.front = (q.front + 1) % q.capreturn pop, nil
}

队列的链式存储结构

采用链式存储结构实现的队列称为链队列。

为了使操作更加方便,将队头指针指向链队列的头结点,而队尾指针指向终端结点。

在这里插入图片描述
用链表实现的队列也有“假溢出”的现象,所以go提供了Ring数据结构,只要导入"container/ring"就可以使用循环链表。

type Ring struct {next, prev *RingValue      any // for use by client; untouched by this library
}func New(n int) *Ring {if n <= 0 {return nil}r := new(Ring)p := rfor i := 1; i < n; i++ {p.next = &Ring{prev: p}p = p.next}// 头尾相连p.next = rr.prev = preturn r
}

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

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

相关文章

Python—下载清华大学鹏城实验室遥感数据

当想下载清华大学鹏城实验室10m土地利用数据的时候&#xff0c;发现他们的下载方式很奇怪&#xff0c;只能一页页的点名称全选 &#xff0c;然后批量下载&#xff0c;再一个个的加入浏览器下载&#xff0c;当一次下载过多就回卡顿和下载失败&#xff0c;所以就有了想用python进…

C++项目实战——基于多设计模式下的同步异步日志系统-①-项目介绍

文章目录 专栏导读项目介绍开发环境核心技术环境搭建日志系统介绍1.为什么需要日志系统2.日志系统技术实现2.1同步写日志2.2异步写日志 专栏导读 &#x1f338;作者简介&#xff1a;花想云 &#xff0c;在读本科生一枚&#xff0c;C/C领域新星创作者&#xff0c;新星计划导师&a…

Java23种设计模式之【单例模式】

目录 一.单例模式的起源&#xff0c;和应用场景 1.单例模式的前世今生&#xff01; 2.什么是单例模式&#xff1f; 2.1使用单例模式的注意事项 2.2如何理解单例模式&#xff1f; 2.3单例模式的优势以及不足&#xff01; 2.4使用场景 二.实现 1.实现思路 1.1创建一个 S…

基于SSM的网络游戏公司官方平台

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

python实现zscore归一化和minmax标准化

zscore归一化&#xff1a; minmax from sklearn import preprocessing from sklearn.preprocessing import StandardScaler import numpy as np# 数据 x np.array([[1.,-1.,2.],[2.,0.,0.],[0.,1.,-1.]]) print(----------------minmaxscaler标准化-------------) # 调用minma…

初始化一个 vite + vue 项目

创建项目 首先使用以下命令创建一个vite项目 npm create vite然后根据提示命令 cd 到刚创建的项目目录下&#xff0c;使用npm install安装所需要的依赖包&#xff0c;再使用npm run dev即可启动项目 配置 vite.config.js 添加process.env配置&#xff0c;如果下面 vue-route…

mysql课堂笔记 mac

目录 启动mac上的mysql 进入mysql mac windows 创建数据库 创建表 修改字段数据类型 修改字段名 增加字段 删除字段 启动mac上的mysql sudo /usr/local/mysql/support-files/mysql.server start 直接输入你的开机密码即可。 编辑 进入mysql mac sudo /usr/local…

Java认识异常(超级详细)

目录 异常的概念和体系结构 异常的概念 异常的体系结构 异常的分类 1.编译时异常 2.运行时异常 异常的处理 防御式编程 LBYL EAFP 异常的抛出 异常的捕获 异常声明throws try-catch捕获并处理 finally 异常的处理流程 异常的概念和体系结构 异常的概念 在Java中…

一篇文章教会你如何降低代码的冗余度——探索指针数组,数组指针,函数指针,函数指针数组,回调函数的奥妙

前言&#xff1a;人们总说指针是c语言的灵魂&#xff0c;是因为指针的使用技巧是“千姿百态”的&#xff0c;程序员可以通过指针来直接访问内存&#xff0c;这就赋予了它功能的多样性以及更多意想不到的编程技巧与方式&#xff0c;在本篇文章中&#xff0c;笔者就给大家带来指针…

嵌入式Linux驱动开发(LCD屏幕专题)(二)

一、结合APP分析LCD驱动程序 1、open app: open("/dev/fb0", ...) 主设备号: 29, 次设备号: 0 -------------------------------------------------------------- kernel:fb_open // fbmem.cstruct fb_info *info;info get_fb_info(fbidx);if (info->fbop…

VB:顺序查找

VB&#xff1a;顺序查找 Private Sub Command1_Click()Dim i%, m%Dim x(1 To 10) As SingleFor i 1 To 10x(i) Val(InputBox("请输入"))Next im seqSearch(x, 10)If (m 1) ThenPrint "已找到"ElsePrint "未找到"End If End Sub Function se…

Altium 高级技巧 在扁平原理图中创建多个ROOM

Altium 的 ROOM 这个特性非常有用&#xff0c; 使用ROOM在编辑PCB时&#xff0c;可以很方便的整体拖动局部器件和电路图&#xff0c;为模块化电路设计提供便利 常规的设计模式应该采用垂直模式&#xff0c; 由顶层-中间层-底层&#xff0c; 顶层设计整体的框图连接&#xff…

JavaSE【 String 类】(2)(

一、字符串的不可变性 1.String本身不可变 字符串修改 注意&#xff1a;尽量避免直接对 String 类型对象进行修改&#xff0c;因为 String 类是不能修改的&#xff0c;所有的修改都会创建新对象&#xff0c;效率 非常低下。 public static void main(String[] args) {/*** S…

sublime编辑latex 出现参考文献无法编译报错:citation “...” undefined

问题描述 使用sublime编译latex文件时&#xff0c;参考文献按照常规的方式放好&#xff0c;ctrl B 编译的时候&#xff0c;显示找不到参考文献&#xff0c;编译出的pdf文件也没有references&#xff1a; 但是把文件放到overleaf上就可以直接编译出来&#xff0c;说明是本地编…

向量数据库,能让AI再次起飞吗?

9月7-8日&#xff0c;深圳国际会展中心18号馆 来了&#xff0c;来了&#xff0c;腾讯面向产业互联网领域规格最高、规模最大、覆盖最广的年度科技盛会 -——- 腾讯全球数字生态大会。 9 月 7 日&#xff0c;我们将聚焦产业未来发展新趋势&#xff0c;针对云计算、大数据、人工…

滴滴:二季度中国出行营收同比增长57%,6月日均单量超3000万单

9月9日&#xff0c;滴滴在其官网发布2023年第二季度业绩报告&#xff0c;二季度滴滴实现总收入488亿元&#xff0c;同比增长52.6%&#xff1b;归属于滴滴普通股股东的净亏损为3亿元&#xff0c;经调整EBITA亏损1000万元。 分业务来看&#xff0c;二季度滴滴中国出行&#xff0…

fastjson漏洞复现

文章目录 启动环境漏洞复现下载bp插件漏洞扫描dnslog测试是否向外请求资源用工具构造rmi服务器 反弹shell 启动环境 到vulhub目录下 cd vulhub/fastjson/1.2.24-rce安装环境并启动&#xff1a; sudo docker-compose up -d && sudo docker-compose up -d启动成功&…

详解TCP/IP的三次握手和四次挥手

文章目录 前言一、TCP/IP协议的三次握手1.1 三次握手流程 二、TCP/IP的四次挥手2.1 四次挥手流程 三、主要字段3.1、标志位&#xff08;Flags&#xff09;3.2、序号&#xff08;sequence number&#xff09;3.3、确认号&#xff08;acknowledgement number&#xff09; 四、状态…

MySQL——事务

一、事务的开始与结束 一个数据库事务由一条或多条sql语句构成&#xff0c;它们形成一个逻辑的工作单元。这些sql语句要么全部执行成功&#xff0c;要么全部执行失败。 1.1.事物的开始 1.对于DDL&#xff08;create&#xff0c;alter&#xff0c;drop&#xff09;和DCL&…

Java 中如何实现序列化?

什么是序列化&#xff1f;Java 中如何实现序列化&#xff1f; 在 Java 编程中&#xff0c;序列化是一种将对象转换为字节流的过程&#xff0c;可以将对象在网络中传输或者保存到磁盘中。序列化可以将对象的状态保存下来&#xff0c;以便在需要时重新创建对象。Java 中提供了一…