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数组阻塞队列源码深入剖析 前言 在前面一篇文章从零开始自己动手写阻塞队列当中我们仔细介绍了阻塞队列提供给我们的功能,以及他的实现原理,并且基于谈到的内容我们自己实现了一个低配版的数组阻塞队列.在 ...
随机推荐
- [Luogu 4912 帕秋莉的魔法] 题解报告
算法:DP, 背包,动态规划 简化版题目: 给定 \(n\) 个物品,物品的价值为 \(v_1 - v_n\),物品的体积为 \(w_1 - w_n\).需要选择一些物品,使它们的体积和为 \(V\) ...
- CVE-2023-36025 Windows SmartScreen 安全功能绕过漏洞
CVE-2023-36025是微软于11月补丁日发布的安全更新中修复Windows SmartScreen安全功能绕过漏洞.攻击者可以通过诱导用户单击特制的URL来利用该漏洞,对目标系统进行攻击.成功 ...
- 斯坦福 UE4 C++ ActionRoguelike游戏实例教程 12.认识GamePlayTag, 实现技能的互斥
斯坦福课程 UE4 C++ ActionRoguelike游戏实例教程 0.绪论 概述 本篇文章对应Lecture 17 - GameplayTags, 67.67节.本文将会讲述UE4中Gamepl ...
- 2021-01-14:timsort是什么,如何用代码实现?
福哥答案2021-01-14: 答案来自此链接: 介绍: timsort是一种混合.稳定高效的排序算法,源自合并排序和插入排序,旨在很好地处理多种真实数据.它由Tim Peters于2002年实施使用 ...
- CodeForces 1009E Intercity Travelling 概率DP
原题链接 题意 给我们一个长为n的序列,要求我们从头开始向右走n个节点,每个位置都有1 / 2的概率将我们传送回1号点之前,不过我们只需要完成走n步的任务就可以了.求我们走过的元素和 乘以 2的n - ...
- hutool的常用方法
https://www.hutool.cn/docs/#/ 官方文档 Hutool 是一个 Java 开发工具包,提供了丰富实用的工具类,包括字符串处理.日期处理.文件操作.加密解密.网络请求等等.以 ...
- Boost程序库完全开发指南:1.1-C++基础知识点梳理
主要整理了N多年前(2010年)学习C++的时候开始总结的知识点,好长时间不写C++代码了,现在LLM量化和推理需要重新学习C++编程,看来出来混迟早要还的. 1.shared_ptr 解析:sh ...
- 神经网络基础篇:详解logistic 损失函数(Explanation of logistic regression cost function)
详解 logistic 损失函数 在本篇博客中,将给出一个简洁的证明来说明逻辑回归的损失函数为什么是这种形式. 回想一下,在逻辑回归中,需要预测的结果\(\hat{y}\),可以表示为\(\hat{y ...
- openGemini v0.2.0版本正式发布:5大特性全面增强
摘要:openGemini是华为云面向物联网和运维监控场景开源的一款云原生分布式时序数据库,兼容InfluxDB API,具有高性能.高并发.高扩展等特点. openGemini是华为云面向物联网和运 ...
- GaussDB(for Redis)双活容灾支持4大应用场景,为业务安全保驾护航
摘要:GaussDB(for Redis)的双活解决方案,支持同域主备.同域双主.异地主备.异地双主四大应用场景,提供了安全可靠的容灾能力. 一场火灾引发的思考 2021年3月10日,欧洲某云服务提供 ...