数据结构:链式队列

1.设计思想:

我们可以设计出以上五种队列,但是基于时间复杂度,和空间复杂度的最优解,我们选择入队和出队均为O(1)的,也就是第五种

2.结构设计

typedef struct LPNode//数据节点
{int data;//数据struct LPNode* next;//后继指针
}LPNode;
typedef struct HNode//链式队列头节点
{    struct LPNode *front;//队头指针struct LPNode *rear;//队尾指针
}HNOde,*PLQueue;

3.链式队列的实现

//初始化
void InitQueue(PLQueue pq)
{assert(pq != NULL);if (pq == NULL)return;pq->front = NULL;pq->rear = NULL;
}//往队列中入数据(入队操作)
bool Push(PLQueue pq, int val)
{assert(pq != NULL);if (pq == NULL)return false;LPNode* p = (LPNode*)malloc(sizeof(LPNode));assert(p != NULL);给p数据//p->data = val;//插入p(处理尾节点)//p->next = pq->front;//pq->front = p;处理队头节点//if (pq->rear == NULL)//{//	pq->rear = p;//}//return true;p->data = val;p->next = NULL;if (IsEmpty(pq)){pq->front = p;pq->rear = p;}else{pq->rear->next = p;//p插入队尾pq->rear = p;}return true;}//获取队头元素的值,但不删除
bool GetTop(PLQueue pq, int* rtval)
{assert(pq != NULL);if (pq == NULL)return false;if (IsEmpty(pq))return false;*rtval = pq->front->data;return true;
}//获取队头元素的值,并且删除
bool  Pop(PLQueue pq, int* rtval)
{assert(pq != NULL);if (pq == NULL)return false;if (IsEmpty(pq))return false;*rtval = pq->front->data;LPNode* p = pq->front;pq->front = pq->front->next;free(p);if (pq->front == NULL)pq->rear = NULL;return true;
}//判空
bool IsEmpty(PLQueue  pq)
{assert(pq != NULL);if (pq == NULL)return false;return pq->front == NULL;
}//获取队列中有效数据的个数
int GetLength(PLQueue pq)
{assert(pq != NULL);if (pq == NULL)return -1;int count = 0;for (LPNode* p = pq->front;p!=NULL; p = p->next){count++;/*if (p == pq->rear)break;*/}return count;
}//清空所有的数据
void Clear(PLQueue  pq)
{assert(pq != NULL);if (pq == NULL)return;pq->front = NULL;pq->rear = NULL;
}//销毁
void Destroy(PLQueue  pq)
{assert(pq != NULL);if (pq == NULL)return;LPNode* p = pq->front;free(p);p = p->next;
}void Show(PLQueue pq)
{assert(pq != NULL);if (pq == NULL)return;for (LPNode* p = pq->front;p!=NULL; p = p->next){printf("%d ", p->data);/*if (p == pq->rear)break;*/}printf("\n");
}

4.总结

1.带头结点,队头为第一个数据节点,队尾在最后一个数据节点

2.头结点为一个队头指针,一个队尾指针,增加队尾指针可以让入队时间复杂度为O(1) 

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

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

相关文章

Redis消息队列与thinkphp/queue操作

业务场景 场景一 用户完成注册后需要发送欢迎注册的问候邮件、同时后台要发送实时消息给用户对应的业务员有新的客户注册、最后将用户的注册数据通过接口推送到一个营销用的第三方平台。 遇到两个问题: 由于代码是串行方式,流程大致为:开…

基于STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块的捕获模式(外部中断)应用

基于STC12C5A60S2系列1T 8051单片机可编程计数阵列CCP/PCA/PWM模块的捕获模式(外部中断)应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍STC12C5A60S2系列1T 805…

【Langchain-Chatchat】部署ChatGLM3-6B-32K教程

介绍 Langchain-Chatchat这个框架可以帮助我们更容易的部署大语言模型,之前也写过ChatGLM传统的部署教程,有兴趣的可以参考 【ChatGLM3】第三代大语言模型多GPU部署指南【ChatGLM2-6B】从0到1部署GPU版本 借助Langchain-Chatchat框架,可以…

32串口学习

基于之前的GPIO等工程,后面的上手难度就简单多了,主要是相关寄存器的设置。 void USART1_Config(void) {GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;/* config USART1 clock */RCC_APB2PeriphClockCmd(RCC_APB2Periph…

计算机网络:信道复用技术概念解析

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

数据结构从入门到精通——希尔排序

希尔排序 前言一、希尔排序( 缩小增量排序 )二、希尔排序的特性总结三、希尔排序动画演示四、希尔排序具体代码实现test.c 前言 希尔排序是一种基于插入排序的算法,通过比较相距一定间隔的元素来工作,各趟比较所用的距离随着算法的进行而减小&#xff0…

【前端】Web API

1.Web API 简介 JS分为三大部分: ESCMScript:基础语法部分DOM API:操作页面结构BOM API:操作浏览器 Web API包含 DOM BOM 2.DOM基本概念 DOM全称 Document Object Mod…

最短路算法

数据结构、算法总述:数据结构/算法 C/C-CSDN博客 目录 朴素dijkstra算法 堆优化版dijkstra算法 Bellman-Ford算法 spfa 算法(队列优化的Bellman-Ford算法) spfa判断图中是否存在负环 floyd算法 朴素dijkstra算法 思路: 集合…

Linux相关命令(2)

1、W :主要是查看当前登录的用户 在上面这个截图里面呢, 第一列 user ,代表登录的用户, 第二列, tty 代表用户登录的终端号,因为在 linux 中并不是只有一个终端的, pts/2 代表是图形界面的第…

长三角科技盛会“2024南京国际人工智能,机器人,自动驾驶展览会”

2024南京国际人工智能,机器人,自动驾驶展览会 2024 Nanjing International Ai, Robotics, Autonomous Driving Expo 时间:2024年11月22-24日 地点:南京国际博览中心 南京,这座历史悠久的文化名城,如今正站在新一轮科技产业变革的前沿,以人工…

院子摄像头的监控

院子摄像头的监控和禁止区域入侵检测相比,多了2个功能:1)如果检测到有人入侵,则把截图保存起来,2)如果检测到有人入侵,则向数据库插入一条事件数据。 打开checkingfence.py,添加如下…

Springboot笔记-03

1.properties配置文件 #配制oerson的值 person.lastname张三 person.age12 person.birth2017/12/12 person.bossfalse person.dog.namedag person.dog.age15 person.maps.k1v1 person.maps.k212 person.listsa,b,c运行结果乱码 因为idea默认是utf-8编码而properties是ascall编…

Bytebase 2.14.1 - 分支 (Branching) 功能支持 Oracle

🚀 新功能 分支 (Branching) 功能支持 Oracle。为 SQL 编辑器添加了项目选择器。 新增 SQL 审核规范: 禁止混合 DDL、DML 语句。禁止对同一张表进行不同类型的 DML 变更 (UPDATE,INSERT,DELETE)。 🔔 重大变更 工作空间设置中的「数据访问…

大屏可视化综合展示解决方案

1.系统概述 1.1.需求分析 1.2.重难点分析 1.3.重难点解决措施 2.系统架构设计 2.1.系统架构图 2.2.关键技术 2.3.接口及要求 3.系统功能设计 3.1.功能清单列表 3.2.数据源管理 3.3.数据集管理 3.4.视图管理 3.5.仪表盘管理 3.6.移动端设计 3.1.系统权限设计 3.…

利用Scala与Apache HttpClient实现网络音频流的抓取

概述 在当今数字化时代,网络数据的抓取和处理已成为许多应用程序和服务的重要组成部分。本文将介绍如何利用Scala编程语言结合Apache HttpClient工具库实现网络音频流的抓取。通过本文,读者将学习如何利用强大的Scala语言和Apache HttpClient库来抓取网…

Python代码实现Excel表格转HTML文件

Excel工作簿是常用的表格格式,广泛用于组织、分析及展示数据。Excel文件通常需要专门的文档阅览器进行查看。如果我们想要以更兼容的方式展示Excel表格,可以将其转换为HTML格式,使其能够在各种浏览器中直接进行查看。同时,将Excel…

【小白入门篇1】GPT到底是怎样练成?

由于具有代表性的OpenAI公司GPT模型并没有开源,所以本章节是参考一些开源和现有课程(李宏毅)讲解ChatGPT原理。本章没有涉及到很多数学运算,比较适合小白了解GPT到底是怎么练成。GPT的三个英文字母分别代表Generative(生成式)&…

Git 分布式版本控制系统基本概念和操作命令

目录 Git 基本概念 功能特点 工作流程 操作命令 新建代码库 配置 增删文件 代码提交 分支 标签 查看信息 远程同步 撤销 其他 小结 Git Git 是一个开源的分布式版本控制系统,用于跟踪文件的变更历史。它最初由 Linux Torvalds 设计,用于…

php闭包应用

laravel 路由 bingTo 把路由URL映射到匿名回调函数上&#xff0c;框架会把匿名回调函数绑定到应用对象上&#xff0c;这样在匿名函数中就可以使用$this关键字引用重要的应用对象。Illuminate\Support\Traits\Macroable的__call方法。 自己写一个简单的demo: <?php <?…

Docker-Image

Docker Docker 镜像是什么为什么需要镜像镜像命令总览docker imagesdocker tagdocker pulldocker pushdocker rmidocker savedocker loaddocker image inspectdocker historydocker importdocker image prunedocker build Docker 镜像是什么 Docker image 本质上是一个 read-on…