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

数据结构第四课 -----线性表之队列

作者前言

🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂
​🎂 作者介绍: 🎂🎂
🎂 🎉🎉🎉🎉🎉🎉🎉 🎂
🎂作者id:老秦包你会, 🎂
简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂
喜欢学习C语言和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨 🎂🎂🎂🎂🎂🎂🎂🎂
🎂个人主页::小小页面🎂
🎂gitee页面:秦大大🎂
🎂🎂🎂🎂🎂🎂🎂🎂
🎂 一个爱分享的小博主 欢迎小可爱们前来借鉴🎂


队列

  • **作者前言**
  • 队列的定义
  • 队列的设计
    • 队列的结构
    • 初始化
    • 插入(入队)
    • 删除(出队)
    • 队头
    • 队尾
    • 判断队列是否为空
    • 队列的长度
  • 总结

队列的定义

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)
入队列:进行插入操作的一端称为队尾
出队列:进行删除操作的一端称为队头

在这里插入图片描述
就相当于我们现实的排队一样
队列的实现方法:
1.数组队列
在这里插入图片描述
2. 链表队列
双向链表
在这里插入图片描述
两边没有太多规定
单向链表
在这里插入图片描述
下面我就用单链表来演示下

队列的设计

队列的结构

在这里插入图片描述

typedef int QDataType;
typedef struct QueueNode
{QDataType val;struct QueueNode* next;
}QNode;
typedef struct Queue
{QNode* head;QNode* tail;//尾节点和队尾int size;
} Queue;

这里有两个结构体,一个是链表节点的结构体,一个是队列的结构,这样设计可以在计算队列长度时的时间复杂度变成O(1),还要方便传参时不用频繁调用二级指针

初始化

void QueueInit(Queue* pq)
{assert(pq);pq->size = 0;pq->head = NULL;pq->tail = NULL;
}

插入(入队)

//插入
void QueuePush(Queue* pq, QDataType elemest)
{//创建节点QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc");return;}newnode->next = NULL;newnode->val = elemest;if (pq->tail == NULL){pq->head = newnode;pq->tail = newnode;}else{pq->tail->next = newnode;pq->tail = newnode;}pq->size++;
}

我们这里是没有使用哨兵位,所以要判断head为空的情况下

删除(出队)

//删除
void QueuePop(Queue* pq)
{assert(pq);assert(pq->head);if (pq->head == pq->tail){free(pq->head);pq->tail = NULL;pq->head = NULL;}else{QNode* node = pq->head;pq->head = pq->head->next;free(node);}pq->size--;}

使用这种思路我们要注意head不能为空,还有就是只有一个节点的时候
在这里插入图片描述
一旦freel(head),tail就成了野指针了

队头

//队头
QDataType QueueFront(Queue* pq)
{assert(pq);assert(pq->head);return pq->head->val;
}

队尾

//队尾
QDataType QueueBack(Queue* pq)
{assert(pq);assert(pq->head);return pq->tail->val;
}

判断队列是否为空

//是否为空
bool QueueEmtry(Queue* pq)
{assert(pq);return pq->size == 0;
}

队列的长度

//长度
int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}

总结

队列的大概简单的设计,如果想要设计数组队列可以去尝试一下

http://www.lryc.cn/news/231719.html

相关文章:

  • 蓝桥杯 第 3 场算法双周赛4,7题
  • 西安有哪些比较好的设计院?西安名企设计院介绍!
  • Java获取Jar、War包路径,并生成可编辑修改的本地配置文件
  • FPGA UDP RGMII 千兆以太网(4)ARP ICMP UDP
  • 【视觉SLAM十四讲学习笔记】第二讲——初识SLAM
  • Python交易-通过Financial Modeling Prep (FMP)选择行业
  • AI创作系统ChatGPT网站源码+详细搭建部署教程+支持DALL-E3文生图/支持最新GPT-4-Turbo-With-Vision-128K多模态模型
  • 快速生成力扣链表题的链表,实现快速调试
  • threejs(13)-着色器设置点材质
  • 计算机网络专栏 学习导航or使用说明
  • git clone:SSL: no alternative certificate subject name matches target host name
  • 代码随想录图论|130. 被围绕的区域 417太平洋大西洋水流问题
  • Outlook无法显示阅读窗格
  • tensorflow 1.15 gpu docker环境搭建;Nvidia Docker容器基于TensorFlow1.15测试GPU;——全流程应用指南
  • 一个22届被裁前端思想上得转变
  • Python开源项目GPEN——人脸重建(Face Restoration),模糊清晰、划痕修复及黑白上色的实践
  • Android studio2022.3项目中,底部导航菜单数多于3个时,只有当前菜单显示文本,其他非选中菜单不显示文本
  • 使用 Redis 构建轻量的向量数据库应用:图片搜索引擎(二)
  • Java-贪吃蛇游戏
  • Python---数据序列类型之间的相互转换
  • gitlab 12.7恢复
  • 将ECharts图表插入到Word文档中
  • BI 数据可视化平台建设(2)—筛选器组件升级实践
  • RabbitMQ 安装及配置
  • PHP写一个电商 Api接口需要注意哪些?考虑哪些?
  • 微服务概览
  • 本地新建vs工程运行c++17std::varant
  • GPON、XG(S)-PON基础
  • CSS实现图片滑动对比
  • 苹果电脑录屏快捷键,让你成为录屏达人