详解数据结构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日

相关文章

  • 数据结构之数组Array实例详解

    数据结构之数组Array实例详解 什么是数组? 数组是一种由相同类型元素组成的集合,它们在内存中是连续存储的。通过下标可以访问数组中的元素,下标从0开始,到length-1结束。 定义数组 使用Array构造函数 可以使用Array构造函数来创建数组。以下是一些数组的创建方式。 var array1 = new Array(); // 创建空数组 var a…

    数据结构 2023年5月17日
    00
  • C++数据结构的队列详解

    C++数据结构的队列详解 队列是什么? 队列是一种先进先出(First In First Out, FIFO)的数据结构,类似于现实生活中的排队等待服务。 队列中的数据按照先进先出的原则被处理。新的元素只能被插入在队列的末尾,而旧的元素只能从队列的开头被删除。因此,队列的末尾称为队尾,队列的开头被称为队头。 队列的实现方式 数组实现方式 队列可以使用数组实现…

    数据结构 2023年5月17日
    00
  • 解析Facebook的数据库查询引擎Presto在美团的应用

    解析Facebook的数据库查询引擎Presto在美团的应用 什么是Presto? Presto是一个面向分布式查询的数据引擎,由Facebook开发并开源。它支持SQL查询,可以在不同类型的数据源中查询数据(如Hadoop HDFS、Hive等),具有快速、可扩展、灵活等特点。 Presto在美团的应用 美团使用Presto来进行大数据分析,帮助其优化运营…

    数据结构 2023年5月17日
    00
  • Java数据结构之图的两种搜索算法详解

    Java数据结构之图的两种搜索算法详解 引言 图是现实世界中最为普遍的现象之一,因此对于图的分析和操作是计算机科学和工程中最为重要的问题之一。在本文中,我们将对图结构的两种搜索算法进行详细讨论和研究,这些算法是图论研究的基本工具。 图的定义 在计算机科学和数学领域中,图是由若干个节点(或称为顶点)和它们之间的边组成的一种数据结构。 图的两种搜索算法 图的搜索…

    数据结构 2023年5月17日
    00
  • Lua中使用table实现的其它5种数据结构

    Lua中使用table可以实现多种数据结构,除了Lua原生支持的数组、哈希表之外,我们还可以用table来实现其他五种数据结构,这些数据结构包括集合(Set)、队列(Queue)、双端队列(deque)、堆栈(stack)以及链表(List)。 Set 集合数据结构中的元素是无序的、不重复的。使用table来实现集合数据结构,可以将元素作为table的key…

    数据结构 2023年5月17日
    00
  • Golang实现数据结构Stack(堆栈)的示例详解

    Golang实现数据结构Stack(堆栈)的示例详解 什么是Stack? Stack,也称为堆栈,是一种先进后出(Last In First Out, LIFO)的数据结构。举个例子,比如一堆书,你按照一定的顺序叠起来,然后你想要拿出第一本,你需要先拿掉上面的书才能取到下面的。这就是典型的堆栈模型。 在编程中,Stack也是一种非常常见的数据结构,特别是在函…

    数据结构 2023年5月17日
    00
  • 一起来看看C语言线性表的线性链表

    一起来看看C语言线性表的线性链表攻略 线性链表概述 线性链表是线性表的一种实现方式,它通过每个节点中包含指向下一个节点的指针来实现表中元素之间的链接,可以动态地增加、删除节点。线性链表分为带头节点的链表和不带头节点的链表,其中带头节点的链表更为常见。 实现思路 结构体定义 我们可以定义一个结构体来表示每个节点,例如: typedef struct ListN…

    数据结构 2023年5月17日
    00
  • Redis高效率原因及数据结构分析

    Redis高效率原因及数据结构分析 Redis高效率的原因 Redis是一款高性能、高可靠性的内存数据库,其高效率的原因主要体现在以下几个方面: 1. 内存存储 Redis数据完全存储在内存中,而不是像传统的关系型数据库一样存储在磁盘中。内存的读写速度要远远快于磁盘的读写速度,因此Redis在数据读写时的速度非常快,能够达到每秒钟数百万次的读写操作。 2. …

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