单向队列(数组实现)

package mainimport ("errors""fmt""os"
)//队列是一种重要的数据结构,应用也相对广泛,实现队列的方式主要有数组和链表两种方式
//下面首先使用数组实现一个简单的单向队列
//队列的信息包括队列的大小、队列的存储形式(数组)、队列的头(不指向第一元素)、队列的尾(指向最后一个元素)
//对列的操作方法主要有向队列添加一个元素、从队列中获取一个元素、显示队列中的元素
//定义一个结构体用于保存队列的信息
type signalQueue struct {maxSize intarray [5]int //模拟队列head inttail int
}//定义一个向队列添加元素的方法
func (q *signalQueue) Push(val int) error{//先判断队列是否已满if q.tail == q.maxSize - 1 { //tail含最后一个元素return errors.New("队列已满")}q.tail++ //向后移动尾部q.array[q.tail] = valreturn nil
}//定义一个从队列获取元素的方法
func (q *signalQueue) Pop() (val int, err error) {//判断队列是否为空if q.tail == q.head {return -1, errors.New("队列为空")}q.head++ //由于head指向第一个元素的前面,因此要先向后移动val = q.array[q.head]return val, nil
}//定义一个显示队列元素的方法
func (q *signalQueue) List() error {//找到队首(不含第一个元素),然后遍历到队尾for i := q.head + 1; i <= q.tail; i++{fmt.Printf("array[%d]=%d\t", i, q.array[i])}fmt.Println()return nil
}func main (){queue := &signalQueue{maxSize: 5,array:   [5]int{},head:    -1,tail:    -1,}var key stringvar val int//添加数据for {fmt.Println("1.add添加数据到队列")fmt.Println("2.get从队列获取数据")fmt.Println("3.show显示队列")fmt.Println("4.exit退出队列")fmt.Scanln(&key)switch key {case "add":fmt.Println("输入你要入队列的数据")fmt.Scanln(&val)err := queue.Push(val)if err != nil {fmt.Println(err)} else {fmt.Println("成功入队")}case "get":val, err := queue.Pop()if err != nil {fmt.Println(err)} else {fmt.Println("出队列的数为:", val)}case "show":queue.List()case "exit":os.Exit(0)}}
}//总结:
//上面实现的单向队列存在的一个最大的问题是:
//没有有效的利用数据的有效空间,会存在添加数据显示队列已满,但是获取数据又显示队列为空的情况
//解决的办法就是将数组的尾部和头部连接到一起实现一个环形队列即可解决上面的问题

环形队列(数组实现)

package mainimport ("errors""fmt""os"
)//环形队列实现时head指向队首第一个元素,tail指向队尾元素的下一个位置,(空一个位置作为保留)
//定义一个结构体管理环形队列
type circelQueue struct {maxSize intarray [5]inthead inttail int
}//定义一个入队列方法
func (q *circelQueue) Push(val int) error {//判断是否已满if q.IsFull(){return errors.New("队列已满")}q.array[q.tail] = valq.tail = (q.tail + 1) % q.maxSize //tail指向尾部的后一个位置return nil
}//定义一个出队列方法
func (q *circelQueue) Pop() (val int, err error) {//判断队列是否为空if q.IsEmpty(){return -1, errors.New("队列为空")}val = q.array[q.head]q.head = (q.head + 1) % q.maxSize //head指向下一个元素(下一个队首)return val, nil
}//定义一个方法判断环形队列是否已满
func (q *circelQueue) IsFull () bool {return (q.tail + 1) % q.maxSize == q.head
}//定义一个方法判断环形队列是否为空
func (q *circelQueue) IsEmpty() bool {return q.tail == q.head
}//获取环形队列的元素个数
func (q *circelQueue) Size() int {return (q.tail + q.maxSize - q.head) % q.maxSize
}//定义一个显示环形队列元素的方法
func (q *circelQueue) List(){//判断队列是否为空if q.Size() == 0 {fmt.Println("队列为空")}//定义一个辅助变量指向head, 临时headtempHead := q.headfor i := 0; i < q.Size(); i++ {fmt.Printf("arr[%d]=%d\t", tempHead, q.array[tempHead])tempHead = (tempHead + 1) % q.maxSize}fmt.Println()
}func main(){queue := &circelQueue{maxSize: 5,array:   [5]int{},head:    0,tail:    0,}var key stringvar val int//添加数据for {fmt.Println("1.add添加数据到队列")fmt.Println("2.get从队列获取数据")fmt.Println("3.show显示队列")fmt.Println("4.exit退出队列")fmt.Scanln(&key)switch key {case "add":fmt.Println("输入你要入队列的数据")fmt.Scanln(&val)err := queue.Push(val)if err != nil {fmt.Println(err)} else {fmt.Println("成功入队")}case "get":val, err := queue.Pop()if err != nil {fmt.Println(err)} else {fmt.Println("出队列的数为:", val)}case "show":queue.List()case "exit":os.Exit(0)}}
}
//总结:
//环形队列可以解决单向队列没有有效的利用数组有效空间的问题
//环形队列的实现也符合大部分应用场景

数据结构--队列(数组)的一种实现相关推荐

  1. 第七周--数据结构--队列数组

     /*    *第七周--数据结构--队列数组     *Copyright (c) 2015 烟台大学计算机与控制工程学院    *All right reserved.    *文件名称:li ...

  2. 数据结构-队列-数组队列

    自定义队列 文章目录 自定义队列 数组队列 简述: 数组环形队列 数组队列 简述: 队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图, 其中 maxSize 是该队列的最大 ...

  3. 数据结构之数组、链表、栈和队列

    1.数组 1.1:概念 数组是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据.这里我们要抽取出三个跟数组相关的关键词:线性表,连续内存空间,相同数据类型:数组具有连续的内存空 ...

  4. 基于java的数据结构学习——数组实现的队列和循环队列及性能对比

    队列 Queue 队列也是一种线性结构 相比数组,队列对应的操作是数组的子集 只能从一端(队尾)添加元素,只能从另一端(队首)取出元素 队列是一种先进先出的数据结构 队列的实现及复杂度分析 Queue ...

  5. java 数据结构_Java版-数据结构-队列(数组队列)

    前言 看过笔者前两篇介绍的 Java版数据结构 数组和 栈的盆友,都给予了笔者一致的好评,在这里笔者感谢大家的认可!!! 由于本章介绍的数据结构是 队列,在队列的实现上会基于前面写的 动态数组来实现, ...

  6. 有十五个数按由大到小顺序存放在一个数组中_数据结构基础 (代码效率优化, 线性表, 栈, 队列, 数组,字符串,树和二叉树,哈希表)...

    作者:张人大 代码效率优化 复杂度 -- 一个关于输入数据量n的函数 时间复杂度 -- 昂贵 与代码的结构设计有着紧密关系 一个顺序结构的代码,时间复杂度是O(1), 即任务与算例个数 n 无关 空间 ...

  7. 常见数据结构-栈-队列-数组-链表-哈希表

    数据结构   数据结构是计算机存储.组织数据的方式.是指相互之间存在一种或多种特定关系的数据元素的集合   通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率 持续更新,学一个记一个- 栈 ...

  8. 常见的数据结构:栈 队列 数组 链表 红黑树——List集合 _ HashSet集合、可变参数 collections集合 Map集合

    2021-06-07复习java 一.常见的数据结构 栈(先进后出) 队列 数组 链表 红黑树 二.List集合_介绍&常用方法 ArrayList集合 Linkedlist集合 三.Hash ...

  9. 数据结构实践——队列数组

    本文是针对数据结构基础系列网络课程(3):栈和队列的实践项目. [项目 - 队列数组] 创建10个队列,分别编号为0-9(处理为队列数组,编号即下标).输入若干个正整数,以数字0作为结束.设输入的值为 ...

最新文章

  1. Android中Messenger进程间通信
  2. 训练 GPT-3,为什么原有的深度学习框架吃不消?
  3. Spring Cloud 应用在 Kubernetes 上的最佳实践 — 高可用(混沌工程)
  4. python多级菜单查询简化版
  5. 不懂就问,Spring 是如何判定原型循环依赖和构造方法循环依赖的?
  6. iOS 15 通知的新功能
  7. python切片为列表增加元素_python – 使用切片语法来加入列表的一部分列表元素...
  8. 8代cpu能装linux 系统吗,Intel支持八九代酷睿的B365芯片组将登场亮相
  9. Python3爬虫之咪咕音乐
  10. BLEU——机器翻译评测
  11. win10 ping网络计算机,win10 ping命令:如何ping网速和ping各个参数命令解释
  12. Cassandra - 集群搭建 及 配置DC和rack
  13. ATOM基础教程一ATOM按键绑定(6)
  14. 上海海大计算机科学,上海海洋计算机科学拟录取名单平台
  15. 如何将heic转换成jpg呢?
  16. 【Linux】服务远程连接失败解决方法
  17. SD销售模式之MTS和MTO
  18. 单链表存储一元多项式[IMUT 数据结构实验]
  19. 《R语言数据分析》期末试题
  20. 强势出圈!当NFT头像袭来,你pick哪一款?

热门文章

  1. php面向对象封装mysql_php mysqli面向对象封装mysql数据库常用操作
  2. linux 当前活动用户,如何在Linux上自动记录所有用户的终端会话活动
  3. php 统计一周数据,如何获取本周、上周、本月、上个月数据的起止时间 PHP
  4. IT运维服务管理中知识
  5. 网络工程师技能图谱 | 网络技术的理论知识和操作技能
  6. 服务器机房有哪些重要系统
  7. python fileinput模块next_Python中的fileinput模块的简单实用示例
  8. 成功解决Module Not Found Error : No module named mglearn
  9. AI之Robot:带你玩转机器人DIY机器人——让你成为机器人的真正主人
  10. 学习Python3:20171031