【数据结构】线性表----队列详解

news2024/9/9 5:28:11
1. 队列的基本概念

话不多说,直接开始!

队列是一种线性数据结构,同栈类似但又不同,遵循先进先出FIFO, First In First Out)的原则。换句话说,最先进入队列的元素会最先被移除。这样的特点使得队列非常适合用于需要按顺序处理任务的场景。
在这里插入图片描述

特点:

  • 先进先出:第一个进入队列的元素最先被处理。
  • 操作受限:元素只能从队尾插入,从队头移除。
2. 队列的实现

在这里插入图片描述

队列可以通过多种方式实现,常见的有数组和链表两种。

使用数组实现队列:
使用数组实现队列需要维护两个指针,分别指向队头和队尾,并且需要处理数组的溢出问题。所以数组不是很适合用来实现队列。

使用链表实现队列:
链表不会受到同数组一样的困扰,并且链表实现的队列没有数组的大小限制;但需要额外的指针来管理链表的节点。

4. 队列的基本操作

队列的基本操作包括入队(Enqueue)出队(Dequeue)查看队头(Peek)检查队列是否为空(IsEmpty)

入队(Enqueue):
将元素添加到队尾。

出队(Dequeue):
移除队头的元素。

查看队头(Peek):
查看队头的元素,但不移除。

检查队列是否为空(IsEmpty):
检查队列中是否有元素。

5. 队列的高级用法

循环队列:
循环队列是一种优化的队列实现,避免了数组实现中由于出队操作造成的空间浪费。

优先队列:
优先队列中的元素具有优先级,出队时优先级高的元素会被优先移除。

6.两种形式的队列实现

在这里插入图片描述

入队(Enqueue)

将元素添加到队尾。如果使用数组实现,需要检查队列是否已满。如果使用链表实现,只需将新节点添加到链表的末尾。

数组实现的入队操作:

void enqueue(Queue* q, int value) {
    if (isFull(q)) {
        printf("Queue is full!\n");
        return;
    }
    if (isEmpty(q)) {
        q->front = 0;
    }
    q->rear++;
    q->items[q->rear] = value;
}

链表实现的入队操作:

void enqueue(Queue* q, int value) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = value;
    newNode->next = NULL;
    if (isEmpty(q)) {
        q->front = newNode;
    } else {
        q->rear->next = newNode;
    }
    q->rear = newNode;
}
出队(Dequeue)

移除队头的元素。如果使用数组实现,需要检查队列是否为空,并调整队头指针。如果使用链表实现,需要移除链表的第一个节点。

数组实现的出队操作:

int dequeue(Queue* q) {
    if (isEmpty(q)) {
        printf("Queue is empty!\n");
        return -1;
    }
    int item = q->items[q->front];
    q->front++;
    if (q->front > q->rear) {
        initQueue(q);
    }
    return item;
}

链表实现的出队操作:

int dequeue(Queue* q) {
    if (isEmpty(q)) {
        printf("Queue is empty!\n");
        return -1;
    }
    int item = q->front->data;
    Node* temp = q->front;
    q->front = q->front->next;
    if (q->front == NULL) {
        q->rear = NULL;
    }
    free(temp);
    return item;
}
查看队头(Peek)

查看队头的元素,但不移除。如果队列为空,应返回特定的错误值或抛出异常。

数组实现的查看队头操作:

int peek(Queue* q) {
    if (isEmpty(q)) {
        printf("Queue is empty!\n");
        return -1;
    }
    return q->items[q->front];
}

链表实现的查看队头操作:

int peek(Queue* q) {
    if (isEmpty(q)) {
        printf("Queue is empty!\n");
        return -1;
    }
    return q->front->data;
}
检查队列是否为空(IsEmpty)

检查队列中是否有元素。这是一个常用的辅助操作,用于确保其他操作的前提条件。

数组实现的检查是否为空操作:

int isEmpty(Queue* q) {
    return q->front == -1;
}

链表实现的检查是否为空操作:

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

队列的高级玩法

除了基本操作外,队列还有一些高级用法,如循环队列和优先队列。

循环队列

在这里插入图片描述

循环队列是一种优化的队列实现,避免了数组实现中由于出队操作造成的空间浪费。循环队列通过将队尾连接到队头,使得数组能够循环使用。

循环队列的实现:

#define MAX 100

typedef struct {
    int items[MAX];
    int front, rear;
} CircularQueue;

void initQueue(CircularQueue* q) {
    q->front = -1;
    q->rear = -1;
}

int isEmpty(CircularQueue* q) {
    return q->front == -1;
}

int isFull(CircularQueue* q) {
    return (q->rear + 1) % MAX == q->front;
}

void enqueue(CircularQueue* q, int value) {
    if (isFull(q)) {
        printf("Queue is full!\n");
        return;
    }
    if (isEmpty(q)) {
        q->front = 0;
    }
    q->rear = (q->rear + 1) % MAX;
    q->items[q->rear] = value;
}

int dequeue(CircularQueue* q) {
    if (isEmpty(q)) {
        printf("Queue is empty!\n");
        return -1;
    }
    int item = q->items[q->front];
    if (q->front == q->rear) {
        initQueue(q);
    } else {
        q->front = (q->front + 1) % MAX;
    }
    return item;
}
优先队列

优先队列中的元素具有优先级,出队时优先级高的元素会被优先移除。优先队列可以使用**堆(Heap)**来实现,能够高效地进行插入和删除操作。
而堆我们将会在下一章进行讲解。

队列在实际中的应用

队列在许多实际应用中扮演重要角色,以下是几个常见的例子:

操作系统中的任务调度

操作系统使用队列管理任务的执行顺序。任务调度器将所有待处理的任务放入队列中,并按顺序调度这些任务。

打印队列

打印机使用队列管理打印任务,确保按顺序打印。

广度优先搜索(BFS)

在图的遍历中,BFS使用队列管理待访问的节点。BFS是一种图的遍历算法,它从根节点开始,先访问所有相邻节点,再按层次访问更深的节点。

使用队列时需要注意的问题

  1. 空间复杂度: 数组实现的队列在入队和出队操作后可能会导致空间浪费,使用循环队列可以解决这个问题。
  2. 时间复杂度: 队列的基本操作时间复杂度通常为O(1),但优先队列的插入和删除操作可能会更耗时,具体取决于实现方式。
  3. 内存管理: 使用链表实现队列时,需要注意内存管理,确保在出队操作后释放已移除节点的内存,避免内存泄漏。

总结

队列作为一种重要的数据结构,具有简单但实用的特性。在本文中,我们介绍了队列的基本概念、实现方法、常见操作、实际应用以及使用时需要注意的问题。通过实践代码示例,相信读者能更好地理解和掌握队列的使用。队列在编程中的应用广泛,相信掌握了它将为你的编程技能打下坚实的基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1918454.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MyBatis拦截器在实际项目中的应用

MyBatis 是一个流行的 Java 持久层框架,它简化了数据库访问的复杂性,为开发者提供了强大的功能。其中,MyBatis 拦截器是一个非常有用的特性,可以帮助开发者灵活地解决各种问题。 一、MyBatis 拦截器 1.1 从执行 SQL 语句的核心流…

力扣爆刷第163天之TOP100五连刷81-85(回文链表、路径和、最长重复子数组)

力扣爆刷第163天之TOP100五连刷81-85(回文链表、路径和、最长重复子数组) 文章目录 力扣爆刷第163天之TOP100五连刷81-85(回文链表、路径和、最长重复子数组)一、234. 回文链表二、112. 路径总和三、169. 多数元素四、662. 二叉树…

sort命令

简介 sort是在Linux里非常常用的一个排序命令。将文件的每一行作为一个单位,从首字符向后,依次按ASCII码值进行比较,默认将他们按升序输出。 常用参数 -u :去除重复行 -r :降序排列,默认是升序 …

华为HCIP Datacom H12-821 卷36

1.单选题 在PIM- SM中,以下关于RP 的描述,错误的是哪一选项? A、在PIM-SM中,组播数据流量不一定必须经过RP的转发。 B、对于一个组播组来说,可以同时有多个RP地址,提升网络可靠性。 C、组播网络中,可以…

一篇文章带你解密最近爆火的消费增值模型!

今天,我非常激动地向您介绍一个令人振奋的成功故事。我们的合作伙伴在短短一个月内实现了业绩的飞跃,达到了百万级别的销售额,同时他们的用户活跃度也保持在极高的水平,平均每天有8万至10万的在线用户。这一成就的取得&#xff0c…

ARMV8安全特性:Pointer Authentication

文章目录 前言一、Introduction二、Problem Definition三、Pointer Authentication3.1 Instructions3.2 Cryptography3.3 Key Management 四、Sample Use Cases4.1 Software Stack Protection4.2 Control Flow Integrity (CFI)4.3 Binding Pointers to Addresses 五、Security …

十大优秀AI人工智能作词软件有哪些?

1、妙笔生词:国内专业智能作词工具,是一款非常优秀的国内作词软件,它可以选择语言,风格,韵脚一键生成歌词,也可以仿写歌词,可以续写歌词,可以智能取歌名,找优秀词句&…

华宇携TAS应用中间件亮相2024年山东江信智能信创产品推介会

信创产业是数据、网络安全的基础,也是“新基建”的重要内容,将成为拉动经济发展的重要抓手之一。 7月5日,以“信守时代机遇,创造辉煌未来”为主题的山东江信智能信创产品推介会在济南举办。本次产品推介会汇聚了国内众多信息技术…

windows sshkeygen 多平台添加配置

文章目录 .ssh目录生成新的ssh配置添加公钥到仓库验证 .ssh目录 windows下一般为:C:\Users\15237\.ssh ,其中“15237”为当前登录用户 生成新的ssh .ssh目录下打开“Git Bash Here”(如果没有,先安装 Git 软件) 执…

阿一课代表今日分享之使用dnscat2 进行dns隧道反弹shell(直连模式linux对linux)

DNS介绍 DNS是域名系统(Domain Name System)的缩写,是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。 DNS的记录类型有很多&a…

The First项目报告:创新型金融生态Lista DAO

一、Lista DAO是什么? LISTA是Lista DAO的原生加密协议代币,设计为一种可互操作的实用代币,旨在促进去中心化金融(DeFi)领域内的支付、治理与激励。LISTA的诞生源于Lista DAO项目,该项目是一个基于BNB链的…

IntelliJ IDEA 2024.1.4最新教程!!直接2099!!爽到飞起!!

IntelliJ IDEA 2024.1.4最新破解教程!!直接2099!!爽到飞起!!【资源在末尾】安装馆长为各位看官准备了多个版本,看官可根据自己的需求进行下载和选择安装。https://mp.weixin.qq.com/s/Tic1iR_Xc…

【一文带你了解RAG(检索增强生成) | 概念理论介绍+ 代码实操(含源码)】

文末有福利! 引言 针对大型语言模型效果不好的问题,之前人们主要关注大模型再训练、大模型微调、大模型的Prompt增强,但对于专有、快速更新的数据却并没有较好的解决方法,为此检索增强生成(RAG)的出现&am…

【简历】南京某一本大学:JAVA简历指导,基本拿不到offer

注:为保证用户信息安全,姓名和学校等信息已经进行同层次变更,内容部分细节也进行了部分隐藏 简历说明 这份简历是一个一本计算机专业的同学。一本同学在校招的时候,要做好自己的求职层次定位,因为像工业类、邮电类、…

【JavaScript 报错】未捕获的URI错误:Uncaught URIError

🔥 个人主页:空白诗 文章目录 一、错误原因分析1. 不合法的URI字符2. 不匹配的编码 二、解决方案1. 检查URI字符2. 使用try-catch块 三、实例讲解四、总结 Uncaught URIError 是JavaScript中常见的一种错误,通常发生在全局URI处理函数&#x…

前端如何取消接口调用

🧑‍💻 写在开头 点赞 收藏 学会🤣🤣🤣 1. xmlHttpRequest是如何取消请求的? 实例化的XMLHttpRequest对象上也有abort方法 const xhr new XMLHttpRequest(); xhr.addEventListener(load, function(e)…

程控水冷阻性负载是否有替代品出现?

程控水冷阻性负载是广泛应用于工业生产过程中的设备,主要用于冷却和控制电阻性负载。然而,随着科技的不断发展,新型的冷却和控制设备不断涌现,使得程控水冷阻性负载面临着替代品的挑战。 空气冷却系统是一种可能的替代品&#xff…

形态学图像处理

1 工具 1.1 灰度腐蚀和膨胀 当平坦结构元b的原点是(x,y)时,它在(x,y)处对图像f的灰度腐蚀定义为,图像f与b重合区域中的最小值。结构元b在位置(x,y)处对图像f的腐蚀写为: 类似地,当b的反射的原点是(x,y)时,平坦结构元…

C++ 【 Open3D 】 点云按高程进行赋色

一、 Open3D中根据点云的高程度信息为点云中的每个点附上颜色&#xff0c;并保存颜色渲染结果&#xff01; #include<iostream> #include<open3d/Open3D.h>using namespace std;int main() {//-------------------------------读取点云--------------------------…

FastAPI 学习之路(四十三)路径操作的高级配置

在实际开发中&#xff0c;可能我们有些接口不能在接口文档中与其他业务接口一样开放给前端或者其他对接人&#xff0c;那么我们肯定会想着在接口文档中对其进行屏蔽隐藏操作&#xff0c;那么可以实现吗&#xff1f; 接口文档中隐藏接口 当然&#xff0c;还很简单&#xff0c;…