队列
队列就是一种对于存取方式限制的组织方式。换一种方式描述的话就是,队列既可以采用链表来表示,也可以采用数组(线性表)来表示,我们限制的是对于存放数据的存取方式。队列先入先出。我们对数据的组织也是以这种方式(打饭排队)进行的。当然数据存储方式还是有两种,一种是顺序存储,一种是链式存储。
- 顺序存储:
- 链式存储:
可为什么链式存储的方式的队列首尾指针与链表头尾刚好相反?
=>其实链表存在头插入,尾插入。一般是头插入,即它的表头是用来插入数据的,表尾处的数据才是最先插入的,先入先出原则,所以表尾出的数据最先出列,也就是队列的头。
队列:只允许在一端进行插入操作,而另一端进行删除操作的线性表。
空队列:不含任何数据元素的队列。判断队列为空:head==tail
允许插入(也称入队、进队)的一端称为队尾,允许删除(也称出队)的一端称为队头。
普通队列(顺序队列):
循环队列:
可以消除假溢出:当尾指针tail和头指针head到达存储空间最大值QueueSize时,让尾指针自动转化为存储空间最小值0。
当没有插入数据时,head==tail
插入数据后(12 23 34 45 56;注意head和tail的位置变化)
删除数据后注意尾指针的下标变化:
以删前3个元素,并增加77 88 99 为例
判断队列是否满了
用一个空格来浪费掉一个位置表示队列已满:
队列满了后继续插入数据的话,之前的数据会被覆盖掉。
取队列的数据时,如果检测到队列已满,需要一次性取出队列中的数据,直接按照尾指针指向的位置开始取数据,直到循环取到tail-1位置时停止。最终取出的数据的个数是队列的长度。
CLZ的银行普通队列
CLZ 银行只有两个接待窗口,VIP 窗口和普通窗口,VIP 用户进入 VIP 窗口排队,剩下的进入普通窗口排队。现有 M次操作,操作有四种类型,如下&