何为队列?头出尾进,意思就是指在队列数据结构中进行元素的插入和删除操作。
"头出"表示将新元素插入到队列的头部。也就是说,新元素会成为队列中的第一个元素,原有的元素依次向后移动。
"尾进"表示将新元素加入到队列的尾部。也就是说,新元素会成为队列中的最后一个元素。
由图所示,当出队时,又有原来的空间,但是只能尾进因此不能用新空出的空间,所以空间利用率低。
所以循环队列为节省空间应运而生,以下是一个简单的列子,深入前出的分析一下具体步骤吧❛‿˂̵✧。
我们将入队0,1,2,3,这4个数字,很多人就会问了,存储四个数字为什么要申请五个空间呢int[5],那是因为我们需要多一个空间来进行判断尾巴和头是否相遇,毕竟小猫尾巴永远不会被自己咬到吧o(=•ェ•=) ps:【判断条件(q->rear+1) % 5 == q->front】
typedef struct a {
int data[5];
int rear,front;
}dui;
void insert(dui *q, int in) {
if ((q->rear+1) % 5 == q->front) printf("xxx");
else
{
q->rear = (q->rear+1) % 5;
q->data[q->rear] = in; }
}
刚刚开始先初始化,我们习惯将先同时将队头Rear和队尾Front指向数组最高端位置。
0 | 1 | 2 | 3 | 4 |
Rear Front |
插入第一个元素:
首先,计算(q->rear+1)%5,结果为(4+1)%5=0
然后,将该结果赋值给rear,即q->rear=0
最终,第一个元素将被插入到位置0。
1 | 2 | 3 | 4 | 0 |
0 | ||||
Front | rear |
插入第二个元素:
此时,rear的值已经更新为上一次插入后的位置,即rear=0.
再次计算(q->rear+1)%5,结果为(0+1)%5=1.
将该结果赋值给rear,即q->rear=1.
第二个元素将被插入到位置1。
2 | 3 | 4 | 0 | 1 |
0 | 1 | |||
Front | rear |
插入第三个元素:
当前rear的值是上一次插入后的位置,即rear=1.
计算(q->rear+1)%5,结果为(1+1)%5=2.
赋值给rear,即q->rear=2
第三个元素将被插入到位置2。
3 | 4 | 0 | 1 | 2 |
0 | 1 | 2 | ||
Front | rear |
插入第四个元素:
4 | 0 | 1 | 2 | 3 |
0 | 1 | 2 | 3 | |
Front | rear |
能插入第五个吗??
哈哈当然不能ᕕ( ᐛ )ᕗ咬到尾巴了,尾巴rear再次移到下一位int[4]时,碰到头了front。
4 | 0 | 1 | 2 | 3 | 4 |
0 | 1 | 2 | 3 | ||
Rear Front |
此时结束尾插操作,大功告成。