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-数组-实现队列的更多相关文章

  1. uva 12100 Printer Queue 优先级队列模拟题 数组模拟队列

    题目很简单,给一个队列以及文件的位置,然后一个一个检查,如果第一个是优先级最高的就打印,否则放到队列后面,求所要打印的文件打印需要花费多长时间. 这里我用数组模拟队列实现,考虑到最糟糕的情况,必须把数 ...

  2. Python:数组、队列及堆栈的使用(list用法)--转

    Python编程中数组.队列及堆栈用于保存一组数据或对象的序列,元素可以是各种类型混合在一起,定义格式为[元素,元素,……,元素],用变量[位置]即可取出相应的元素,其中“位置”是从零开始计算. 数组 ...

  3. php中数组模拟队列、栈的函数以及数组指针操作

    1,数组指针,current表示当前指针,输出其指向的元素:next表示指针移动到下一个元素:prev指针移动到上一个元素:end表示指针移动到最后一个元素:reset表示指针移动到第一个元素: &l ...

  4. PHP使用数组实现队列(实际就是先进先出怎样实现)

    PHP的数组处理函数还能够将数组实现队列,堆栈是"先进后出". 在堆栈中,最后压入的数据(进栈),将会被最先弹出(出栈).而队列是先进先出.就如同银行的排号机 PHP中将数组当做一 ...

  5. 【学习总结】java数据结构和算法-第三章-稀疏数组和队列

    相关链接 [学习总结]尚硅谷2019java数据结构和算法 github:javaDSA 目录 稀疏数组 队列 稀疏数组 稀疏数组介绍 图示 应用实例 代码实现 SparseArray.java:与二 ...

  6. 【Weiss】【第03章】练习3.25:数组模拟队列

    [练习3.25] 编写实现队列的例程,使用 a.链表 b.数组 Answer: 在这章一开头就已经写了个链表的队列例程了,所以实际上只要做b小题就可以. 数组模拟队列和链表的两点小不同是: ①.数组空 ...

  7. 用数组实现队列(顺序队列&循环队列)

    用数组实现队列(顺序队列&循环队列) 顺序队列 ️ 队列(先进先出) 几个问题: 队列方法:入队.出队 队列的存储:即队首队尾两个指针, 扩容:如果队列容量不够了,应该扩容,如果队尾没有位置了 ...

  8. Java数组模拟队列 + 优化

    队列介绍 队列是一个有序列表,可以用数组或是链表来实现. 遵循先入先出的原则. 即:先存入队列的数据,要先取出.后存入的要后取出 示意图:(使用数组模拟队列示意图)  数组模拟队列 队列本身是有序列表 ...

  9. 线性结构和非线性结构、稀疏数组、队列、链表(LinkedList)

    一.线性结构和非线性结构 线性结构: 1)线性绪构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系 2)线性结构有两种不同的存储结构,即顺序存储结构和链式存储结构.顺序存储的线性表称为顺 ...

  10. JDK数组阻塞队列源码深入剖析

    JDK数组阻塞队列源码深入剖析 前言 在前面一篇文章从零开始自己动手写阻塞队列当中我们仔细介绍了阻塞队列提供给我们的功能,以及他的实现原理,并且基于谈到的内容我们自己实现了一个低配版的数组阻塞队列.在 ...

随机推荐

  1. 用Linux搭建网站(LAMP)

    安装环境 演示服务器版本为CentOS 8 安装apache 下载apache yum install httpd httpd-devel 启动apache服务器 systemctl start ht ...

  2. 文心一言 VS 讯飞星火 VS chatgpt (30)-- 算法导论5.2 2题

    二.在 HIRE-ASSISTANT 中,假设应聘者以随机顺序出现,你正好雇用两次的概率是多少? 文心一言: 我们可以先计算出在HIRE-ASSISTANT中,雇佣一个应聘者的概率为3/4,然后计算出 ...

  3. 【程序员的福音】一款C#开源的GitHub加速神器

    前言 作为一个程序员你是否会经常会遇到GitHub无法访问(如下无法访问图片),或者是访问和下载源码时十分缓慢就像乌龟爬行一般.之前有尝试过手动修改host文件来解决网站的访问问题,以及更换网络但还是 ...

  4. C#判断字符串是否是有效的XML格式数据

    说明 在try-catch语句块中,创建XmlDocument对象,并使用LoadXml方法加载xml字符串.如果没有异常,则说明xml字符串是有效的,返回true,反之为false. 代码实现 // ...

  5. vue音频(监听播放完成)

    <template> <div> <audio ref="audio" :src="audioSrc"></audio ...

  6. 讲真,你知道Python咋来的吗?

    摘要:什么是Python?它怎么诞生的?它跟C语言.shell语言有什么区别?语言环境是怎么样的?这些你都知道吗? Python诞生在一个圣诞节 Python诞生于1989年的一个圣诞节,其创作者Gu ...

  7. 华为云“网红”语言Python课程来啦!

    摘要:来华为云社区学Python,瓜分40万码豆还有HUAWEI GT手表拿! 现代职场大量重复性的工作.日报周报月报无穷无尽.不计其数的数据提取.琐碎繁杂的事物让工作效率极低. 而Python的出现 ...

  8. 华为云企业级Redis揭秘第17期:集群搭载多DB,多租隔离更降本

    摘要:GaussDB(for Redis)支持真正可扩展的多DB,轻松实现降本增效. 本文分享自华为云社区<华为云企业级Redis揭秘第17期:集群搭载多DB,多租隔离更降本>,作者: G ...

  9. 云小课|三大灵魂拷问GaussDB(DWS)数据落盘安全问题

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:GaussDB(D ...

  10. 混合编程:如何用pybind11调用C++

    摘要:在实际开发过程中,免不了涉及到混合编程,比如,对于python这种脚本语言,性能还是有限的,在一些对性能要求高的情景下面,还是需要使用c/c++来完成. 本文分享自华为云社区<混合编程:如 ...