C语言数据结构之队列算法详解

C语言数据结构之队列算法详解

什么是队列?

在计算机科学中,队列是一种抽象数据类型或线性数据结构。它具有先进先出(FIFO)的特性,即先进入队列的元素先被处理或先被移除。队列通常用于解决先到先服务的问题(如请求处理),但也常用于广泛的异步编程中。

队列的特点

队列通常具有以下特点:

  • 队列可以为空;
  • 队列从队首插入元素,从队尾移除元素;
  • 队列只允许从队尾插入元素,从队首移除元素;
  • 只有队尾和队首可以访问(获取或移除)队列的元素;
  • 队列具有线性结构,且一次只能将一个元素插入或移除。

队列的操作

对于队列,常见的操作有:

  • enQueue:插入一个元素到队列的队尾
  • deQueue:移除队列中的队首元素
  • peek:返回队列中的队首元素
  • isEmpty:判断队列是否为空
  • isFull:判断队列是否已满
  • size:返回队列元素的个数

队列算法详解

1. 数组实现的队列

数组实现的队列是最简单、最基础的队列实现方法。队列通过数组的方式存储,使用两个指针head和tail分别指向队首和队尾。

C语言数组实现的队列示例代码:

#define MAX_SIZE 10

typedef struct {
    int data[MAX_SIZE];
    int head;
    int tail;
} Queue;

void init(Queue *q) {
    q->head = q->tail = 0;
}

int isEmpty(Queue *q) {
    return q->head == q->tail;
}

int isFull(Queue *q) {
    return (q->tail + 1) % MAX_SIZE == q->head;
}

int size(Queue *q) {
    return (q->tail - q->head + MAX_SIZE) % MAX_SIZE;
}

void enQueue(Queue *q, int e) {
    if (isFull(q)) {
        printf("Queue is Full\n");
        return;
    }
    q->data[q->tail] = e;
    q->tail = (q->tail + 1) % MAX_SIZE;
}

int deQueue(Queue *q) {
    if (isEmpty(q)) {
        printf("Queue is Empty\n");
        exit(-1);
    }
    int e = q->data[q->head];
    q->head = (q->head + 1) % MAX_SIZE;
    return e;
}

int peek(Queue *q) {
    if (isEmpty(q)) {
        printf("Queue is Empty\n");
        exit(-1);
    }
    return q->data[q->head];
}

int main(int argc, char const *argv[]) {
    Queue q;
    init(&q);
    enQueue(&q, 1);
    enQueue(&q, 2);
    enQueue(&q, 3);
    while(!isEmpty(&q)) {
        printf("%d ", deQueue(&q));
    }
    return 0;
}

2. 链表实现的队列

链表实现的队列是一种比较灵活的实现方式,相对于数组实现,它的插入和删除时间复杂度更低。而且不会浪费空间(因为不需要预留空间,只需要在需要的时候申请空间即可)。

C语言链表实现的队列示例代码:

typedef struct _node {
    int val;
    struct _node *next;
} Node;

typedef struct {
    Node *head;
    Node *tail;
    int size;
} Queue;

void init(Queue *q) {
    q->head = q->tail = NULL;
    q->size = 0;
}

int isEmpty(Queue *q) {
    return q->head == NULL;
}

int size(Queue *q) {
    return q->size;
}

void enQueue(Queue *q, int e) {
    Node *n = (Node *) malloc(sizeof(Node));
    n->val = e;
    n->next = NULL;
    if (q->size == 0) {
        q->head = q->tail = n;
    } else {
        q->tail->next = n;
        q->tail = n;
    }
    q->size++;
}

int deQueue(Queue *q) {
    if (isEmpty(q)) {
        printf("Queue is Empty\n");
        exit(-1);
    }
    Node *n = q->head;
    int e = n->val;
    q->head = q->head->next;
    free(n);
    q->size--;
    return e;
}

int peek(Queue *q) {
    if (isEmpty(q)) {
        printf("Queue is Empty\n");
        exit(-1);
    }
    return q->head->val;
}

int main(int argc, char const *argv[]) {
    Queue q;
    init(&q);
    enQueue(&q, 1);
    enQueue(&q, 2);
    enQueue(&q, 3);
    while(!isEmpty(&q)) {
        printf("%d ", deQueue(&q));
    }
    return 0;
}

总结

队列是一种常见的数据结构,它具有先进先出的特点。队列有多种实现方法,包括数组实现、链表实现等。不同的实现方法有着不同的优点和缺点,我们可以根据实际情况进行选择。

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

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

相关文章

  • Redis高效率原因及数据结构分析

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

    数据结构 2023年5月17日
    00
  • Javascript数据结构与算法之列表详解

    Javascript数据结构与算法之列表详解 简介 本文旨在讲解Javascript中数据结构和算法的列表。 列表定义和实现 列表是一组有序的数据,每个列表中的数据项称为元素。在Javascript中,列表可以用数组来实现。数组的好处是它能够存储任意类型的数据,而且可以根据需要动态地调整数组的大小。下面是一个创建列表的基本模板: function List(…

    数据结构 2023年5月17日
    00
  • MySQL索引详解及演进过程及面试题延伸

    MySQL索引详解及演进过程及面试题延伸 索引的作用 在 MySQL 中,索引是一种数据结构,可用于快速查找和访问表中的数据。使用索引可以大大提高查询效率,特别是在大型数据表中。 索引可以看作是一本书中的目录,目录中列出了每个章节的页码,通过查询目录,读者可以快速找到感兴趣的章节。 索引的种类 MySQL 中支持多种类型的索引,下面我们介绍一下常见的索引类型…

    数据结构 2023年5月17日
    00
  • C语言数据结构旋转链表的实现

    C语言数据结构旋转链表的实现 1. 什么是旋转链表 旋转链表是一种特殊的链表,其特点是将链表的最后一个节点移动到最前面,形成一个环形链表的效果。比如下面这个链表: 1 -> 2 -> 3 -> 4 -> 5 经过一次旋转之后变成了: 5 -> 1 -> 2 -> 3 -> 4 2. 实现思路 旋转链表的实现思路…

    数据结构 2023年5月17日
    00
  • 详解Pytorch中的tensor数据结构

    详解Pytorch中的Tensor数据结构 在Pytorch中,Tensor是一种重要的数据结构,它是一个多维数组(类似于NumPy的ndarray),并且支持GPU加速操作。在本文中,我们将详细介绍Pytorch中的Tensor数据结构,包括如何创建、初始化、检索和修改Tensor对象。 创建Tensor对象 创建Tensor对象的方法有很多种。以下是一些…

    数据结构 2023年5月17日
    00
  • C++深入浅出探索数据结构的原理

    标题:C++深入浅出探索数据结构的原理攻略 介绍 《C++深入浅出探索数据结构的原理》是一本深入讲解C++数据结构的书籍。在本攻略中,我们将介绍该书的主要内容和要点,以及学习该书的步骤和建议。 内容 该书分为三个部分,分别是数据结构的基础、线性表和树。 数据结构的基础 第一部分主要讲解数据结构的基础知识,包括算法分析、时间复杂度和空间复杂度等。这一部分对于初…

    数据结构 2023年5月17日
    00
  • 字典树的基本知识及使用C语言的相关实现

    字典树的基本知识 字典树,英文名为Trie树,又称单词查找树或键树,是一种树形数据结构,用于表示关联数组或映射。它的优点是,可以大大减少无谓的字符串比较,查询效率比哈希表高。 字典树的核心概念是节点,每个节点包含一个字符和指向子节点的指针。根节点为空字符,每个字符串以一个独立的路径插入节点。如果一个字符串是另一个字符串的前缀,那么这个字符串的节点是另一个字符…

    数据结构 2023年5月17日
    00
  • Python 树表查找(二叉排序树、平衡二叉树)

    下面是 Python 树表查找(二叉排序树、平衡二叉树)的完整攻略: 什么是树表查找 树表查找是一种数据结构,用于在数据集合中快速查找、插入和删除数据。树表查找的基本思想是利用特定的树形结构,在不断比较和移动中找到目标数据。常见的树表查找有二叉排序树和平衡二叉树。 二叉排序树(Binary Search Tree) 二叉排序树是一种特殊的二叉树结构,它满足以…

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