当前位置: 首页 > news >正文

队列-数据结构

一、队列 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);
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • django学习入门系列之第十点《A 案例: 员工管理系统5》
  • 嵌入式音视频开发:探索多领域的融合与创新
  • 跟李沐学AI:长短期记忆网络LSTM
  • 个人用户如何有效利用固态硬盘数据恢复工具
  • 开源Devops工具-Ansible
  • 【Python】05.Python 中的列表与元组
  • Oracle(120)如何创建和管理备份策略?
  • Flutter 中的低功耗蓝牙概述
  • 【C#生态园】从正则表达式到Excel操作:全面解析这六款C#库的核心功能和应用
  • NISP 一级 | 3.4 无线局域网安全防护
  • 使用C++11的`std::future`和`std::promise`实现异步网络通信
  • 14_L3缓存友好的数据结构
  • windows服务管理插件 nssm
  • StackTrace在.Net中获取当前线程的堆栈跟踪信息
  • 深入探索Go语言中的函数:匿名函数、指针参数与函数返回
  • python3.6+scrapy+mysql 爬虫实战
  • 0基础学习移动端适配
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • exports和module.exports
  • jquery cookie
  • JSONP原理
  • Laravel 实践之路: 数据库迁移与数据填充
  • php中curl和soap方式请求服务超时问题
  • Python实现BT种子转化为磁力链接【实战】
  • redis学习笔记(三):列表、集合、有序集合
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • 动态魔术使用DBMS_SQL
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 基于组件的设计工作流与界面抽象
  • 前言-如何学习区块链
  • 如何选择开源的机器学习框架?
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 如何用纯 CSS 创作一个货车 loader
  • # 数仓建模:如何构建主题宽表模型?
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #14vue3生成表单并跳转到外部地址的方式
  • #微信小程序:微信小程序常见的配置传旨
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (SpringBoot)第二章:Spring创建和使用
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (黑马点评)二、短信登录功能实现
  • (算法)硬币问题
  • (一)、python程序--模拟电脑鼠走迷宫
  • (一)Linux+Windows下安装ffmpeg
  • (转)ABI是什么
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .Net Core和.Net Standard直观理解