数据结构系列——先进先出队列queue
本期主题:
先进先出队列实现
目录
- 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相关推荐
- [ 数据结构-C实现] 队列 Queue
目录 1.队列 1.1队列的概念及结构 2.队列的实现 2.1接口 3.接口的实现 3.1初始化 3.2销毁 分析: 3.3入队 分析: 3.4出队 分析: 3.5判断是否为空 3.6队列的大小 3. ...
- Airport Simulation (数据结构与算法 – 队列 / Queue 的应用)
Airport Simulation 是数据结构与算法教材中用于演示Queue的一个小程序(大多数教师似乎会跳过这个练习).主程序会通过输入总的运行时间.队列里可以等待的最多飞机数量,平均每个时间单元 ...
- 大话数据结构系列之链队列结构(十二)
文章目录 定义 链队列 VS 循环队列 链队列代码实现( C .Java ) 定义 队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而异,我们把它简称为链队列 链队列 VS 循环队列 ...
- oracle 删除 queue,C++ stl队列Queue用法介绍:删除,插入等操作代码举例
c++队列queue模板类的定义在头文件中,queue 模板类需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque 类型. C++队列Queue是一种容 ...
- 35 线程优先级队列(queue)
Python的queue模块中提供了同步的.线程安全的队列类,包括先进先出队列Queue.后进先出队列LifoQueue和优先级队列PriorityQueue.这些队列都是先了锁原语,可以直接使用来实 ...
- Python 线程队列 Queue – FIFO - Python零基础入门教程
目录 一.Python 线程队列分类 二.Python 线程先进先出队列 Queue 简介 三.Python 线程先进先出队列 Queue 常用函数 四.Python 线程先进先出队列 Queue 使 ...
- PYTHON——多线程:队列Queue数据结构
1.队列模块简介 队列是一种数据结构,用于存放数据,类似列表.它是先进先出模式(FIFO模式),类似管道一般: 单线程不需要用到队列Queue,它主要用在多线程之间的,Queue称为多线程利器. 列表 ...
- abcde依次进入一个队列_数据结构与算法 | 一文掌握队列Queue(真题讲解)
本系列内容专为课程面向笔/面试的<数据结构与算法>总结性精讲开设,以图文并茂的方式讲解数据结构,让大家打牢基础,促进对课程内容的掌握,最后做到题解大神,大厂offer拿到手软! 目录:一文 ...
- 【数据结构入门】队列(Queue)详解(定义、销毁、入队、出队等)| 图解数据结构,超详细哦~
文章目录 (1)前言 1)队列的概念 2)队列的结构 (2)队列的实现(链式结构) 1)队列的定义 2)队列的初始化 3)队列的销毁 4)入队(尾插) 5)出队(头删) 6)获取队列元素个数 7)获取 ...
最新文章
- Java虚拟机性能监控与调优实战
- 三维重建 KinectFusion
- Nginx配置免费SSL证书
- 电视光端机常见故障问题介绍
- gitbook使用实录
- 20200806:Java拓扑排序实现力扣210课程表Ⅱ
- Linux 平台下 Tomcat 的安装与优化
- java xppreader_Java對象轉換XML文件:XStream+XPP | 學步園
- ReentrantReadWriteLock源码解读
- 爬取奇迹秀工具箱里面的文本和软件网盘链接
- C++ 虚函数实现:虚函数表 虚表指针
- 一看就会的ios配置证书及描述文件
- STM32 热敏电阻测量温度
- keil uvisoin软件打开他人的工程文件上面出现黄色感叹号警告标志,后续编译不能生成.o文件而报错
- 自签名多级证书亲测可用
- 密码学之数字签名是什么
- 练习2-4:重新编写函数squeeze(s1,s2),将字符串s1中的任何字符与字符串时s2中的字符匹配的字符都删除
- Alpha 事后诸葛亮
- python编程实现贝叶斯分类
- 编译FCL时报错:/usr/local/lib/libccd.a: 无法添加符号: 错误的值