数据结构:链式队列

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…

【leetcode】动态规划专题

70.爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n 2 输出:2 解释:有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示…

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

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

什么是递归函数?列出一个递归函数的例子

一、什么是递归函数?列出一个递归函数的例子 递归函数是一种直接或间接调用自身的函数。在函数体内部,递归函数会调用自身来处理更小的数据子集,直到达到一个基准情况(base case),此时函数将停止递归并返回…

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…

14个前端常见算法(5颗星)

1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。 示例 1:…

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

希尔排序 前言一、希尔排序( 缩小增量排序 )二、希尔排序的特性总结三、希尔排序动画演示四、希尔排序具体代码实现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算法 思路: 集合…

React简介

React简介 开发网页:引入react和react-native库。 开发手机端应用:引入react和react-dom库。 特点: 虚拟Dom(开发者》react》虚拟Dom》Dom); 声明式(结果为导向的编程,自动生成代码…

Linux相关命令(2)

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

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

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

uni app 空挡接龙

pc游戏 空挡接龙 还不完整。现在没时间搞了记录在这里&#xff0c;等以后有时间了再继续搞。 <template><view class"page_main"><view class"contentone"><canvas class"canvas_cla" style"z-index: 1;" canva…

【C++】每日一题 452 用最少数量的箭引爆气球

有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出一…

院子摄像头的监控

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

嵌入式学习-ARM-Day4

嵌入式学习-ARM-Day4 实现三个LED灯亮灭 .text .global _start _start: 使能GPIOE的外设时钟 RCC_MP_AHB4ENSETR的第[4]设置为1即可使能GPIOE时钟 LED1 LDR R0,0X50000A28 指定寄存器地址 LDR R1,[R0] 将寄存器原来的数值读取出来&#xff0c;保存到R1中 ORR R1,R1,#(0x…

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

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