文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-11-30 04:25

关注

二、循环队列的定义

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

在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 <= 5; i++) {  
        printf("入队元素 %d\n", i);  
        EnQueue(&Q, i);  
    }  
  
    // 测试获取队头元素操作  
    if (GetFront(&Q, &x)) {  
        printf("队头元素是 %d\n", x);  
    } else {  
        printf("队列为空,无法获取队头元素\n");  
    }  
  
    // 测试出队操作  
    while (!IsEmpty(&Q)) {  
        if (DeQueue(&Q, &y)) {  
            printf("出队元素是 %d\n", y);  
        } else {  
            printf("队列为空,无法进行出队操作\n");  
        }  
    }  
  
    // 测试队列是否为空  
    if (IsEmpty(&Q)) {  
        printf("队列为空\n");  
    } else {  
        printf("队列不为空\n");  
    }  
  
    return 0;  
}

这个测试程序首先创建一个循环队列实例,并进行初始化。然后,它进行了一系列入队操作,将1到5这五个数字依次入队。接着,它尝试获取队头元素,并打印出来。然后,它进行一系列出队操作,将队列中的元素依次移除,并打印出来。最后,它检查队列是否为空,并打印结果。通过这个测试程序,我们可以验证循环队列的实现是否正确。

五、总结与参考资料

本文介绍了如何使用C语言实现一个循环队列,包括队列的定义、入队、出队、判空和判满等操作。在实现过程中,我们遵循了专业编程规范,并使用注释进行了详细解释。循环队列是一种高效的数据结构,可以在各种应用中发挥重要作用。在实际使用中,我们可以根据具体需求对其进行扩展和优化。

来源:鲨鱼编程内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯