软考:数据结构基础——循环队列C语言实现
循环队列得实现:
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
来判断队列是否为满
3.
箭头方向为队列方向(红色为起点)
当 rear 的下标在 front 之前时 即 rear 从线性表的最后一个元素指向第一个元素时
我们通过
q->front > q->rear
&&
(q->front - q->rear + 1)%MAX_LENTH == 0
来判断队列是否为满
#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; }