1)循环队列使用的数学原理:周期性。我们将:队列的长度 ⇔ 循环队列的周期,头位置% 周期 或 尾位置%周期 得倒该周期内的位置。“模运算将无限的整数域映射到有限的整数集合: {0,1,2,......,b-1}上。运用取余运算将队尾指针从队头到队尾再到队头这样循环往复的变化。
2) 空队条件:q->front == q->rear =
3)满队条件:队列还剩余最后一个存储空间⇔队尾指针的下一个位置是队头。我们在初始队 列的时候,我们将front指标和rear指标指向同一个位置,同时我们也是通过这两个指标是否 指向同一个位置来判断队列是否为空的,如果将剩余的队空不保留填入元素,那么front 和 rear相等,这是空队的判断条件,显然是不能放在满队的条件里,所以我们只能改牺牲一个 存储单元。 队满条件:q->rear+1 == q->front;
4)在新元素入队之前我们要检查队尾指标的后一个位置是否是队头,如果是则表示队满。 return false;表示插入失败
//循环链表中循环效果的实现,即首尾移动的周期性的体现:(q->rear + 1) % (q->size)
#include <stdio.h>
#include <stdlib.h>
typedef struct Queue
{
int size;
int front;
int rear;
int *Q;
}Queue;
void create(Queue *q,int size)
{
q->size = size;
q->front = q->rear = 0;//⚠️instead of: q->front = q->rear = -1;
q->Q = (int*)malloc(sizeof(int)*q->size);
}
void enqueue(Queue *q,int x)
{
if((q->rear + 1) % (q->size) == q->front)
printf("Queue is Full\n");
else
{
q->rear = (q->rear +1) % (q->size);
q->Q[q->rear] = x;
}
}
int dequeue(Queue *q)
{
int dequeue_data;
if(q->front == q->rear)
printf("Qieie is Empty\n");
else
{
q->front = (q->front + 1) % (q->size);
dequeue_data = q->Q[q->front];
return dequeue_data;
}
return -1;
}
void Display(Queue q)
{
int q_index = q.front + 1;
do
{
printf("%d ",q.Q[q_index]);
q_index = (q_index + 1) % q.size;
} while (q_index != (q.rear + 1) % q.size);
printf("\n");
}
int main()
{
Queue q1;
create(&q1,5);
enqueue(&q1,10);
enqueue(&q1,11);
enqueue(&q1,12);
enqueue(&q1,13);
enqueue(&q1,14);
Display(q1);
};