当前位置:   article > 正文

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

循环队列代码c语言

摘要:

本文将介绍如何使用C语言实现一个循环队列,包括队列的定义、入队、出队、判空和判满等操作。代码实现将遵循专业编程规范,并使用注释进行详细解释。

图片

一、引言

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

二、循环队列的定义

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

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

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

三、循环队列的操作

初始化队列

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

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

判断队列是否为空

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

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

判断队列是否已满

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

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

入队操作

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

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

出队操作

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

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

获取队头元素

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

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

四、循环队列的完整实现

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

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4. #define MAXSIZE 10 // 定义队列的最大容量  
  5.   
  6. typedef struct {  
  7.     int data[MAXSIZE]; // 存储数据的数组  
  8.     int front; // 队头指针  
  9.     int rear; // 队尾指针  
  10. } CircularQueue;  
  11.   
  12. // 初始化队列  
  13. void InitQueue(CircularQueue *Q) {  
  14.     Q->front = Q->rear = 0// 初始化队头和队尾指针  
  15. }  
  16.   
  17. // 判断队列是否为空  
  18. int IsEmpty(CircularQueue *Q) {  
  19.     return Q->front == Q->rear; // 如果队头和队尾指针相等,则队列为空  
  20. }  
  21.   
  22. // 判断队列是否已满  
  23. int IsFull(CircularQueue *Q) {  
  24.     return (Q->rear + 1) % MAXSIZE == Q->front; // 如果队尾指针的下一个位置是队头指针,则队列已满  
  25. }  
  26.   
  27. // 入队操作  
  28. int EnQueue(CircularQueue *Q, int x) {  
  29.     if (IsFull(Q)) { // 如果队列已满,则无法进行入队操作  
  30.         return 0// 入队失败,返回0  
  31.     } else {  
  32.         Q->data[Q->rear] = x; // 将新元素添加到队尾指针指向的位置  
  33.         Q->rear = (Q->rear + 1) % MAXSIZE; // 队尾指针向后移动一位  
  34.         return 1// 入队成功,返回1  
  35.     }  
  36. }  
  37.   
  38. // 出队操作  
  39. int DeQueue(CircularQueue *Q, int *x) {  
  40.     if (IsEmpty(Q)) { // 如果队列为空,则无法进行出队操作  
  41.         return 0// 出队失败,返回0  
  42.     } else {  
  43.         *x = Q->data[Q->front]; // 获取队头元素的值  
  44.         Q->front = (Q->front + 1) % MAXSIZE; // 队头指针向后移动一位  
  45.         return 1// 出队成功,返回1  
  46.     }  
  47. }  
  48.   
  49. // 获取队头元素  
  50. int GetFront(CircularQueue *Q, int *x) {  
  51.     if (IsEmpty(Q)) { // 如果队列为空,则无法获取队头元素  
  52.         return 0// 获取失败,返回0  
  53.     } else {  
  54.         *x = Q->data[Q->front]; // 获取队头元素的值  
  55.         return 1// 获取成功,返回1  
  56.     }  
  57. }
  58.   
  59. int main() {  
  60.     CircularQueue Q; // 创建一个循环队列实例  
  61.     int x, y; // 用于存储临时数据  
  62.   
  63.     // 初始化队列  
  64.     InitQueue(&Q);  
  65.   
  66.     // 测试入队操作  
  67.     for (int i = 1; i <= 5; i++) {  
  68.         printf("入队元素 %d\n", i);  
  69.         EnQueue(&Q, i);  
  70.     }  
  71.   
  72.     // 测试获取队头元素操作  
  73.     if (GetFront(&Q, &x)) {  
  74.         printf("队头元素是 %d\n", x);  
  75.     } else {  
  76.         printf("队列为空,无法获取队头元素\n");  
  77.     }  
  78.   
  79.     // 测试出队操作  
  80.     while (!IsEmpty(&Q)) {  
  81.         if (DeQueue(&Q, &y)) {  
  82.             printf("出队元素是 %d\n", y);  
  83.         } else {  
  84.             printf("队列为空,无法进行出队操作\n");  
  85.         }  
  86.     }  
  87.   
  88.     // 测试队列是否为空  
  89.     if (IsEmpty(&Q)) {  
  90.         printf("队列为空\n");  
  91.     } else {  
  92.         printf("队列不为空\n");  
  93.     }  
  94.   
  95.     return 0;  
  96. }

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/798868
推荐阅读
相关标签
  

闽ICP备14008679号