本期主题:
先进先出队列实现


目录

  • 1.队列定义
  • 2.实现一个简单的队列以及分析
    • 1.代码实现分析
    • 2.code
    • 3.优缺点分析
  • 3.循环队列实现
    • 1.循环队列原理
    • 2.循环队列实现分析
    • 3.code

1.队列定义

队列是什么?定义:

  • 一个先进先出的数据结构
  • 插入操作称为入队(enqueue),入队始终在队尾添加元素
  • 删除操作称为出队(dequeue),出队操作始终从队头开始

2.实现一个简单的队列以及分析

1.代码实现分析

先分析该怎么实现队列,其实前面描述了就三个特点,一一分析:

插入操作在队尾实现,使用vector的push_back接口,直接在动态数组尾部实现添加;
删除操作从队头开始,这个需要有一个位置指针,告诉我们现在头部在哪里,然后每次出一个,头部位置就++;

2.code

按如下分析完之后,我们可以实现代码了:

class MyQueue {private:// store elementsvector<int> data;// a pointer to indicate the start positionint p_start;
public:MyQueue() { p_start = 0; }/** Insert an element into the queue. Return true if the operation is successful. */bool enQueue(int x) {data.push_back(x);return true;}/** Delete an element from the queue. Return true if the operation is successful. */bool deQueue() {if (isEmpty()) {return false;}p_start++;return true;};/** Get the front item from the queue. */int Front() {return data[p_start];};/** Checks whether the queue is empty or not. */bool isEmpty()  {return (p_start >= data.size());}
};

完整代码:

int main() {MyQueue q;q.enQueue(5);q.enQueue(3);if (!q.isEmpty()) {cout << q.Front() << endl;}q.deQueue();if (!q.isEmpty()) {cout << q.Front() << endl;}q.deQueue();if (!q.isEmpty()) {cout << q.Front() << endl;}
}

输出结果:

3.优缺点分析

优点:

代码简单,非常好实现

缺点:

存在假满的情况,效率低,有空间浪费情况存在

我们看一个例子:
假设我们定义一个size为5的queue,第一步我们先dequeue,然后再enqueue,会发现此时这个queue已经满了,但实际上有效的数据只有4个

3.循环队列实现

1.循环队列原理

针对上面提到的效率低、空间利用有限的问题,更好的方案是使用一个循环队列,即头和尾能够连在一起,如下图所示:

2.循环队列实现分析

循环队列实现需要分析以下几点:

  • 首先,肯定是需要两个位置变量,来表明当前的头和尾
  • 判断队列空条件分析:空的时候,头和尾都应该指向非当前数据区域,当头=尾时,应该是只剩了最后一个元素
  • 判断队列满条件分析:满的时候,尾+1=头,但是有循环回来的问题,所以应该是 (尾+1)%(整个size)=头

3.code

class MyCircularQueue {public:vector<int> data;int head_pos = -1;int rear_pos = -1;int size = 0;MyCircularQueue(int k) {data.resize(k);size = k;}bool enQueue(int value) {if (isFull()) {return false;}if (isEmpty()) {head_pos = 0;}rear_pos++;rear_pos = rear_pos % size;data[rear_pos] = value;return true;}bool deQueue() {if (isEmpty()) {return false;}if (head_pos == rear_pos) {head_pos = -1;rear_pos = -1;return true;}head_pos++;head_pos = head_pos % size;return true;}int Front() {if (isEmpty()) {return -1;} else {return data[head_pos];}}int Rear() {if (isEmpty()) {return -1;} else {return data[rear_pos];}}bool isEmpty() {return (head_pos == -1);}bool isFull() {return ((rear_pos + 1) % size == head_pos);}
};

数据结构系列——先进先出队列queue相关推荐

  1. [ 数据结构-C实现] 队列 Queue

    目录 1.队列 1.1队列的概念及结构 2.队列的实现 2.1接口 3.接口的实现 3.1初始化 3.2销毁 分析: 3.3入队 分析: 3.4出队 分析: 3.5判断是否为空 3.6队列的大小 3. ...

  2. Airport Simulation (数据结构与算法 – 队列 / Queue 的应用)

    Airport Simulation 是数据结构与算法教材中用于演示Queue的一个小程序(大多数教师似乎会跳过这个练习).主程序会通过输入总的运行时间.队列里可以等待的最多飞机数量,平均每个时间单元 ...

  3. 大话数据结构系列之链队列结构(十二)

    文章目录 定义 链队列 VS 循环队列 链队列代码实现( C .Java ) 定义 队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而异,我们把它简称为链队列 链队列 VS 循环队列 ...

  4. oracle 删除 queue,C++ stl队列Queue用法介绍:删除,插入等操作代码举例

    c++队列queue模板类的定义在头文件中,queue 模板类需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque 类型. C++队列Queue是一种容 ...

  5. 35 线程优先级队列(queue)

    Python的queue模块中提供了同步的.线程安全的队列类,包括先进先出队列Queue.后进先出队列LifoQueue和优先级队列PriorityQueue.这些队列都是先了锁原语,可以直接使用来实 ...

  6. Python 线程队列 Queue – FIFO - Python零基础入门教程

    目录 一.Python 线程队列分类 二.Python 线程先进先出队列 Queue 简介 三.Python 线程先进先出队列 Queue 常用函数 四.Python 线程先进先出队列 Queue 使 ...

  7. PYTHON——多线程:队列Queue数据结构

    1.队列模块简介 队列是一种数据结构,用于存放数据,类似列表.它是先进先出模式(FIFO模式),类似管道一般: 单线程不需要用到队列Queue,它主要用在多线程之间的,Queue称为多线程利器. 列表 ...

  8. abcde依次进入一个队列_数据结构与算法 | 一文掌握队列Queue(真题讲解)

    本系列内容专为课程面向笔/面试的<数据结构与算法>总结性精讲开设,以图文并茂的方式讲解数据结构,让大家打牢基础,促进对课程内容的掌握,最后做到题解大神,大厂offer拿到手软! 目录:一文 ...

  9. 【数据结构入门】队列(Queue)详解(定义、销毁、入队、出队等)| 图解数据结构,超详细哦~

    文章目录 (1)前言 1)队列的概念 2)队列的结构 (2)队列的实现(链式结构) 1)队列的定义 2)队列的初始化 3)队列的销毁 4)入队(尾插) 5)出队(头删) 6)获取队列元素个数 7)获取 ...

最新文章

  1. Java虚拟机性能监控与调优实战
  2. 三维重建 KinectFusion
  3. Nginx配置免费SSL证书
  4. 电视光端机常见故障问题介绍
  5. gitbook使用实录
  6. 20200806:Java拓扑排序实现力扣210课程表Ⅱ
  7. Linux 平台下 Tomcat 的安装与优化
  8. java xppreader_Java對象轉換XML文件:XStream+XPP | 學步園
  9. ReentrantReadWriteLock源码解读
  10. 爬取奇迹秀工具箱里面的文本和软件网盘链接
  11. C++ 虚函数实现:虚函数表 虚表指针
  12. 一看就会的ios配置证书及描述文件
  13. STM32 热敏电阻测量温度
  14. keil uvisoin软件打开他人的工程文件上面出现黄色感叹号警告标志,后续编译不能生成.o文件而报错
  15. 自签名多级证书亲测可用
  16. 密码学之数字签名是什么
  17. 练习2-4:重新编写函数squeeze(s1,s2),将字符串s1中的任何字符与字符串时s2中的字符匹配的字符都删除
  18. Alpha 事后诸葛亮
  19. python编程实现贝叶斯分类
  20. 编译FCL时报错:/usr/local/lib/libccd.a: 无法添加符号: 错误的值

热门文章

  1. Java 计算矩形周长和面积
  2. IT常用软件下载与安装
  3. OA办公自动化系统的设计与实现
  4. 2022年软件水平考试(高级)仿真试题及答案
  5. LeetCode题库第67题二进制求和
  6. java 简单的word文件下载
  7. 1099: C语言程序设计教程(第三版)课后习题10.7
  8. T45. Mid.跳跃游戏 II
  9. 自动驾驶八大主流应用场景——2021年度盘点
  10. Qt实现图片翻转(开源)