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日

相关文章

  • Java数据结构之双端链表原理与实现方法

    Java数据结构之双端链表原理与实现方法 一、什么是双端链表? 双端链表是一种链式数据结构,它每个节点都有两个指针:一个指向前一个节点,一个指向后一个节点。它具有链表的所有特点,而且还有一些独特的优点:对于一个双向链表,我们可以从头到尾遍历,也可以从尾到头遍历。在某些情况下,它比单向链表更有用,因为它可以执行逆序遍历。 二、双端链表的原理 双端链表由节点构成…

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

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

    数据结构 2023年5月17日
    00
  • java数据结构与算法数组模拟队列示例详解

    下面是“java数据结构与算法数组模拟队列示例详解”的完整攻略。 标题 Java数据结构与算法:数组模拟队列示例详解 简介 本文将以Java语言为例,详细讲解如何使用数组模拟队列。对于初学者来说,队列是一个非常基础的数据结构,掌握其实现方法可以帮助进一步理解其他的数据结构和算法。 队列的定义 队列(Queue)是一种先进先出(First In First O…

    数据结构 2023年5月17日
    00
  • C语言实现通用数据结构之通用链表

    C语言是一门广泛应用于低级别系统编程的语言,也是数据结构和算法学习的重要工具之一,而在C语言中实现通用数据结构的方法之一就是通用链表。 通用链表是一种使用节点来组织数据的通用数据结构,每个节点包含一定量的数据以及指向链表中下一个节点的指针,因此,它可以用来实现许多不同的数据结构,例如栈、队列、树、图、哈希表等等。 具体实现通用链表的方法如下: 步骤一:定义节…

    数据结构 2023年5月17日
    00
  • C语言 数据结构之链表实现代码

    下面就是关于C语言数据结构之链表实现代码的完整攻略。 什么是链表 链表是一种基础的数据结构,它是由一系列的节点所组成,每个节点会包含自己的数据和指向下一个节点的指针。 链表分为单向链表、双向链表和循环链表等多种类型,常见的是单向链表和双向链表。 链表的优点 相对于数组,链表具有下述优点: 链表的长度可以无限增长,不存在数组固定长度的问题; 插入和删除元素时,…

    数据结构 2023年5月17日
    00
  • C++高级数据结构之优先队列

    C++高级数据结构之优先队列 什么是优先队列? 优先队列是一种特殊的队列,其中每个元素都有一个优先级。当加入一个元素时,它会被放置在队列中的适当位置,以确保优先级最高的元素位于队头。从队列中取出元素时,总是从队头删除元素。 优先队列的应用 优先队列的常见应用场景包括: 操作系统任务调度 网络传输协议TCP中的拥塞控制算法 各种图像算法如边缘检测等 C++中S…

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

    C++数据结构之链表详解 链表是一种重要的数据结构,它可以动态的分配内存空间,实现灵活的元素插入,删除等操作。本文将详细讲解链表的定义、实现、常见操作以及链表的应用。 定义与特点 链表是一种线性表数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表分为单向链表和双向链表,其中单向链表的每个节点只包含一个指针,指向下一个节点,而双向链表的每…

    数据结构 2023年5月17日
    00
  • C语言类的双向链表详解

    C语言类的双向链表详解 基本概念 什么是双向链表? 双向链表是链表的一种,它有两个指针域:一个指向前一个结点,一个指向后一个结点。每个结点包含两个部分:数据和指针域,指针域分别指向前一个结点和后一个结点,所以每个结点都是由数据和两个指针域构成的。 双向链表的作用? 双向链表可以支持O(1)时间复杂度的在任何一个结点前或后插入一个结点。 双向链表的实现方式? …

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