学习资源:拉勾教育
队列是什么
- 队列是一种特殊的线性表,与线性表的不同支持体现在对数据的增加和删除的操作上,队列的特点是
先进先出
- 先进——队列的数据新增操作只能在末端进行,不允许在队列的中间某个结点后新增数据
- 先出——队列的数据删除操作只能在始端进行,不允许在队列的中间某个结点后删除数据
- 队列存在两种存储方式,即顺序队列和链式队列
顺序队列
——依赖数组来实现,其中的数据存在内存中也是顺序存储链式队列
——依赖链表来实现,其中的数据依赖每个结点的指针互联,在内存中并不是顺序存储链式队列,实际上就是只能尾进头出的线性表的单链表
队列对于数据的增删查处理
- 队列从队头(front)删除元素,从队尾(rear)插入元素
- 对于一个顺序队列的数组,设置一个
front指针
来指向队头,并设置另一个rear指针
指向队尾,不断进行插入删除操作时,头尾两个指针都会不断向后移动
front指针删除数据的操作引发了时间复杂度过高的问题,如何解决?可以通过移动指针的方式来删除数据,但是这样又会造成”假溢出“,两个简单粗暴的解决”假溢出“方法:
- 不惜消耗O(n)的时间复杂度去移动数据
- 开发足够大的内存空间确保数组不会越界
循环队列的数据操作
- 数组越界问题可以通过队列的一个特殊变种来解决,叫做
循环队列
- 循环队列进行新增数据元素操作时,首先判断队列是否为满
- 如果不满,则可以将新元素赋值给队尾,然后让rear指针向后移动一个位置
- 如果已经排到队列最后的位置,则rear指针重新指向头部
- 循环队列进行删除操作时,即出队列操作,需要判断队列是否为空,然后将队头元素赋值给返回值,front指针指向后移一个位置,如果排到队列最后的位置,就把front指针重新指向到头部
- 判断循环队列到底是空是满:设置一个标志变量flag
链式队列的数据操作
- 链式队列是一个单