详解数据结构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语言实现平衡二叉树数据结构算法

    使用C语言实现平衡二叉树数据结构算法可以分为以下几个步骤: 第一步:了解平衡二叉树 平衡二叉树是一种二叉搜索树,它具有以下特点: 高度平衡:每个节点的左右子树的高度差不能超过1。 有序性:对于任意一个节点,它的左子树中的所有节点都小于它,它的右子树中的所有节点都大于它。 平衡二叉树的优点在于它的查找、插入和删除操作都可以在O(log n)的时间内完成,比较快…

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

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

    数据结构 2023年5月17日
    00
  • C++数据结构之二叉搜索树的实现详解

    C++数据结构之二叉搜索树的实现详解 1. 什么是二叉搜索树? 二叉搜索树是一种二叉树,其中每个节点都包含一个键值,且每个节点的键值都大于其左子树中任何节点的键值,小于其右子树中任何节点的键值。如下图所示: 9 / \ 4 15 / \ 12 20 在上面的二叉搜索树中,节点的键值分别是9, 4, 15, 12, 20,且每个节点的键值都符合上述定义。 2.…

    数据结构 2023年5月17日
    00
  • java数据结构基础:稀疏数组

    Java数据结构基础:稀疏数组 在开发过程中,我们需要处理一些稀疏矩阵(大部分元素为0)的数据。这时候,使用稀疏数组是比较高效的方法。 什么是稀疏数组 稀疏数组是由很多元素值相同的元素组成,这些元素的值通常为0。而这些值不同时都存储在一个数组中会浪费很多内存空间。因此,我们使用稀疏数组来存储这些元素。 稀疏数组的定义: 稀疏数组的行数可以理解为矩阵的行数,而…

    数据结构 2023年5月17日
    00
  • C#数据结构与算法揭秘三 链表

    作为一本通俗易懂的C#数据结构与算法书籍,其第三章主要介绍链表(Linked List)的概念和基本操作。下面是链表的基本概念: 链表(Linked List)是一种动态数据结构,其中的元素按线性顺序排列,并且每个元素都称为一个结点(Node)。 每个结点都包含一个元素和一个指向下一个结点的指针(Pointer)。 相比于数组,链表的优势在于能够轻松地增加或…

    数据结构 2023年5月17日
    00
  • Python数据结构之栈详解

    Python数据结构之栈详解 什么是栈? 栈(stack)是一种数据元素只能在一端进行插入和删除操作的线性表。 栈的特点是后进先出,即在一个非空栈中,最后放入的元素最先被取出。 栈的操作 栈操作的基本有两个: push(elem):插入一个新的元素elem到栈中。 pop():弹出栈顶的元素,并返回这个被弹出元素的值。 此外还有一个用于查询栈顶元素的操作: …

    数据结构 2023年5月17日
    00
  • 栈(Stack)

    概述 栈就是一种 只允许在表尾进行插入和删除操作 的 线性表 栈的特点 先进后出 ,在表尾进行插入和删除操作 数组实现栈 crown crown:使用bottom来确定栈顶所在数组的下标,默认为 -1 空栈 当空栈时 ,crown = -1 栈是否为空 当 crown = -1 时 ,栈为空 ,不能 遍历 ,出栈 , 获取栈顶元素 栈是否已满 当 crown…

    算法与数据结构 2023年4月19日
    00
  • java实现数据结构单链表示例(java单链表)

    下面是 Java 实现数据结构单链表的完整攻略。 简介 单链表是数据结构中的一种,用于存储一组有序的元素。单链表中,每个元素都由一个结点表示,结点中包含了一个指向下一个结点的指针。单链表的结构更加灵活,支持插入、删除等操作。 实现步骤 1. 定义节点类ListNode 单链表的每一个节点包含两个属性,分别是节点值 val 和指向下一个节点的指针 next,所…

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