Go-数组-实现队列
package main import (
"errors"
"fmt"
) // 队列
// 特征:
// 1. 按照元素的添加顺序排序,并且容量固定
// 2. 添加元素,放入末尾
// 3. 移出元素,将最先加入的元素移出
// 4. First In First Out -> FIFO
// 实现(头指针 + 尾指针 + 保存元素的元组):
// 1. 数组
// 2. 链表
// 思路:
// 1. 头指针 + 尾指针 + 保存元素的元组
// 2. 两个方法 Add() Get()
// 3. 判空 empty,判满 full // Go 实现队列思路
// 1. queue结构体, buf存储数据, head通过切片下标指向队列头部,tail通过切片下标指向队列尾部,但tail指向的下标不存放元素
// 2. 添加元素使用 Push方法,移动tail指针,如果 tail指针值超过最大值,则重置tail指针指向0, overFlow置为 true
// 3. 读取元素使用 Pop方法,移动head指针,如果head指针等于最大值,则重置head指针为0, overflown置为false
// 4. 判空:如果 overflown为false且 head = tail时候为空
// 5. 判满: 如果 overflown为false且 tail = maxSize 时为满,如果overflown为true且 tail -1 = head 时候为满
// 难点: 什么时候head 和 tail指针归0,如何空与判满 // queue 模拟队列
type queue struct {
// buf 存放元素
buf []int
// 一个指向队列的头部,一个指向尾部,但尾部指向的位置不包含元素
head, tail int
// 判断头部是否溢出
overflow bool
maxSize int
} func NewQueue(size int) *queue {
return &queue{
buf : make([]int, size + 1),
maxSize: size,
}
} // Push 向队列中添加一个元素
func (q *queue) Push(elem int) (err error) { // 1. 判满
if q.overflow {
if q.tail - 1 == q.head {
err = errors.New("Q 满")
fmt.Println(err)
return err
}
} else {
if q.tail == q.maxSize {
err = errors.New("Q 满")
return err
}
}
// 1. 添加元素,应该头指针指向的下标不存储元素
q.tail ++
q.buf[q.tail - 1] = elem
// 如果 q.tail 结果为maxSize则值为0
if q.tail == q.maxSize {
q.tail = 0
q.overflow = true
}
return
} // Pop 从队列中移出一个元素
func (q *queue) Pop() (elem int, err error) {
// 1. 判空
if !q.overflow {
if q.tail == q.head {
err = errors.New("Q 空")
fmt.Println(err)
return -1, err
}
}
// 1. 移出元素,获取头指针指向的元素,并且将头指针加上1
elem = q.buf[q.head]
q.head ++
// 2. 如果 q.head 值等于最大值则重置为0
if q.head == q.maxSize {
q.head = 0
q.overflow = false
}
return
} // Show 显示队列中的元素
func (q *queue) Show() {
data := make([]int, 0 , q.maxSize)
if q.overflow {
data = append(data, q.buf[:q.tail]...)
data = append(data, q.buf[q.head:q.maxSize]...)
} else {
data = append(data, q.buf[q.head:q.tail]...)
}
fmt.Println(data)
} func main() {
q := NewQueue(3)
q.Push(3)
q.Push(4)
q.Push(5) q.Pop()
q.Pop()
q.Pop()
q.Pop()
q.Pop()
q.Show()
q.Pop()
q.Show()
}
Go-数组-实现队列的更多相关文章
- uva 12100 Printer Queue 优先级队列模拟题 数组模拟队列
题目很简单,给一个队列以及文件的位置,然后一个一个检查,如果第一个是优先级最高的就打印,否则放到队列后面,求所要打印的文件打印需要花费多长时间. 这里我用数组模拟队列实现,考虑到最糟糕的情况,必须把数 ...
- Python:数组、队列及堆栈的使用(list用法)--转
Python编程中数组.队列及堆栈用于保存一组数据或对象的序列,元素可以是各种类型混合在一起,定义格式为[元素,元素,……,元素],用变量[位置]即可取出相应的元素,其中“位置”是从零开始计算. 数组 ...
- php中数组模拟队列、栈的函数以及数组指针操作
1,数组指针,current表示当前指针,输出其指向的元素:next表示指针移动到下一个元素:prev指针移动到上一个元素:end表示指针移动到最后一个元素:reset表示指针移动到第一个元素: &l ...
- PHP使用数组实现队列(实际就是先进先出怎样实现)
PHP的数组处理函数还能够将数组实现队列,堆栈是"先进后出". 在堆栈中,最后压入的数据(进栈),将会被最先弹出(出栈).而队列是先进先出.就如同银行的排号机 PHP中将数组当做一 ...
- 【学习总结】java数据结构和算法-第三章-稀疏数组和队列
相关链接 [学习总结]尚硅谷2019java数据结构和算法 github:javaDSA 目录 稀疏数组 队列 稀疏数组 稀疏数组介绍 图示 应用实例 代码实现 SparseArray.java:与二 ...
- 【Weiss】【第03章】练习3.25:数组模拟队列
[练习3.25] 编写实现队列的例程,使用 a.链表 b.数组 Answer: 在这章一开头就已经写了个链表的队列例程了,所以实际上只要做b小题就可以. 数组模拟队列和链表的两点小不同是: ①.数组空 ...
- 用数组实现队列(顺序队列&循环队列)
用数组实现队列(顺序队列&循环队列) 顺序队列 ️ 队列(先进先出) 几个问题: 队列方法:入队.出队 队列的存储:即队首队尾两个指针, 扩容:如果队列容量不够了,应该扩容,如果队尾没有位置了 ...
- Java数组模拟队列 + 优化
队列介绍 队列是一个有序列表,可以用数组或是链表来实现. 遵循先入先出的原则. 即:先存入队列的数据,要先取出.后存入的要后取出 示意图:(使用数组模拟队列示意图) 数组模拟队列 队列本身是有序列表 ...
- 线性结构和非线性结构、稀疏数组、队列、链表(LinkedList)
一.线性结构和非线性结构 线性结构: 1)线性绪构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系 2)线性结构有两种不同的存储结构,即顺序存储结构和链式存储结构.顺序存储的线性表称为顺 ...
- JDK数组阻塞队列源码深入剖析
JDK数组阻塞队列源码深入剖析 前言 在前面一篇文章从零开始自己动手写阻塞队列当中我们仔细介绍了阻塞队列提供给我们的功能,以及他的实现原理,并且基于谈到的内容我们自己实现了一个低配版的数组阻塞队列.在 ...
随机推荐
- ElasticSearch之Index stats API
获取指定索引的统计数据. 获取指定索引的全部统计数据,命令样例如下: curl -X GET "https://localhost:9200/testindex_001/_stats?pre ...
- 通过 KernelUtil 截取 QQ / TIM 客户端 ClientKey 详细教程
前言 众所周知,由于最新版本 QQ 9.7.20 已经不能通过模拟网页快捷登录来截取 Clientkey,估计是针对访问的程序做了限制,然而经过多方面测试,诸多的地区.环境.机器也针对这种获取方法做了 ...
- Go 自动补全gocode
go语言自动补全代码,需要添加gocode的程序. 执行: go get github.com/nsf/gocode 一般来说,gocode的源码会在$GOPATH/src/github.com/ns ...
- electron入门之配置镜像加速(四)
electron入门到入土,配置阿里镜像加速.为了防止后面我们打包龟速,需要给electron配置阿里镜像加速 在下面的文件内添加阿里镜像加速,你的文件位置不一定是这个 C:\Program File ...
- MyBatis—Spring 动态数据源事务的处理
在一般的 Spring 应用中,如果底层数据库访问采用的是 MyBatis,那么在大多数情况下,只使用一个单独的数据源,Spring 的事务管理在大多数情况下都是有效的.然而,在一些复杂的业务场景下, ...
- Kafka 万字精讲|工作五年这些你都知道吗?
目录 前言 一.Kafka 简介 1.1 事件流平台 1.2 Kafka 主要概念和术语 1.3 Zookeeper 二.Kafka 集群搭建和使用 2.1 使用 Docker Compose 搭建 ...
- 在 K8S 大规模场景下, Service 性能如何优化?
摘要:Kubernetes 原生的 Service 负载均衡基于 Iptables 实现,其规则链会随 Service 的数量呈线性增长,在大规模场景下对 Service 性能影响严重.本文分享了华为 ...
- 玩转GaussDB 中的SET操作符
摘要:关系数据库中提供了一个关于集合的运算符SET操作符,其中包括以下操作:UNION/UNION ALL 并集.INTERSECT 交集.MINUS 差集. 本文分享自华为云社区<GaussD ...
- Nginx在windows下常用命令
cmd 进入Nginx解压目录 执行以下命令 start nginx : 启动nginx服务 nginx -s reload :修改配置后重新加载生效 nginx -s reopen :重新打开日志文 ...
- Solon2 开发之IoC,六、提取 Bean 的函数进行定制开发
为什么需要提取Bean的函数?绝不是闲得淡疼.比如:控制器的@Mapping:再比如:Xxl-Job的@XxlJob.这些都是要提取Bean的函数并定制加工的. 1.比如提取 @XxlJob 注解的函 ...