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日

相关文章

  • Python数据结构之栈详解

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

    数据结构 2023年5月17日
    00
  • C语言中单链表的基本操作指南(增删改查)

    C语言中单链表的基本操作指南如下: 单链表 单链表是一种线性结构,具有链式存储的特点,即用指针相连的方式存储数据。单链表的每个节点包含一个数据域和一个指向下一个节点的指针域。单链表与数组相比,其插入和删除操作效率较高,但是查找效率较低。 在C语言中,可以使用结构体和指针实现单链表。如下所示,Node结构体表示单链表中的一个节点,包含一个数据成员和一个指向下一…

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

    Java 数据结构与算法系列精讲之贪心算法 什么是贪心算法? 在计算机科学中,贪心算法是一种通过选择局部最优解来实现全局最优解的优化算法。贪心算法在解决某些最优化问题时非常有效,贪心算法能够达到接近最优解,有时甚至能够达到最优解。 贪心算法解题步骤: 建立算法模型 找出最优解的子结构 设计贪心选择策略 实现贪心选择策略为一个最优解 证明贪心算法的正确性 贪心…

    数据结构 2023年5月17日
    00
  • 带你了解Java数据结构和算法之哈希表

    带你了解Java数据结构和算法之哈希表 前言 哈希表是一种常用的数据结构,它可以高效地存储和查询数据。在计算机科学领域,哈希表广泛用于实现关联数组(Associative Array)和哈希集合(Hash Set)。本文将带领大家深入了解哈希表数据结构及常用算法实现。 哈希表的原理 哈希表是根据关键码值(Key Value)而直接进行访问的数据结构。也就是说…

    数据结构 2023年5月17日
    00
  • Java数据结构之堆(优先队列)的实现

    Java 数据结构之堆(优先队列)的实现 什么是堆(优先队列) 堆(Heap)是一种数据结构,使用数组实现。堆分为小根堆和大根堆,大根堆满足父节点值大于子节点,小根堆则相反。堆通常被用来实现优先队列(Priority Queue)。 优先队列(Priority Queue)是一个能够让用户迅速查找到队列中最小值(或最大值)的抽象数据类型(ADT)。优先队列通…

    数据结构 2023年5月17日
    00
  • 0-学习路线

    超详细的算法学习路线 https://cuijiahua.com/blog/2020/10/life-73.html   主要分为 4 个部分:数学基础、编程能力、算法基础、实战。 1、数学基础 在机器学习算法中,涉及到最为重要的数学基本知识有两个:线性代数和概率论。 这两也是大学的必修课了,如果知识早已还给老师,也没关系,哪里不会学补哪里。 线性代数研究的…

    算法与数据结构 2023年4月17日
    00
  • Java数据结构之队列(动力节点Java学院整理)

    Java数据结构之队列(动力节点Java学院整理) 队列是一种有序列表,在其中所有插入操作必须在后端进行,而所有的删除操作必须在前端进行的数据结构。这种结构有时被称为先进先出(FIFO)。 队列的分类 普通队列:队列和栈一样,都是只能在一端进行插入操作,在另一端进行删除操作的特殊线性表。队列的特点是:先进先出。适用于数据必须按照插入顺序处理的必要场合。 双端…

    数据结构 2023年5月17日
    00
  • Java数据结构之有向图设计与实现详解

    Java数据结构之有向图设计与实现详解 什么是有向图 有向图是一种图形结构,其中每一个节点都有一个方向,即它指向或被其他节点指向。有向图可以用来表示许多实际问题,如路线、依赖关系、状态转移等。 有向图的基本概念 在有向图中,每一个节点都有一个唯一的标识符,被称为节点ID。如果从节点A到节点B存在一条有向边,则称B是A的后继节点,A是B的前驱节点。节点的度数是…

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