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数组阻塞队列源码深入剖析 前言 在前面一篇文章从零开始自己动手写阻塞队列当中我们仔细介绍了阻塞队列提供给我们的功能,以及他的实现原理,并且基于谈到的内容我们自己实现了一个低配版的数组阻塞队列.在 ...
随机推荐
- Educational Codeforces Round 159 总结
最失败的一集. C 开题顺序搞错,不小心先开了C,以为是A.还好C不难. 题意大概是在给定的数组最后添一个数(所有数两两不同),再自定义一个数 \(k\) ,数组中每个数可以加上若干个 \(k\) , ...
- ElasticSearch之cat datafeeds API
命令样例如下: curl -X GET "https://localhost:9200/_cat/ml/datafeeds?v=true&pretty" --cacert ...
- 2023-08-26:请用go语言编写。开心一下的智力题: 有一个村庄,一共250人, 每一个村民要么一定说谎,要么只说真话, 村里有A、B、C、D四个球队,且每个村民只会喜欢其中的一支球队, 但是说
2023-08-26:请用go语言编写.开心一下的智力题: 有一个村庄,一共250人, 每一个村民要么一定说谎,要么只说真话, 村里有A.B.C.D四个球队,且每个村民只会喜欢其中的一支球队, 但是说 ...
- vscode搜索卡顿
解决vscode搜索,编辑器卡死问题
- 一图看懂CodeArts Release三大特性
本文分享自华为云社区<一图看懂CodeArts Release三大特性,带你玩转发布管理服务>,作者:华为云PaaS服务小智. 华为云发布管理服务Codearts Release,是面向开 ...
- 基于KubeEdge的边缘节点分组管理设计与实现
摘要:KubeEdge 1.11版本提供了"边缘节点分组管理"新特性,抽象出了跨地域的应用部署模型. 本文分享自华为云社区<基于KubeEdge的边缘节点分组管理设计与实现& ...
- CIO们开始将软件供应链升级为安全优先级top
开源之所以在软件开发中大量使用的原因是它提供了经过良好测试的构建块,可以加速复杂应用程序和服务的创建.但是第三方软件组件以及包和容器的便利性同时也带来了风险--软件供应链攻击. 软件供应链攻击日益普遍 ...
- 字节跳动基于ClickHouse优化实践之“资源隔离”
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 相信大家都对大名鼎鼎的 ClickHouse 有一定的了解了,它强大的数据分析性能让人印象深刻.但在字节大量生产使 ...
- GPT-4测评,大家先别急,图片输入还没来
昨天GPT-4朋友圈刷屏,我更新了一篇小文章,极简罗列GPT-4的一些情报: 1 ChatGPT Plus用户才可试用GPT-4 2 试用阶段每四小时最多100条信息 3 知识库还是2021年 4 上 ...
- 接口文档 token原理 jwt介绍和原理 drf-jwt快速使用
目录 昨日回顾 认证 权限 频率 全局异常处理 接口文档 接口文档编写 drf自动生成接口文档 cookies-session-token发展史 jwt介绍和原理 jwt的构成 base64的编码和解 ...