循环队列得实现:
1.
在入队和出队时,我们通过
q->rear = (q->rear +1)%MAX_LENTH 来实现循环入队
q->front = (q->front +1)%MAX_LENTH 来实现循环出队
2.
箭头方向为队列的方向
当 front 的下标在 rear 之前时 我们通过
(q->front < q->rear)
&&
(q->rear + q->front +1)%MAX_LENTH == 0
来判断队列是否为满
![](https://img-blog.csdnimg.cn/2022010614182543449.png)
3.
箭头方向为队列方向(红色为起点)
当 rear 的下标在 front 之前时 即 rear 从线性表的最后一个元素指向第一个元素时
我们通过
q->front > q->rear
&&
(q->front - q->rear + 1)%MAX_LENTH == 0
来判断队列是否为满
![](https://img-blog.csdnimg.cn/2022010614182515430.png)
#include <stdio.h>
#include <stdlib.h>
#define MAX_LENTH 10
#define BOOL int
typedef struct queue{
int *base;
int rear;
int front;
}Queue;
void Init(Queue *q){
q->base = (int *)malloc(sizeof(int)*MAX_LENTH);
q->front = 0;
q->rear = 0;
}
void Insert(int data, Queue *q){
BOOL flag;
if((q->front < q->rear) && (q->rear + q->front +1)%MAX_LENTH == 0) //当rear在 front 之后时判断队列是否为满
{
flag = 1;
}/* if */
else if (q->front > q->rear && (q->front - q->rear + 1)%MAX_LENTH == 0){ //当 front 在 rear 之前时判断队列是否为满
flag = 1;
}/* else if */
else{
flag = 0;
}/* else */
if(flag){
printf("栈已满 \n");
}else{
q->base[q->rear ++] = data;
}
}/* Insert() */
int Quit(Queue *q){
if(q->rear == q->front){
printf("空队列");
return ;
}/* if */
else{
return q->base[q->front++];
}/* els e*/
}/* Quit() */
int The
int main(){
Queue q;
int i;
Init(&q);
for(i=0; i<11 ;i++){
printf("insert %d \n",i);
Insert(i,&q);
}
for(i=0;i<11;i++){
printf("%d\n",Quit(&q));
}
return 0;
}