当前位置:网站首页>队列与栈
队列与栈
2022-08-02 14:10:00 【WANGHAOXIN364】
前置知识:数组+模拟
为了保证学习效果,请保证已经掌握前置知识之后,再来学习本章节!
知识总览
- 队列是一种模拟现实生活中排队过程的线性数据结构,具有先入先出的特点
- 队列支持入队、出队、求队列长度、判空等操作,不支持遍历操作
- 队列的基础实现有两种,STL queue 和数组模拟队列,各有优缺点
q.size()
q.empty()
q.front() / q.back()
q.pop()
q.push(element)
STL queue
数组模拟:一个数组 + 两个指针
求大小
判队空
取队首 / 队尾
出队:将当前队首元素移除队列,其后面的元素成为新的队首
入队:将某元素放到当前队列末尾,成为新的队尾
队尾:排在队列末尾的元素
队首:排在队列最前端的元素
定义:模拟现实生活中的队列
注意:取队首和出队前一定要保证队列不空
实现
操作
基本概念
队列
问题引入
上面“拓尔思舞会-1”这个问题用普通数组模拟就可以,那么下面“拓尔思舞会-2”这个问题呢?数组模拟也很麻烦。
类似这种需要处理元素排队的过程,“队列”这种数据结构就派上了用场。
队列的原理
队列是一种操作受到限制的线性表,用于模拟类似生活中的排队类型的数据结构,它支持在一端插入元素,在另外一端删除元素。
模拟现实生活中的排队过程。若干对象排成一条线性的队伍,等待某种操作(结账、处理银行业务、看病打针等等)。只有队首才能进行某种操作。队首对象处理完后,排在队首后面的人成为新的队首,然后才可以进行某种操作。
因此,队列有下列几种概念:
(1)队首:队列中的第一个元素
(2)队尾:队列中的最后一个元素
(3)队列长度/大小:队列中的元素个数
(4)队列判空:判断队列是否为空
(5)取队首:取得队首元素的值,注意,队列为空时,取队首操作是非法的
(6)入队:向队列尾部添加一个元素
(7)出队:队首元素移出队列,注意,队列为空时,出队操作是非法的
转存失败重新上传取消
队列的操作
想一想生活中排队可能会出现哪些过程?
- 加入队列:有一个人也想去排队,就要加入进去,并且排到队列的尾部,也就是当前队列的最后一个人的后面。(插队?不允许的,非法操作!)
- 出队操作:队首元素离开队列
- 求队列大小:队列中元素的个数
- 判断队列为空:
- 获取队首元素
- 获取队尾元素
代码实现
速记:一个数组+两个指针,队首指针,队尾指针,指针永远只会向前移动
方法一、使用数组+变量
int q[1000]; // 定义一个最大历史容量是 1000 的队列
int head=0, tail=0; // 定义队列头 队列尾,初始值依个人习惯而设
int len = tail - head; // 获取队列的长度
if(head == tail) // 判断队列为空
int h = q[head]; // 取队首
q[tail++] = t; // 将 t 入队
head++; // 队首出队,前提是队列不为空
Copy
方法二、STL 队列 queue
queue<int> q; // 定义一个空队列
int len = q.size(); // 获取队列的长度
if(q.empty()) // 判断队列为空
int h = q.front(); // 取队首
int t = q.back(); // 取队尾
q.push(t); // 将 t 入队
q.pop(); // 队首出队,前提是队列不为空
...... // 更多 STL 队列的使用方法可自行百度
Copy
对比
属性和操作 | 手写队列 | STL队列 |
---|---|---|
头文件 | 无 | #include |
定义(重点) | int a[100], head = 0, tail=0; // 队列大小为100 | queue a; |
队列的大小(重点) | int size = tail - head; | int size = a.size(); |
判空 | head == tail // 表示队列为空 | a.empty() == true // 表示队列为空 |
取队首 | a[head] // 前置条件:队列不为空 head != tail | a.front() // 前置条件:队列不为空 !a.empty() |
入队 | a[tail++] = t; // 将 t 入队 | a.push(t); // 将 t 入队 |
出队 | head++; // 前置条件:队列不为空 | a.pop(); // 前置条件:队列不为空 !a.empty() |
清空队列 | head =tail=0; | a = queue (); // 或 将一个空队列复制给 a |
优点 | 运行速度快,使用灵活,可以遍历队列元素、修改队列元素 | 定义方便,不用关心队列的大小限制 |
缺点 | 书写稍微麻烦,入队次数有限 | 运行速度比手写队列慢一些,操作完全受限 |
模板题
知识回顾与重要考点
q.size()
q.empty()
q.front() / q.back()
q.pop()
q.push(element)
STL queue
数组模拟:一个数组 + 两个指针
求大小
判队空
取队首 / 队尾
出队:将当前队首元素移除队列,其后面的元素成为新的队首
入队:将某元素放到当前队列末尾,成为新的队尾
队尾:排在队列末尾的元素
队首:排在队列最前端的元素
定义:模拟现实生活中的队列
注意:取队首和出队前一定要保证队列不空
实现
操作
基本概念
队列
练习题
边栏推荐
猜你喜欢
7.Redis
Mapreduce环境详细搭建和案例实现
用U盘怎么重装Win7系统?如何使用u盘重装系统win7?
Win11系统找不到dll文件怎么修复
Use tencent cloud builds a personal blog
PHY6222蓝牙5.2支持MESH组网M0内核超低功耗
Detailed introduction to drawing complex surfaces using the plot_surface command
Win10系统设置application identity自动提示拒绝访问怎么办
二叉树遍历之后序遍历(非递归、递归)入门详解
Win11没有本地用户和组怎么解决
随机推荐
jest test, component test
【STM32学习1】基础知识与概念明晰
Win11声卡驱动如何更新?Win11声卡驱动更新方法
Introduction to in-order traversal (non-recursive, recursive) after binary tree traversal
What should I do if I install a solid-state drive in Win10 and still have obvious lags?
MATLAB绘图函数fplot详解
开心一下,9/28名场面合集
Fast advanced TypeScript
Mapreduce环境详细搭建和案例实现
C语言函数参数传递模式入门详解
Win10无法连接打印机怎么办?不能使用打印机的解决方法
flink+sklearn——使用jpmml实现flink上的机器学习模型部署
5.事务管理
Letter combination of LeetCode2 phone number
Article pygame drag the implementation of the method
Please make sure you have the correct access rights and the repository exists. Problem solved
单端K总线收发器DP9637兼容L9637
DP1332E内置c8051的mcu内核NFC刷卡芯片国产兼容NXP
推开机电的大门《电路》(一):电压,电流,参考方向
Mysql连接错误解决