Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >go 环形队列

go 环形队列

作者头像
solate
发布于 2022-06-12 06:44:45
发布于 2022-06-12 06:44:45
1.1K00
代码可运行
举报
文章被收录于专栏:solate 杂货铺solate 杂货铺
运行总次数:0
代码可运行

环形队列

队列又称为“先进先出”(FIFO)线性表,限定只能在队尾插入,在队首删除

  1. 顺序队列:顺序存储结构,数组
  2. 链队列:链表结构。

内存上并没有环形的结构,因此环形队列实际上是数组的线性空间来实现的。

当数据到了尾部该如何处理呢?它将转回到原来位置进行处理,通过取模操作来实现

golang环形队列实现

什么是环形队列

如图所示,一个环形队列.含有二个指针: 队列头指针,队列尾指针.

实现环形队列图示过程

初始化一个数组大小为6的环形队列, 头指针front=0, 尾指针rear=0, 刚好front=rear =0的状态,表示环形队列为空.

2.向环形队列里插入1个元素,则rear指针移动一格,front=0,rear=1

3.继续添加a2,a3,a4,a5元素,rear指针指到末尾处,front=0, reat=5

4.如果再继续添加a6元素,则rear=6,大于数组大小,发生数组溢出.

5.如上图所示添加a6时,rear指针发生溢出.我们使用一个小技巧,当rear=6时与数组大小6进行取模, (rear+1) % maxLen,让rear指针回到开始处rear=0,问题来了,我 们无法判断数组是否满?因为初始化时front=rear=0, 现在数组满也是front=rear=0

6.解决以上问题有三种办法,我们采用第3种方法实现.

使用第3种方法: 即当(rear+1) % maxLen == front时,判断环形数组满,则无法添加元素

实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package circleQueue

import (
	"errors"
)

// 环形队列
type CircleQueue struct {
	length int   // 队列长度
	head   int   // 指向队列首 0
	tail   int   // 指向队列尾 0
	data   []any // 数组 => 模拟队列
}

func New(length int) *CircleQueue {
	return &CircleQueue{
		length: length,
		data:   make([]any, length),
	}
}

// 队列是否为空
func (s *CircleQueue) IsEmpty() bool {
	return s.head == s.tail
}

// 队列是否已经满了, 采用空一格的方式
func (s *CircleQueue) IsFull() (res bool) {
	return s.head == (s.tail+1)%s.length
}

// 环形队列长度
func (s *CircleQueue) Len() (res int) {
	return (s.tail - s.head + s.length) % s.length
}

// 队列尾新增元素
func (s *CircleQueue) Push(val any) (b error) {
	if s.IsFull() {
		return errors.New("队列已满!")
	}
	s.data[s.tail] = val
	s.tail = (s.tail + 1) % s.length
	return
}

// 队列头弹出元素
func (s *CircleQueue) Pop() (val any, err error) {
	if s.IsEmpty() {
		return nil, errors.New("队列为空!")
	}
	val = s.data[s.head]
	s.head = (s.head + 1) % s.length
	return
}

func (s *CircleQueue) Each(fn func(node any)) {
	for i := s.head; i < s.tail+s.length; i++ {
		fn(s.data[i%s.length])
	}
}

// 清空
func (s *CircleQueue) Clear() {
	s.head = 0
	s.tail = 0
	s.data = make([]any, s.length)
}

测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package circleQueue

import (
	"fmt"
	"testing"
)

func TestNew(t *testing.T) {

	queue := New(5)
	err := queue.Push(1)
	err = queue.Push(2)
	err = queue.Push(3)
	err = queue.Push(4)
	if err != nil {
		t.Error(err)
	}
	err = queue.Push(5)
	if err != nil {
		t.Error(err)
	}

	fn := func(node any) {
		fmt.Println(node)
	}
	queue.Each(fn)

	t.Log("Push End: ")
	val, err := queue.Pop()
	if err != nil {
		t.Error(err)
		return
	}
	t.Log(val)
	t.Log("Pop End: ")

	err = queue.Push(6)
	if err != nil {
		t.Error(err)
	}
	t.Log("Len: ", queue.Len())
	t.Log("Each End: ")

	queue.Pop()
	queue.Pop()
	t.Log("Len: ", queue.Len())
	queue.Push(7)
	queue.Push(8)
	t.Log("Len: ", queue.Len())

	queue.Clear()
	t.Log("Clear End: ")
	t.Log("Len: ", queue.Len())

}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
稀疏数组 & 环形队列
1、是什么? 比如有一个 11 * 11 的五子棋盘,我们要用程序模拟,那肯定就是二维数组。然后用1表示黑子,2表示白子,假如现在棋盘上只有一个黑子一个白子,那么也就是这个二维数组中只有一个1,一个2,其他都是无意义并不代表任何棋子的0,如下:
贪挽懒月
2020/09/01
4610
golang数据结构之环形队列
目录结构: circlequeue.go package queue import ( "errors" "fmt" ) //CircleQueue 环型队列 type CircleQueue struct { MaxSize int Array [5]int Front int Rear int } //Push 向队列中添加一个值 func (q *CircleQueue) Push(val int) (err error) {
西西嘛呦
2020/08/26
8580
go语言数据结构 环形队列
队列是一种常用的数据结构,这种结构保证了数据是按照“先进先出”的原则进行操作的,即最先进去的元素也是最先出来的元素.环形队列是一种特殊的队列结构,保证了元素也是先进先出的,但与一般队列的区别是,他们是环形的,即队列头部的上个元素是队列尾部,通常是容纳元素数固定的一个闭环。
李海彬
2018/07/26
1.8K0
go语言数据结构 环形队列
04 环形队列
对前面的数组模拟队列的优化,充分利用数组。因此将数组看做是一个环形的。(通过去模的方式来实现即可)
JusterZhu
2022/12/07
3910
04 环形队列
环形队列
图1中,rear和front分别代表队尾和队头并且初始化值都为0,此时都指队头,开始添加队列的操作,每次添加数据后,front不变,rear后移,rear的后移单位按照公式 (rear+1)%maxSize,maxSize表示队列的长度。
桑鱼
2020/03/17
8150
环形队列
环形队列的实现(什么是环形队列)
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/125500.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/02
7420
环形队列的实现(什么是环形队列)
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
概念:在使用队列之前,需要先为队列分配内存空间并进行初始化设置,这包括确定队列的数据结构、存储方式以及相关指针(如果是链式队列)或索引(如果是顺序队列)的初始状态。
Rossy Yan
2024/12/24
1030
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
【数据结构】栈和队列
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出 LIFO(Last In First Out)的原则。 333后进,最先出去。
xxxflower
2023/04/16
2500
【数据结构】栈和队列
数据结构 | TencentOS-tiny中队列、环形队列、优先级队列的实现及使用
队列(queue)是一种只能在一端插入元素、在另一端删除元素的数据结构,遵循「先入先出」(FIFO)的规则。
Mculover666
2020/07/21
9370
数据结构 | TencentOS-tiny中队列、环形队列、优先级队列的实现及使用
9.队列-生产消费模式
向固定大小的线程池投放请求任务时,若果线程池中没有空闲资源了,这时候还有新的请求进来,线程池如何处理这个请求?拒绝请求还是排队?使用怎样的处理机制
码哥字节
2020/05/17
8240
数据结构之环形队列
对前面的数组模拟队列的优化,充分利用数组,因此将数组看做是一个环形的。(通过取模的方式来实现即可)
用户11332765
2024/10/28
870
数据结构之环形队列
数据结构代码题-栈、队列
04.设单链表的表头指针为L,结点结构由data和next两个域构成,其中data域为字符型。试设计算法判断该链表的全部n个字符是否中心对称。例如xyx、xyyx都是中心对称。
愷龍
2023/10/16
3230
数据结构代码题-栈、队列
心一言 VS 讯飞星火 VS chatgpt (111)-- 算法导论10.2 2题
在这个实现中,Push 操作在链表头部插入新节点,时间复杂度是 O(1);Pop 操作删除头部节点并返回其值,时间复杂度也是 O(1)。
福大大架构师每日一题
2023/10/17
1890
心一言 VS 讯飞星火 VS chatgpt (111)-- 算法导论10.2 2题
循环队列原理及在单片机串口通讯中的应用(一)
  当写代码,不再是简单的完成需求,对代码进行堆砌,而是开始思考如何写出优美代码的时候,我们的代码水平必然会不断提升,今天,咱们来学习环形队列结构。
用户8913398
2021/08/16
1.1K0
循环队列原理及在单片机串口通讯中的应用(一)
《Java初阶数据结构》----4.<线性表---Stack栈和Queue队列>
用户11288958
2024/09/24
870
《Java初阶数据结构》----4.<线性表---Stack栈和Queue队列>
文心一言 VS 讯飞星火 VS chatgpt (106)-- 算法导论10.1 4题
在 Go 语言中,我们可以使用切片来实现队列。下面是如何实现 ENQUEUE 和 DEQUEUE 操作,同时处理队列的下溢和上溢的情况:
福大大架构师每日一题
2023/10/08
2750
文心一言 VS 讯飞星火 VS chatgpt (106)-- 算法导论10.1 4题
C++数据结构——队列「建议收藏」
(1)队列中的数据元素遵循“先进先出”(First In First Out)的原则,简称FIFO结构;
全栈程序员站长
2022/08/22
2.8K0
C++数据结构——队列「建议收藏」
知识改变命运 数据结构【栈和队列】
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈 顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。 出栈:栈的删除操作叫做出栈。出数据在栈顶。
用户11319080
2024/10/17
760
知识改变命运 数据结构【栈和队列】
队列
【1】队列本身是有序列表,若使用数组的结构来存储队列数据,队列数组的声明如下,其中 maxSize 是该队列的最大容量;
Java架构师必看
2021/05/14
4470
队列
稀疏数组和队列
当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。
用户9615083
2022/12/30
4090
稀疏数组和队列
相关推荐
稀疏数组 & 环形队列
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验