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

yizhihongxing

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 数据结构线性表之顺序存储详解原理 一、什么是线性表 线性表(Linear List)指的是同一类数据元素的集合,而且这些元素之间是有序的。线性表具有两个显著的特点:第一,有且仅有一个被称为“第一个”的数据元素;第二,有且仅有一个被称为“最后一个”的数据元素;此外,除第一个和最后一个数据元素外,其它数据元素均有且仅有一个直接前驱和一个直接后继。 二、…

    数据结构 2023年5月17日
    00
  • C语言数据结构之动态分配实现串

    C语言数据结构之动态分配实现串 序言 在本文中,我们将探讨C语言中动态分配实现串的方法和技巧。本文将会从什么是动态分配串开始,详细介绍如何实现动态分配串,并给出一些示例代码帮助读者更好地理解。 什么是动态分配串 一个串(string)是由零个或多个字符组成的有限序列。串的实现可以分为两种形式:静态分配和动态分配。动态分配串是指在运行时动态地分配内存,以适应不…

    数据结构 2023年5月17日
    00
  • C语言编程数据结构基础详解小白篇

    C语言编程数据结构基础详解小白篇攻略 1. 确定学习目标 在学习过程中,需要明确学习目标。对于小白来说,首先要了解C语言的基本语法,同时也需要掌握常用的数据结构。 2. 学习基本语法 2.1 变量和数据类型 C语言的变量必须先定义后使用 常用的数据类型包括整型、字符型、浮点型等 2.2 控制流程 C语言中常用的控制流程包括条件语句和循环语句 条件语句包括if…

    数据结构 2023年5月17日
    00
  • 「线段树」!(简单)的线段树

    本题为3月20日23上半学期集训每日一题中B题的题解 题面 题目描述 给你一个序列 \(A[1],A[2],…,A[n]\) .( \(|A[i]| \leq 15007, 1 \leq N \leq 50,000\) ). M( \(1 \leq M \leq 500,000\) ) 次询问,每次询问 \(Query(x, y) = Max{A[i] …

    算法与数据结构 2023年4月18日
    00
  • C++深入分析讲解链表

    C++深入分析讲解链表 链表概述 链表是数据结构中最基本和重要的一种,它的实现可以分为链表的节点和链表的指针。每个节点都记录着链表中的一个元素,并带有一个指向下一个节点的指针,这样就可以通过遍历指针,达到遍历链表的目的。 链表数据结构 在C++中,链表可以通过结构体或者类来实现,比如以下这个结构体实现的单向链表: struct Node { int data…

    数据结构 2023年5月17日
    00
  • C语言线性表之双链表详解

    C语言线性表之双链表详解 前言 本教程将详细介绍C语言中双链表的实现方法以及相关操作,适合有一定C语言基础的读者。 双链表定义 双链表是一种常见的数据结构,与单链表不同,双链表中每个节点不仅有指向后续节点的指针,还有指向前续节点的指针,即“双向链表”。 双链表的节点结构体可以定义如下: typedef struct double_node{ int data…

    数据结构 2023年5月17日
    00
  • C语言实现学生信息管理系统(链表)

    C语言实现学生信息管理系统(链表) 简介 学生信息管理系统是管理学生的一种系统,可以实现添加、查找、删除和修改学生信息等功能。本文将使用C语言实现学生信息管理系统,并通过链表的方式进行实现。 前提条件 在开始之前,我们需要了解如下内容: C语言基础知识 链表的基本概念和使用 系统架构 学生信息管理系统主要包含以下几个模块: 学生信息结构体 添加学生信息 查找…

    数据结构 2023年5月17日
    00
  • Java数据结构与算法之单链表深入理解

    Java数据结构与算法之单链表深入理解攻略 什么是单链表? 单链表(Singly Linked List)是指一个节点只指向下一个节点的链表。 单链表由多个节点组成,每个节点有两个属性:数据域和指针域。数据域保存节点的数据,指针域保存下一个节点的指针,因此每个节点包含两个域:data和next。 单链表的基本操作 单链表常用的基本操作包括: 在链表头部添加元…

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