1.循环队列是顺序结构
2.循环队列的总长度是MAXSIZE - 1
3.指针实现
注:循环队列的总长度不是MAXSIZE,是MAXSIZE - 1!!! 计算式:指针移动:(front + 1)%MAXSIZE
总长度:(rear - front + MAXSIZE)% MAXSIZE
#include#include //最大长度 #define MAXSIZE 3 //循环队列 typedef struct SqQueue { int* data; int front; int rear; }SqQueue; //初始化队列 SqQueue* InitQueue() { SqQueue* queue = (SqQueue*)malloc(sizeof(SqQueue)); queue->data = (int*)malloc(MAXSIZE * sizeof(int)); queue->front = queue->rear = 0; return queue; } //清空队列 void ClearQueue(SqQueue* queue) { if(queue != NULL) { queue->front = queue->rear = 0; printf("队列已经清空!n"); } else { printf("未初始化队列!n"); } } //销毁队列 void DestroyQueue(SqQueue* queue) { if(queue != NULL) { free(queue); queue = NULL; printf("队列已经销毁!n"); } else { printf("未初始化队列!n"); } } //入队 void InsertQueue(SqQueue* queue, int data) { if((queue->rear + 1) % MAXSIZE != queue->front) { queue->data[queue->rear] = data; queue->rear = (queue->rear + 1) % MAXSIZE; } else { printf("队列已满!n"); } } //出队 void PopQueue(SqQueue* queue) { if(queue->front != queue->rear) { queue->front = (queue->front + 1) % MAXSIZE; } else { printf("队列已空!n"); } } //队长 void QueueLength(SqQueue* queue) { printf("%dn", (queue->rear - queue->front + MAXSIZE) % MAXSIZE); } //队列遍历 void ThroughQueue(SqQueue* queue) { int begin = queue->front; int end = queue->rear < queue->front ? queue->rear + MAXSIZE : queue->rear; int index; for (begin;begin < end;begin++) { index = begin >= MAXSIZE ? begin - MAXSIZE : begin; printf("%dt", queue->data[index]); } printf("n"); } int main() { int judge, data; SqQueue* queue = NULL; while(1) { fflush(stdin); printf("1.初始化队列n2.清空队列n3.销毁队列n4.入队n5.出队n6.遍历n7.队长n"); scanf("%d", &judge); switch(judge) { case 1://初始化队列 queue = InitQueue(); break; case 2://清空队列 ClearQueue(queue); break; case 3://销毁队列 DestroyQueue(queue); break; case 4://入队 printf("请输入一个数据:"); scanf("%d", &data); InsertQueue(queue, data); break; case 5://出队 PopQueue(queue); break; case 6://遍历 ThroughQueue(queue); break; case 7://队长 QueueLength(queue); break; default: printf("请输入正确的数字!"); } } return 0; }



