上一篇我们学习了什么是顺序队列和基本实现方法,但是顺序队列自身存在一个很大的bug,就是当我们把一个元素入队时,队尾的指针会向前移动,当元素出队时,队头指针也会向前移动,这样就造成了元素都持续向一个方向进入和输出,虽然符合队列的基本特性,但是很容易造成数据溢出。
例如,我们在内存中开辟一块五个单位长度的数组作为队列的存储单元。
当我们入队、出队到最后一个空间时,明明前面还有四个空间可以使用,但是就是用不了,这就造成了内存空间的浪费,和“假溢出”,为了解决这个问题,我们可以使用循环队列的方法来解决。
循环队列:
当入队元素到达数组最后一个空间时,判断数组第一个空间是否有元素占据,若果有说明空间利用率满了,数组溢出;如果数组第一个空间并无数据,则将下一个元素存储到第一个空间,这样就形成了循环数组的队列结构。
代码:
#include<stdio.h>
#define MAXSIZE 10
int enQueue(int *a,int rear,int front,int data){
if((rear+1)%MAXSIZE==front){
printf("上溢\n");
}
rear=(rear+1)%MAXSIZE;
a[rear]=data;
}
void deQueue(int *a,int front,int rear){
if(front==rear){
printf("队空\n");
}
while(front!=rear){
front=(front+1)% MAXSIZE;
printf("出队元素:%d\n",a[front]);
}
}
int main() {
int a[100];
int front,rear;
//设置队头指针和队尾指针,当队列中没有元素时,队头和队尾指向同一块地址
front=rear=0;
//入队
rear=enQueue(a, rear,front, 1);
rear=enQueue(a, rear,front, 2);
rear=enQueue(a, rear,front, 3);
rear=enQueue(a, rear,front, 4);
//出队
deQueue(a, front, rear);
return 0;
}