详解数据结构C语言实现之循环队列

详解数据结构C语言实现之循环队列

什么是循环队列

循环队列是一种数据结构,它可以存储一组固定大小的元素,并且支持在队列尾部插入元素和在队列头部删除元素,当队列尾部没有空间时可以将队列头部空余的位置用来插入元素,实现循环的效果。循环队列的主要优点在于插入和删除元素的时间复杂度均为O(1),而不是O(n)。

如何实现循环队列

循环队列可以使用数组来实现,需要定义队列的元素类型和队列的大小。队列还需要记录队首和队尾元素的下标,以及队列中元素的数量。以下是循环队列的基本结构。

#define MAX_SIZE 10

typedef struct {
    int data[MAX_SIZE];
    int front;  // 队首元素的下标
    int rear;   // 队尾元素的下标
    int count;  // 队列中元素的数量
} CirQueue;

队列中元素的数量可以用rear和front之间的差值来表示,即count = (rear - front + MAX_SIZE) % MAX_SIZE。这样的计算可以避免数组越界的问题。

循环队列的插入和删除操作

插入操作

循环队列的插入操作有两个步骤:将元素存储到队列尾部,更新队尾元素的下标。

以下是循环队列的插入代码实现。

int InsertCirQueue(CirQueue *pCQ, int x) {
    if (pCQ->count >= MAX_SIZE) {   // 队列已满
        return 0;
    }
    pCQ->data[pCQ->rear] = x;
    pCQ->rear = (pCQ->rear + 1) % MAX_SIZE;
    pCQ->count++;
    return 1;
}

删除操作

循环队列的删除操作有两个步骤:获取队首元素,更新队首元素的下标。

以下是循环队列的删除代码实现。

int DeleteCirQueue(CirQueue *pCQ, int *px) {
    if (pCQ->count <= 0) {  // 队列为空
        return 0;
    }
    *px = pCQ->data[pCQ->front];
    pCQ->front = (pCQ->front + 1) % MAX_SIZE;
    pCQ->count--;
    return 1;
}

循环队列的完整实现

下面是循环队列的完整实现。包括初始化,判断队列是否为空或已满,输出队列元素等操作。

#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 10

typedef struct {
    int data[MAX_SIZE];
    int front;  // 队首元素的下标
    int rear;   // 队尾元素的下标
    int count;  // 队列中元素的数量
} CirQueue;

void InitCirQueue(CirQueue *pCQ) {
    pCQ->front = 0;
    pCQ->rear = 0;
    pCQ->count = 0;
}

int IsEmptyCirQueue(CirQueue *pCQ) {
    return pCQ->count <= 0;
}

int IsFullCirQueue(CirQueue *pCQ) {
    return pCQ->count >= MAX_SIZE;
}

int InsertCirQueue(CirQueue *pCQ, int x) {
    if (IsFullCirQueue(pCQ)) {   // 队列已满
        return 0;
    }
    pCQ->data[pCQ->rear] = x;
    pCQ->rear = (pCQ->rear + 1) % MAX_SIZE;
    pCQ->count++;
    return 1;
}

int DeleteCirQueue(CirQueue *pCQ, int *px) {
    if (IsEmptyCirQueue(pCQ)) {  // 队列为空
        return 0;
    }
    *px = pCQ->data[pCQ->front];
    pCQ->front = (pCQ->front + 1) % MAX_SIZE;
    pCQ->count--;
    return 1;
}

void PrintCirQueue(CirQueue *pCQ) {
    int i, j;
    j = pCQ->count;
    for (i = pCQ->front; j > 0; i = (i+1) % MAX_SIZE) {
        printf("%d ", pCQ->data[i]);
        j--;
    }
    printf("\n");
}

void main() {
    CirQueue CQ;
    int x;

    InitCirQueue(&CQ);
    InsertCirQueue(&CQ, 1);
    InsertCirQueue(&CQ, 2);
    InsertCirQueue(&CQ, 3);
    printf("队列元素:");
    PrintCirQueue(&CQ);

    DeleteCirQueue(&CQ, &x);
    DeleteCirQueue(&CQ, &x);
    printf("队列元素:");
    PrintCirQueue(&CQ);
}

示例说明

示例1:在初始化一个循环队列后,插入3个元素,并打印队列中的元素。

CirQueue CQ;
InitCirQueue(&CQ);
InsertCirQueue(&CQ, 1);
InsertCirQueue(&CQ, 2);
InsertCirQueue(&CQ, 3);
printf("队列元素:");
PrintCirQueue(&CQ);  // 输出队列元素

示例2:在一个循环队列中删除2个元素,并打印队列中的元素。

CirQueue CQ;
int x;
InitCirQueue(&CQ);
InsertCirQueue(&CQ, 1);
InsertCirQueue(&CQ, 2);
InsertCirQueue(&CQ, 3);
DeleteCirQueue(&CQ, &x);
DeleteCirQueue(&CQ, &x);
printf("队列元素:");
PrintCirQueue(&CQ);  // 输出队列元素

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解数据结构C语言实现之循环队列 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • C#数据结构之顺序表(SeqList)实例详解

    C#数据结构之顺序表(SeqList)实例详解 顺序表(SeqList)概述 顺序表(SeqList)是一种线性表存储结构,它的特点是元素的存储位置是连续的。因为它的存储结构是数组,所以在访问和修改元素时,可以通过数组下标进行快速定位。顺序表在内存中的存储相对紧凑,因此查找和修改效率都很高,适用于大多数元素较少、但是需要频繁访问的场景。 实现顺序表(SeqL…

    数据结构 2023年5月17日
    00
  • Java数据结构BFS广搜法解决迷宫问题

    Java数据结构BFS广搜法解决迷宫问题 什么是BFS广搜法? 广度优先搜索(BFS)是一种遍历或搜索数据结构(例如树或图)的算法经典方法之一,也是解决迷宫问题的有效解法之一。BFS方法是从图的某个节点出发,以广度优先的方式依次访问与该节点相通的各节点,直到访问所有节点。BFS算法主要借助队列的数据结构来实现。 解决迷宫问题的具体实现 数据准备: 在解决迷宫…

    数据结构 2023年5月17日
    00
  • Java 数据结构与算法系列精讲之二叉堆

    Java 数据结构与算法系列精讲之二叉堆 什么是二叉堆? 二叉堆是一种基于完全二叉树的数据结构,它分为大根堆(MaxHeap)和小根堆(MinHeap)。大根堆的每个节点的值都大于(或等于)它的子节点的值,小根堆的每个节点的值都小于(或等于)它的子节点的值。 二叉堆的操作 二叉堆主要有以下几种操作: 插入元素:将元素插入到堆的最后一个叶子节点,然后通过上滤操…

    数据结构 2023年5月17日
    00
  • MySQL数据库体系架构详情

    MySQL数据库体系架构是MySQL数据库自身的发展和演变过程中逐渐形成的一个庞大的体系。这个体系由多个组件构成,包括连接器、查询缓存、解析器、优化器、执行器、存储引擎等多个部分,其中存储引擎是其中最具有代表性的组件之一。在这篇攻略中,我们将详细讲解MySQL数据库体系架构的各个部分,介绍它们各自的功能和作用。 连接器 MySQL的连接器负责与客户端建立连接…

    数据结构 2023年5月17日
    00
  • Java数据结构学习之栈和队列

    Java数据结构学习之栈和队列 什么是栈 栈(stack)是一种线性数据结构,它只能在一端进行插入和删除操作,这一端被称作栈顶(top)。栈的特点是先进后出(FILO,First-In-Last-Out),即最后进入的元素最先被删除。 栈的实现方式 栈可以使用数组或链表来实现。使用数组实现的栈称作顺序栈,使用链表实现的栈称作链式栈。以下是顺序栈的 Java …

    数据结构 2023年5月17日
    00
  • C++数据结构哈希表详解

    C++数据结构哈希表详解 哈希表(Hash Table)是一种非常重要的数据结构,用于实现字典等各种应用。哈希表将关键字映射到一个固定大小的数据集合中,以支持常数时间复杂度的插入、查找和删除操作。哈希表的核心思想是将关键字通过哈希函数(Hash Function)映射到数据集合中的一个索引位置,哈希函数需要满足良好的散列性质,使得关键字能够均匀地散布在数据集…

    数据结构 2023年5月17日
    00
  • Java 数据结构与算法系列精讲之哈希算法实现

    Java 数据结构与算法系列精讲之哈希算法实现 什么是哈希算法? 哈希算法是一种能将任意长度的消息压缩到某一固定长度的消息摘要的算法。 通过哈希算法,我们可以将一个任意的大数据量压缩成一段固定长度的数据,这个数据的长度通常比较小,相对于原数据的大小来说,要小得多。哈希算法的压缩特性使得它经常用来进行信息摘要、数据校验、唯一识别等功能,可以很大程度上提高数据的…

    数据结构 2023年5月17日
    00
  • Unity接入高德开放API实现IP定位

    Unity接入高德开放API实现IP定位攻略 本文将详细介绍如何在Unity中接入高德开放API实现IP定位功能。 准备工作 在开始之前,需要准备以下内容: 高德开放平台账号 Unity集成开发环境 一台联网的电脑或手机 开始集成 1. 创建Unity项目 首先,我们需要在Unity中创建一个新的项目。 2. 导入AMap3D SDK 将下载好的AMap3D…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部