一,概述

队列这个概念非常好理解。你可以把它想象成排队买票,先来的先买,后来的人只能站末尾,不允许插队。先进者先出,这就是典型的“队列”。

二,顺序队列和链式队列

队列和栈一样,也是一种抽象的数据结构,操作上具有“先进先出”的特性,队列只允许在"队首"进行删除操作,而在"队尾"进行插入操作。基于数组实现的顺序队列的C++代码如下:

// 用数组实现的队列
class ArrayQueue(){// 数组:items,数组大小:n
private:int n = 20;int head = 0;   // 队头下标int tail = 0;   // 队尾下标public:// 带参数的构造函数:申请一个大小为 capacity 的数组ArrayQueue(int capacity){// items = new int[capacity];vector<int> items(capacity);n = capacity;}// 入队bool enqueue(int item){if(tail == n) return False;items[tail] = item;++tail;return True;}// 时间复杂度为O(1)的入队操作bool enqueue2(int item){// tail == n,表示队列末尾没有空间了if(tail == n){// tail == n && head == 0,表示整个队列都占满了if(head == 0) return False;// 数据搬移for(i=head; i<tail; ++i){items[i-head] = items[i];}// 重新更新 head 和 tailtail = tail - head; // tail -= headhead = 0;   // 队首位置}items[tail] = item;++tail;return True;}// 出队bool dequeue(){// head == tail 表示队列为空if (head == tail) return null;int ret = items[tail];++head;return ret;}
}

入队时间复杂度为 O(1)。分析:大部分情况下入队操作时间复杂度为 O(1),只有在 tail 在末尾时( tail=n )才进行数据迁移,此时的入队操作时间复杂度为 O(n),根据均摊时间复杂度得到入队时间复杂度为 O(1)

三,循环队列

前面用数组实现队列,当 tail = n 时,会有数据搬移操作。循环队列首尾相连,用数组实现循环队列代码的关键在于判断队列满和空的条件。

  • 非循环队列:

    • 队满:tail = n
    • 队空:head = tail
  • 循环队列
    • 队满:(tail + 1) % n = head
    • 队空:head = tail

基于数组实现的循环队列的C++代码如下:

// 用数组实现的循环队列,关键在于创建队头和队尾下标
class CircularQueue(){private:int n = 12;int items[];// head表示队头下标,tail表示队尾下标int head = 0;int tail = 0;
public:CircularQueue(int capacity){// items = new int[capacty];vector<int> items(capacity);n = capacity;}// 入队函数bool enqueue(int item){// 队列满了if((tail+1)%n = head) return False;items[tail] = item;tail = (tail + 1) % n}// 出队函数int dequeue(){// // 如果head == tail 表示队列为空if(head == tail) return null;int ret = items[head];head = (head + 1) % n;return ret;}
}

四,阻塞队列和并发队列

  1. 阻塞队列就是入队、出队操作都可以阻塞,简单来说就是队列为空时,队首取数据会被阻塞,队列为满时,队尾插入数据会被阻塞,直到队列有空闲数据才允许在队尾插入数据。使用阻塞队列结构可以轻松实现“消费者-生产者模型”
  2. 并发队列就是队列的操作多线程安全。最简单直接的实现方式是直接在 enqueue()、dequeue() 方法上加锁,但是锁粒度大并发度会比较低,同一时刻仅允许一个存或者取操作。实际上,基于数组的循环队列,利用 CAS 原子操作,可以实现非常高效的并发队列。这也是循环队列比链式队列应用更加广泛的原因。

参考资料

《数据结构与算法之美》-队列

数据结构队列-先进先出相关推荐

  1. 常见数据结构-队列先进先出

    一,概述 队列这个概念非常好理解.你可以把它想象成排队买票,先来的先买,后来的人只能站末尾,不允许插队.先进者先出,这就是典型的"队列". 二,顺序队列和链式队列 队列和栈一样,也 ...

  2. 数据结构-队列-“先进先出”的数据结构

    1.队列是线性表的一种,在操作数据元素时,和栈一样,有自己的规则:使用队列存取数据元素时,数据元素只能从表的一端进入队列,另一端出队列 2.队列的顺序表示和实现 使用顺序存储结构表示队列时,首先申请足 ...

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

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

  4. java 数据队列_Java 数据结构 - 队列

    Java 数据结构 - 队列 我们今天要讲的数据结构是队列,比如 Java 线程池任务就是队列实现的. 1. 什么是队列 和栈一样,队列也是一种操作受限的线性结构.使用队列时,在一端插入元素,而在另一 ...

  5. 数据结构-队列和栈有什么区别

    数据结构-队列和栈有什么区别 1:队列和栈是两种不同的数据结构.它们有以下区别: (1)操作的名称不同.队列的插入称为入队,队列的删除称为出队.栈的插入称为进栈,栈的删除称为出栈. (2)可操作的方式 ...

  6. 数据结构——队列的C语言代码实现

    系列文章目录 数据结构--顺序表的C语言代码实现 数据结构--八种链表的C语言代码实现 数据结构--栈的C语言代码实现 数据结构--队列的C语言代码实现 数据结构--堆的C语言代码实现 文章目录 系列 ...

  7. 数据结构——队列 c++详解

    1.队列(Queue)与栈一样,是一种线性存储结构,它具有如下特点: (1)队列中的数据元素遵循"先进先出"(First In First Out)的原则,简称FIFO结构: (2 ...

  8. C++数据结构——队列

                                                      C++数据结构--队列 参考博客: 数据结构图文解析之:队列详解与C++模板实现 C++ stl队列 ...

  9. 大话数据结构 队列10:数组循环队列

    基础介绍 队列 先进先出,出列在队头,进列在队尾 数组可以做成循环队列. 循环队列的一个重要问题:判断队列是空是满? 空队列的判断比较简单:尾游标等于头游标 满队列的判断比较复杂:如果也是用尾游标等于 ...

最新文章

  1. 网关 0.0.0.0_久违的升级——全新米家智能多模网关
  2. DIP第十章习题解答
  3. 四. python的time和datetime 模块
  4. mongodb 分组聚合_MongoDB按键值对进行聚合/分组
  5. HDU4302(map的用法)
  6. 第三方免费加固横向对比
  7. C++ wstring 与 string 之间的相互转换.
  8. qmake生成vs2013工程文件
  9. python量化数据处理小细节2
  10. 高德地图文本标注html,设置点标注的文本标签
  11. 计算机台账管理工作总结,台账工作总结(共6篇汇总).doc.docx
  12. error LNK2019: unresolve d external symbol _DriverEntry@8 referenced in function _GsDriverEntry@8
  13. python:只想在opencv中显示红色通道?
  14. k3 设置 虚拟服务器,k3服务器一键配置工具
  15. 求生之路怎么显示服务器ip,怎么在求生之路后台查看本机局域网IP
  16. steam同乐无法连接远程计算机,Steam远程同乐功能怎么使用_Steam远程同乐功能使用方法_3DM单机...
  17. SQLyog 64位破解版 v12.09
  18. 如何查看winmail.dat中的文件
  19. 零基础学Java_Map接口、HashMap 类、HashTable 类、TreeMap 类(整理总结)
  20. 程序员是呆在一个公司等涨工资好,还是跳槽涨工资好?

热门文章

  1. c语言微课ppt嵌套函数,C语言课程中循环嵌套的微课教学设计与思考.pdf
  2. 《Spring Cloud 微服务架构进阶》读书笔记
  3. decode和encode 区别
  4. Java Web应用开发——作业五
  5. 5g有线工业级路由器 有线无线自由切换
  6. Microsoft SQL Server 2000 简体中文企业版+SP4升级补丁
  7. 好不容易弄好了google app engine ,想不到不能用了。只好去安装sina app engine
  8. Kylin(二)安装使用
  9. android studio最新版下载,Android Studio mac版-Android Studio for mac下载 V4.2.1-PC6苹果网
  10. signature=db6ed02c38e9be97bad334d194c3133d,来用百度密语吧!!!