队列是一种可以实现一个先进先出的存储结构
什么是队列?
队列(Queue)也是一种运算受限的线性表。它只允许在表的一端进行插入,而在另一端进行删除。允许删除的一端称为队头(front),允许插入的一端称为队尾(rear)。
栈,只能在栈顶进行操作,队列是一端进入,一端输出
队列也是头部和尾部
rear翻译的意思是:
队列添加数据只能在rear尾部添加,在font端进行删除
静态队列都是循环队列
1、静态队列为啥必须是循环队列
我们来分析下:
采用普通数组来实现队列会出现的问题:
pFont指向队列的第一个元素
pRear执行对应的最后的一个元素的下一个节点,该节点不存储有效的数据,就像链表的phead一样。例如上面存储 1 2 3 4 5 ,prear就在存储5节点的下一个节点,有效的数据是存储在 1 2 3 4 5 这五个节点中的。这样设计是便于队列的操作
删除元素的时候pFont向上移动,删除元素是在头部删除
添加元素的时候pRea向上移动
如果使用普通的数组来实现队列,当删除元素pFont向上移动的时候,例如删除-1,这个时候pFont向上移动到-2存储的位置,这个时候采用普通数组的方式存储-1的这个内存空间就被释放了,不能再被使用了,这种叫做队列的假溢出
添加元素和删除元素Frear和pFont都只能向上移动
当pFont向上移动和pRear重合的时候,说明队列为null
上面这种情况,rear已经到了数组的最尾的节点,rear不能再向上移动了,记住rear节点不存在有效的数据值,相当于链表中的pHead节点,现在队列中只存储了c这个值,现在我们要存储中这个值,假设rear是循环链表,此时将rear移动到链表的第一个元素节点的位置
在h的位置就能够存储中字了
现在队列中就有两个值,一个c,一个是中
当我们要删除一个元素的时候,pFont向上移动变成
此时队列中只有一个中字
当此时在添加一个国字,pRear向上移动
此时,我们删除中字,这个时候pFont已经达到了最后,不能再向上移动了,要不然就溢出了,让pFont指向第一个元素
所以数组现实队列必须是循环队列。