1.定义:
循环队列(Circular Queue),也被称为环形队列或循环缓冲区,是一种队列数据结构,它具有固定大小的缓冲区,允许在队列的前面和后面插入和删除元素。与普通队列不同,循环队列可以避免浪费存储空间的问题,因为当队列的尾部元素达到缓冲区的末尾时,它可以"循环"到缓冲区的开头。
2.主要特点:
-
固定大小:循环队列有一个预定义的大小,一旦分配了这个大小,就不能动态调整。
-
循环性质:当队列的尾部指针(rear)到达缓冲区的末尾时,下一个元素将被插入到缓冲区的开头。这种循环性质使得队列的数据结构紧凑,不会浪费存储空间。
-
前后指针:循环队列通常有两个指针,一个指向队列的头部(front),另一个指向队列的尾部(rear)。
-
满队列判定:为了区分队列是空的还是满的,可以采用不同的方法。一种常见的方法是在插入元素时检查(rear+1)%n == front,其中n是队列的大小。如果这个条件成立,队列被认为是满的。
-
避免数据搬移:与普通队列相比,循环队列的插入和删除操作更加高效,因为元素不需要搬移。普通队列在出队操作后,需要将后续元素向前搬移一个位置,而循环队列不需要这样做。
-
应用:循环队列常常用于需要固定大小缓冲区的场景。
3.示例图:

4.主要操作
-
入队:在队尾插入元素,并将rear指针向后移动。
-
出队:从队头删除元素,并将front指针向后移动。
-
判满:检查队列是否已满。
-
判空:检查队列是否为空。
- 查看队首元素:返回 front 指针所指向的元素。
- 查看队列长度:返回 rear 指针与 front 指针之间的元素个数。
5.循环队列的实现
5.1结构体
#define MAXSIZE 100
typedef int DataType;
typedef struct
{
DataType data[MAXSIZE];
int front;
int rear;
}CirclesQueue;
5.2初始化
接收一个指向循环队列的指针,函数返回0,表示初始化成功。
/*循环队列初始化*/
int init(CirclesQueue *Q);
/*循环队列初始化*/
int init(CirclesQueue *Q)
{
Q->front = Q->rear = 0;
return 0;
}
运行图:

5.3入队:需要判断队列是否满了,若不满,则可入队
/*入队*/
int enqueue(CirclesQueue *Q, DataType x);
/*入队*/
int enqueue(CirclesQueue *Q, DataType x)
{
if(isfull(Q))
{
printf("队列已满!100001\n");
return 100001;
}
Q->rear = (Q->rear+1) % MAXSIZE;
Q->data
最低0.47元/天 解锁文章
&spm=1001.2101.3001.5002&articleId=134087346&d=1&t=3&u=1c02f243e32a4e8f9d3c0ef73d868dc6)
1万+

被折叠的 条评论
为什么被折叠?



