1 什么是队列:
老规矩 , 先上一张数据结构的图(1):
图1
希望同学们对这张图加以深刻的理解, 对于以后数据结构会有很大的帮助的
图中说明了队列(FIFO)是和 栈(STACK) ,线性表(LIST)(链表,数组),同属于是线性结构,线性结构存储方式分为顺序存储方式和链式存储方式, 上一章的栈已经分别实现了,小伙伴可以看下源码自行体验下,带的有注释的
队列和栈一样 , 也是属于一种受限的线性表, 其特性为跟栈是相反的 , 为先进先出
其只能在其中一端进行插入,叫做队尾(rear), 另一端进行删除,叫做队头(front),在队列中入队n个元素话 , 队列中的元素如下(a1, a2...an),当前a1为队头,an为队尾, 因为先进先出的关系, 出队也只能从a1,a2...依次到an的方式出队,如下图2:
图2
继续用车来做个比喻吧 ,一个火车通过山洞(队列),从第一节(队头)车厢(数据)先进去,到山洞的另一头,同样也是第一节车厢先出去,依次才到后面的2...n节车厢
2 队列的实现:
因为是线性表, 同样是顺序的方式和链式两种实现
首先是顺序队列:
建立顺序队列,首先要为其静态(数组)或者动态申请(malloc)开辟一块空间,这块空间的大小取决于队列里数据的总大小,队尾(rear)指针始终指向队列的最后一个元素,每次入队操作rear+1, 队头始终指向队列第一次元素,每次出队操作front+1, 因为考虑到内存的合理利用,每次入队或者出队的长度超过队列的总长度的时候,就让它指向队列的第一个元素位置, 即 rear = (rear + 1) % max,front = (front + 1) % max,此时的队列就形成了一个可以循环利用的环形, 我们称之为循环队列。
在循环队列中,判断队列是否为空front == rear , 而是否为满也是front == read,于是乎聪明的先烈们想了个办法 , 放弃队列中的一个节点,用来判断是否队满, 即 (read + 1) % N == front ? 1 : 0。
理一下思路吧
1,队头始终指向出队的元素的位置
2,队尾始终指向入队的