C语言代码:用 C 语言实现一个循环队列

2023年 12月 7日 33.0k 0

一、引言

队列是一种常见的数据结构,它遵循先进先出(FIFO)的原则。在实际应用中,队列经常被用于实现各种功能,如缓冲、任务调度等。而循环队列则是一种特殊的队列,它可以通过循环使用数组空间来避免队列中元素的浪费。在本文中,我们将使用C语言来实现一个循环队列,并通过代码和注释进行详细讲解。

二、循环队列的定义

循环队列通常使用一个固定大小的数组和两个指针来实现。其中一个指针指向队头元素,另一个指针指向队尾元素的下一个位置。当队列为空时,两个指针指向同一个位置;当队列为满时,队尾指针指向队头指针的前一个位置。为了实现循环效果,我们需要对数组下标进行取模运算。

在C语言中,我们可以定义一个结构体来表示循环队列,如下所示:

#define MAXSIZE 10 // 定义队列的最大容量  
  
typedef struct {  
    int data[MAXSIZE]; // 存储数据的数组  
    int front; // 队头指针  
    int rear; // 队尾指针  
} CircularQueue;

三、循环队列的操作

(1) 初始化队列

在使用循环队列之前,我们需要对其进行初始化。初始化的过程就是将队头和队尾指针设置为同一个位置。代码如下:

void InitQueue(CircularQueue *Q) {  
    Q->front = Q->rear = 0; // 初始化队头和队尾指针  
}

(2) 判断队列是否为空

判断队列是否为空的方法很简单,只需要检查队头和队尾指针是否相等即可。代码如下:

int IsEmpty(CircularQueue *Q) {  
    return Q->front == Q->rear; // 如果队头和队尾指针相等,则队列为空  
}

(3) 判断队列是否已满

判断队列是否已满的方法也很简单,只需要检查队尾指针是否指向队头指针的前一个位置即可。代码如下:

int IsFull(CircularQueue *Q) {  
    return (Q->rear + 1) % MAXSIZE == Q->front; // 如果队尾指针的下一个位置是队头指针,则队列已满  
}

(4) 入队操作

入队操作就是将一个新元素添加到队列的尾部。在实现入队操作时,我们需要先判断队列是否已满。如果队列已满,则无法进行入队操作;否则,我们将新元素添加到队尾指针指向的位置,并将队尾指针向后移动一位。代码如下:

int EnQueue(CircularQueue *Q, int x) {  
    if (IsFull(Q)) { // 如果队列已满,则无法进行入队操作  
        return 0; // 入队失败,返回0  
    } else {  
        Q->data[Q->rear] = x; // 将新元素添加到队尾指针指向的位置  
        Q->rear = (Q->rear + 1) % MAXSIZE; // 队尾指针向后移动一位  
        return 1; // 入队成功,返回1  
    }  
}

(5) 出队操作

出队操作就是从队列的头部移除一个元素。在实现出队操作时,我们需要先判断队列是否为空。如果队列为空,则无法进行出队操作;否则,我们移除队头指针指向的元素,并将队头指针向后移动一位。代码如下:

int DeQueue(CircularQueue *Q, int *x) {  
    if (IsEmpty(Q)) { // 如果队列为空,则无法进行出队操作  
        return 0; // 出队失败,返回0  
    } else {  
        *x = Q->data[Q->front]; // 获取队头元素的值  
        Q->front = (Q->front + 1) % MAXSIZE; // 队头指针向后移动一位  
        return 1; // 出队成功,返回1  
    }  
}

(6) 获取队头元素

有时候,我们可能需要获取队头元素的值,但并不想将其从队列中移除。这时,我们可以实现一个获取队头元素的函数。代码如下:

int GetFront(CircularQueue *Q, int *x) {  
    if (IsEmpty(Q)) { // 如果队列为空,则无法获取队头元素  
        return 0; // 获取失败,返回0  
    } else {  
        *x = Q->data[Q->front]; // 获取队头元素的值  
        return 1; // 获取成功,返回1  
    }  
}

四、循环队列的完整实现

下面是一个完整的循环队列的实现,包括初始化队列、判断队列是否为空、判断队列是否已满、入队操作、出队操作和获取队头元素等操作。代码如下:

#include
#include

#define MAXSIZE 10 // 定义队列的最大容量

typedef struct {
int data[MAXSIZE]; // 存储数据的数组
int front; // 队头指针
int rear; // 队尾指针
} CircularQueue;

// 初始化队列
void InitQueue(CircularQueue *Q) {
Q->front = Q->rear = 0; // 初始化队头和队尾指针
}

// 判断队列是否为空
int IsEmpty(CircularQueue *Q) {
return Q->front == Q->rear; // 如果队头和队尾指针相等,则队列为空
}

// 判断队列是否已满
int IsFull(CircularQueue *Q) {
return (Q->rear + 1) % MAXSIZE == Q->front; // 如果队尾指针的下一个位置是队头指针,则队列已满
}

// 入队操作
int EnQueue(CircularQueue *Q, int x) {
if (IsFull(Q)) { // 如果队列已满,则无法进行入队操作
return 0; // 入队失败,返回0
} else {
Q->data[Q->rear] = x; // 将新元素添加到队尾指针指向的位置
Q->rear = (Q->rear + 1) % MAXSIZE; // 队尾指针向后移动一位
return 1; // 入队成功,返回1
}
}

// 出队操作
int DeQueue(CircularQueue *Q, int *x) {
if (IsEmpty(Q)) { // 如果队列为空,则无法进行出队操作
return 0; // 出队失败,返回0
} else {
*x = Q->data[Q->front]; // 获取队头元素的值
Q->front = (Q->front + 1) % MAXSIZE; // 队头指针向后移动一位
return 1; // 出队成功,返回1
}
}

// 获取队头元素
int GetFront(CircularQueue *Q, int *x) {
if (IsEmpty(Q)) { // 如果队列为空,则无法获取队头元素
return 0; // 获取失败,返回0
} else {
*x = Q->data[Q->front]; // 获取队头元素的值
return 1; // 获取成功,返回1
}
}

int main() {
CircularQueue Q; // 创建一个循环队列实例
int x, y; // 用于存储临时数据

// 初始化队列
InitQueue(&Q);

// 测试入队操作
for (int i = 1; i

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论