一、代码概述
本代码实现了一个基于数组的循环队列(Circular Queue)的基本操作,包括初始化、销毁、判断队列是否为空、判断队列是否已满、入队(Push)、出队(Pull)以及显示队列内容。循环队列是一种特殊的线性数据结构,其操作表现基于FIFO(先进先出)原则,并且其首尾相连,形成一个逻辑上的环状。
二、代码结构
-
结构体定义
结构体CirQueue
定义了一个循环队列,包含一个整数数组data
用于存储数据,以及两个整型变量front
和rear
分别表示队首和队尾的索引位置。 -
函数定义
InitCirQueue
:初始化循环队列,分配内存并设置队首队尾索引为0。DestroyCirQueue
:销毁循环队列,释放内存。EmptyCirQueue
:判断循环队列是否为空。FullCirQueue
:判断循环队列是否已满。PushCirQueue
:将元素入队,如果队列已满则返回false。PullCirQueue
:将元素出队,如果队列为空则返回false。DispCirQueue
:显示循环队列的当前内容。
-
主函数
在main
函数中,首先初始化一个循环队列C
,然后进行了一系列的操作来测试循环队列的功能,包括入队、出队和显示队列内容。最后,销毁了循环队列。
三、代码细节解释
-
结构体定义
这里定义了一个结构体CirQueue
,包含一个大小为Maxsize
(10)的整数数组data
,以及两个整型变量front
和rear
。#include<stdio.h> #include<malloc.h> #define Maxsize 10 typedef struct { int data[Maxsize]; int front, rear; }CirQueue;
-
初始化与销毁
初始化函数InitCirQueue
通过动态内存分配为CirQueue
结构体分配内存,并将front
和rear
初始化为0。销毁函数DestroyCirQueue
则释放这块内存。void InitCirQueue(CirQueue*& C) { C = (CirQueue*)malloc(sizeof(CirQueue)); C->front = C->rear = 0; }//初始化
void DestroyCirQueue(CirQueue*& C) { free(C); }//销毁
-
判断队列状态
EmptyCirQueue
和FullCirQueue
函数分别通过比较front
和rear
的值来判断队列是否为空或已满。注意在判断队列是否已满时,使用了取模运算%
来确保索引在数组范围内循环。bool EmptyCirQueue(CirQueue* C) { return C->front == C->rear; }//判断是否为空
bool FullCirQueue(CirQueue* C) { return (C->rear + 1) % Maxsize == C->front; }//返回队列长度
-
入队与出队
PushCirQueue
函数在队列不满的情况下,将元素添加到队尾,并更新rear
的值。bool PushCirQueue(CirQueue*& C, int a) { if (FullCirQueue(C)) return false; C->data[C->rear] = a; C->rear = (C->rear + 1) % Maxsize; return true; }
PullCirQueue
函数在队列不为空的情况下,从队首取出元素,并更新front
的值。bool PullCirQueue(CirQueue*& C, int& a) { if (EmptyCirQueue(C)) return false; a = C->data[C->front]; C->front=(C->front + 1) % Maxsize; return true; }
-
显示队列内容
DispCirQueue
函数遍历队列并打印出所有元素。如果队列为空,则打印“循环队列为空”。void DispCirQueue(CirQueue* C) { if (C->front == C->rear) printf("循环队列为空\n"); else { int index = C->front; do { printf("%d ", C->data[index]); index = (index + 1) % Maxsize; } while (index != C->rear); printf("\n"); } }
-
主函数中的操作
在main
函数中,通过调用上述函数来测试循环队列的功能。首先,初始化一个空队列,并验证其为空。然后,通过循环将元素0到8入队,并显示每次入队后的队列内容。接着,将队列中的前5个元素出队,并显示每次出队后的队列内容。最后,再次入队一些元素并显示队列内容,最后销毁队列。int main() { CirQueue* C; InitCirQueue(C); if (EmptyCirQueue(C)) printf("循环队列为空\n"); printf("\n开始进队\n"); for (int i = 0; i < 9; i++) { printf("元素%d进队:", i); PushCirQueue(C, i); DispCirQueue(C); } printf("\n开始出队\n"); for (int i = 0; i < 5; i++) { int value = 0; PullCirQueue(C, value); printf("元素%d出队:", value); DispCirQueue(C); } printf("\n再由队尾入队\n"); for (int i = 9; i < 13; i++) { printf("元素%d进队:", i); PushCirQueue(C, i); DispCirQueue(C); } DestroyCirQueue(C); }
四、总结
本代码实现了一个基于数组的循环队列,并提供了基本的操作函数。通过主函数的测试,可以验证该循环队列的实现是正确且有效的。