队列-数据结构

news/2024/10/4 19:36:54/文章来源:https://blog.csdn.net/weixin_63722559/article/details/141963676
一、队列 FIFO

特点:先进先出,后进后出

允许从一段插入数据,另一端删除数据的线性存储结构

队尾:插入数据 入队

队头:删除数据 出队

管道实质上也是一个队列。

用途:缓存数据(主要是避免两者速度不匹配的,数据存取速度不匹配。)

二、队列类型
2.1、顺序队列

顺序队列---------》假溢出-----------------》循环队列(如果用顺序队列里面,我们主要用的就是循环队列)

队列中的假溢出是指当队列的存储空间实际上还有空闲位置时,由于队列的访问限制导致无法插入新的元素,从而表现出“溢出”的假象。在循环队列中,这种情况尤为常见。

循环队列是一种使用数组存储数据元素的线性数据结构,它利用数组的环状特性来处理队列的入队和出队操作。在循环队列中,通常有两个指针front和rear分别指向队列的第一个元素和最后一个元素的下一个位置。队列的空和满的条件是相同的,都是(rear + 1) % queueSize == front,其中queueSize是队列的容量。因此,当队列满时,即使数组中有空间,也会因为队列的规则认为它已经满了,无法再添加新元素,这时如果尝试入队,就会产生假溢出。

解决假溢出的方法

为了避免假溢出,可以在定义循环队列的时候预留一个位置,通常在初始化队列时,将front和rear都设置为0,但在判断队列满的条件中加入一个额外的判断条件,比如rear == front时队列为空,而(rear + 1) % queueSize == front时队列为满。

2.2、链式队列

1、创造队列

Queue_t *create_queue()
{Queue_t *queue = malloc(sizeof(Queue_t));if(queue == NULL){return NULL;}queue->pfront = NULL;queue->prear = NULL;queue->clen =0;pthread_mutex_init(&(queue->mutex),NULL);return queue;
}

2、入队

int push_queue(Queue_t *queue,QDataType data)
{QNode_t *qnode = malloc(sizeof(QNode_t));if(qnode == NULL){perror("malloc fail");return -1;}qnode->data = data;qnode->pnext = NULL;if(is_empty_queue(queue)){queue->prear = qnode;queue->pfront = qnode;}queue->prear->pnext = qnode;queue->prear = qnode;queue->clen++;return 0;
}

3、出队

int pop_queue(Queue_t *queue,QDataType *data)
{if(is_empty_queue(queue)){return 0;}QNode_t *qnode = queue->pfront;queue->pfront = qnode->pnext;if(data != NULL){*data = qnode->data;}free(qnode);if(NULL == queue->pfront){queue->prear = NULL;}queue->clen--;return 0;
}

4、得到队头元素

int get_queue_front(Queue_t *queue,QDataType *data)
{QNode_t *q = queue->pfront;*data = q->data;return 0;
}

5、清空队列

void clear_queue(Queue_t *queue)
{while(!is_empty_queue(queue)){pop_queue(queue,NULL);/*QNode_t *qnode = queue->pfront;queue->pfront = qnode->pnext;free(qnode);queue->clen--;*/}
}

6、销毁队列

    void destory_queue(Queue_t *queue)
{clear_queue(queue);free(queue);
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程新知网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS面试真题 part3

JS面试真题 part3 11、bind、call、apply区别?如何实现一个bind12、JavaScript中执行上下文和执行栈是什么13、说说JavaScript中的事件模型14、解释下什么是事件代理?应用场景?15、说说你对闭包的理解?闭包使用场景 11、bind、cal…

【稀疏矩阵】使用torch.sparse模块

文章目录 稀疏矩阵的格式coocsrcsc Construction of Sparse COO tensorsConstruction of CSR tensorsLinear Algebra operations(稀疏与稠密之间混合运算)Tensor methods and sparse(与稀疏有关的tensor成员函数)coo张量可用的ten…

erlang学习: Mnesia Erlang数据库3

Mnesia数据库删除实现和事务处理 -module(test_mnesia). -include_lib("stdlib/include/qlc.hrl").-record(shop, {item, quantity, cost}). %% API -export([insert/3, select/0, select/1, delete/1, transaction/1,start/0, do_this_once/0]). start() ->mnes…

广州 9月11号,CCNP 350-401考试通过战报

今天上午去考的,早上喝了一杯咖啡,提提神,10点的考试,9点多就到考场了,我第一个先考的,考官说可以提前开机考,服务还挺好,看了我两个证件,核对是本人,填了些信…

微信小程序页面制作——个人信息

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

猫头虎分享:看完百度内部讲话,整理出李彦宏关于大模型的10个判断

🦁 猫头虎分享:看完百度内部讲话,整理出李彦宏关于大模型的10个判断 📢 大家好!我是猫头虎技术团队的首席写作官。今天为大家带来一篇重量级内容:从百度内部讲话中,整理了李彦宏对大模型的10大…

若依系统(Security)增加微信小程序登录(自定义登录)

若依系统(分离版后端)自带的账号验证是基于 UsernamePasswordAuthenticationToken authenticationToken new UsernamePasswordAuthenticationToken(username, password); 验证,然后在系统中controller或service类中 SecurityUtils 工具类中直接可获取用户或用户…

3D技术在电商行业的应用有哪些?

‌3D技术在电商行业的应用广泛且多样化,主要涵盖以下几个方面‌: ‌1、商品展示‌: 通过3D模型进行全方位的展示,支持720旋转和任意缩放,使消费者能够更直观地了解产品的外观、结构和特点。这种展示方式不仅提高了消…

【MATLAB】数据和字符串类型转换

数据和字符串类型转换 在 MATLAB 中,支持不同数据类型与字符串类型之间的转换,这需要使用不同的函数来实现。此外,相同的数据,特别是整数,可以用多种格式表示,例如十进制、二进制或十六进制。在 C 语言中&a…

js react 笔记 2

起因, 目的: 记录一些 js, react, css 1. 生成一个随机的 uuid // 需要先安装 crypto 模块 const { randomUUID } require(crypto);const uuid randomUUID(); console.log(uuid); // 输出类似 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d 2. 使用 props, 传递参数…

玩转西门子 S7-1200/1500 的 Modbus RTU 通信诊断

01 概述工控人加入PLC工业自动化精英社群 Modbus RTU 是一种串行通信协议,由于具有协议透明,实现成本低,简单易用等诸多特点,至今仍然广泛应用在工业控制的各个领域。 为了通信可以长期稳定的运行,并且可以在故障时可…

Redis1

一.Redis 简介 一个神奇的网站 问题现象 海量用户高并发 罪魁祸首——关系型数据库 性能瓶颈:磁盘IO性能低下扩展瓶颈:数据关系复杂,扩展性差,不便于大规模集群 解决思路 降低磁盘IO次数,越低越好 —— 内存存储…

【网络安全】-文件包含漏洞-pikachu

文件操作漏洞包括文件上传漏洞,文件包含漏洞,文件下载漏洞。 文章目录 前言 : 什么是文件包含漏洞? 1.文件包含漏洞的分类: 本地文件包含漏洞: 远程文件包含漏洞: 2.两种文件包含漏洞的区别: 3.…

中国人民银行:数字人民币交易额已达7万亿元!中俄考虑使用国家数字货币进行双边结算!

近年来,数字货币的迅速发展引起了全球的广泛关注。中国人民银行(PBOC)近日透露,数字人民币(e-CNY)的交易额已接近1万亿美元,这标志着中国在数字货币领域的重大进展。同时俄罗斯也表示&#xff0…

Java的时间复杂度和空间复杂度和常见排序

目录 一丶时间复杂度 二丶空间复杂度 三丶Java常见排序 1. 冒泡排序(Bubble Sort) 2.插入排序(Insertion Sort) 3.希尔排序(Shell Sort) 4.选择排序(Selection Sort) 5.堆排序&am…

使用Selenium进行网页自动化

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 Selenium是一个流行的Web自动化测试框架,它支持多种编程语言和浏览器,并提供了丰富的API和工具来模拟用户在浏览器中的行为。Selenium可以通…

B-树底层原理

一、B-树介绍 定义: B-树(B-Tree)是一种自平衡的树形数据结构,广泛应用于数据库和操作系统中。它的设计目标是减少搜索、顺序访问、插入和删除操作中比较次数和移动次数,特别适合于磁盘中数据的存储和检索。 性质&a…

【C++】优先级队列反向迭代器的实现

一、优先级队列: 优先级队列(priority queue)是一种容器适配器, 它默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,…

9.9日记录

1.常见排序算法的复杂度 1.快速排序 1.1快速排序为什么快 从名称上就能看出,快速排序在效率方面应该具有一定的优势。尽管快速排序的平均时间复杂度与“归并排序”和“堆排序”相同,但通常快速排序的效率更高,主要有以下原因。 出现最差情况…

56 - I. 数组中数字出现的次数

comments: true difficulty: 中等 edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9856%20-%20I.%20%E6%95%B0%E7%BB%84%E4%B8%AD%E6%95%B0%E5%AD%97%E5%87%BA%E7%8E%B0%E7%9A%84%E6%AC%A1%E6%95%B0/README.md 面试题 56 - I. 数组中数…