数据结构学习-队列

news2025/1/18 9:04:12

坚持看完,结尾有思维导图总结

这里写目录标题

  • 队列的定义于性质
    • 如何实现
  • 队列的功能
    • 初始化队列
    • 入队列
    • 出队列
    • 队列的销毁
    • 队列取队头数据
    • 队列取队尾数据
    • 判断队列是否为空
    • 判断队列长度
  • 总结

队列的定义于性质

队列是一种数据结构,他储存数据的方式就和排队一样
先进入队列的先出队列
就和我们日常排队一样,后入队列的后出队列

如何实现

如何实现队列,实现队列的基础数据结构是什么?
有两种基础数据结构供我们选择,顺序表和链表
我们这里使用链表,因为出队列是将先入的数据弹出,若放在顺序表中就是顺序表前的数据,弹出需要将后方数据移动到前面,所以我们使用链表

如何用链表实现?
首先我们要先定义链表节点,然后用链表节点构造队列

typedef int STNodeData;

typedef struct STNode {
	STNodeData val;
	struct STNode* next;
}STNode;

typedef STNode STHead;

创建链表节点的函数

STNode* BuyNode(int a)
{
	STNode* newnode = (STNode*)malloc(sizeof(STNode));
	if (newnode == NULL)
	{
		perror("malloc failed");
		exit(-1);
	}
	newnode->val = a;
	newnode->next = NULL;
	return newnode;
}

然后我们定义队列,包含队列的头,队列的尾,和队列的个数
为了方便实现一些功能

typedef struct List {
	STNode* head;
	STNode* tail;
	int num;
}List;

现在我们就完成了队列的基本设计

队列的功能

队列和常见的数据结构一样,有以下功能

初始化队列

初始化队列我们需要做什么?
因为我们的参数只有 head tail 和 num
所以我们只要把这些参数安排还就可以了

void ListInit(List* pl)
{
	pl->head = NULL;
	pl->tail = NULL;
	pl->num = 0;
}

入队列

入队列主要是增加新的节点
那就是区分两个情况
head 和 tail 为空
head 和 tail 不是空

当 head 为空的时候,我们就需要改变头结点,同时尾结点也是空的,因此两个都需要改为新的节点

当 head 不为空,这个时候只要在尾部链接新的节点,然后将尾结点修改即可

void ListPush(List* pl, ListData a)
{
	assert(pl);
	STNode* newnode = BuyNode(a);
	if (pl->head == NULL)
	{
		pl->head = newnode;
		pl->tail = newnode;
	}
	else {
		pl->tail->next = newnode;
		pl->tail = newnode;
	}
	pl->num++;
}

出队列

出队列要实现哪些功能?
首先是没有节点,直接报错,没得商量
其次是当头和尾都指向同一个节点的时候,这个时候弹出要同时修改头尾节点
最后才是头结点离尾结点很远,就释放头结点指向的空间,然后头结点不断向尾结点靠近就可以了

void ListPop(List* pl)
{
   assert(pl);
   assert(pl->head);//如果为空说明不能 pop
   if (pl->head == pl->tail)
   {
   	free(pl->head);
   	pl->head = NULL;
   	pl->tail = NULL;
   }
   else
   {
   	STNode* cur = pl->head;
   	pl->head = pl->head->next;
   	free(cur);
   }
   pl->num--;
}

队列的销毁

队列的销毁,就是通过遍历将所有的节点都释放
和pop类似也要分成两种情况,最终当 pl->head == NULL 的时候停止

void ListDestroy(List* pl)
{
	assert(pl);
	while (pl->head != NULL)
	{
		if (pl->head == pl->tail)
		{
			free(pl->head);
			pl->head = NULL;
			pl->tail = NULL;
		}
		else
		{
			STNode* cur = pl->head;
			pl->head = pl->head->next;
			free(cur);
		}
	}
}

队列取队头数据

队列的数据,直接将head 的数据直接拿出来

STNodeData ListTop(List* pl)
{
	assert(pl);
	assert(pl->head);
	return pl->head->val;
}

队列取队尾数据

和上面相似
判断如果队列非空,就能够将数据取出来

STNodeData ListTail(List* pl)
{
	assert(pl);
	assert(!ListEmpty(pl));

	return pl->tail->val;
}

判断队列是否为空

当 个数为 0 的时候,就说明队列空了

bool ListEmpty(List* pl)
{
	if (pl->num == 0)
		return true;

	return false;
}

判断队列长度

直接将 num 提取出来就可以了

int ListLong(List* pl)
{
	assert(pl);
	return pl->num;
}

总结

在这里插入图片描述

希望大家看完,能够有所收获
如果有错误,请指出我一定虚心改正
动动小手点赞
鼓励我输出更加优质的内容

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

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

相关文章

二十六、Kubernetes中Horizontal Pod Autoscaler(HPA)控制器详解

1、概述 在kubernetes中,有很多类型的pod控制器,每种都有自己的适合的场景,常见的有下面这些: ReplicationController:比较原始的pod控制器,已经被废弃,由ReplicaSet替代 ReplicaSet&#xff…

年终盘点(三)丨2022计讯物联团队不负韶华,奋力前行

光阴荏苒,时光悄然,成长的齿轮不断转动。2022年,计讯人在挑战中创造不凡,2023年,计讯人在希望中迎接新未来。 回首过去,计讯物联团队不断壮大,在奋勇前行中以坚持书写拼搏,在知难而…

记好这24个ES6方法,用于解决实际开发的JS问题

本文主要介绍24中es6方法&#xff0c;这些方法都挺实用的&#xff0c;本本请记好&#xff0c;时不时翻出来看看。 1.如何隐藏所有指定的元素 1 const hide (el) > Array.from(el).forEach(e > (e.style.display none)); 2 3 // 事例:隐藏页面上所有<img>元素? …

echarts——实现 面积图+柱状图+折线图等——基础积累

因为到年底了&#xff0c;很多项目组都开始做年终汇报&#xff0c;年终汇报的展示形式最常见的就是看板。 样式美观&#xff0c;可以放到电视机或者大屏上&#xff0c;通过图表的形式进行展示&#xff0c;简单明了&#xff0c;通俗易懂。 直接上最终效果图&#xff1a;是一个…

【C++】打开C++的大门

目录前言1.什么是C2.C的发展史3.C关键字&#xff08;C98&#xff09;4.命名空间4.1命名冲突4.2命名空间定义4.3命名空间使用5.输入输出6.缺省参数6.1缺省参数的概念6.2缺省参数分类7.函数重载7.1函数重载概念7.2C函数重载的原理——名字修改8.引用8.1引用的概念8.2引用特性8.3常…

ArcGIS基础实验操作100例--实验94计算栅格图层总和值

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 空间分析篇--实验94 计算栅格图层总和值 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;…

【观察】软硬件底层创新“开花结果”,亚马逊云科技的沉淀与释放

2006年&#xff0c;亚马逊云科技推出了Amazon Web Services&#xff0c;正式“开创”出了云计算市场。同年8月&#xff0c;Amazon Elastic Compute Cloud (EC2) 开放了 beta 测试&#xff0c;启动了云上计算的创新和革命。从此&#xff0c;亚马逊云科技在云计算软硬件底层技术创…

软件测试复习03:动态测试——黑盒测试

作者&#xff1a;非妃是公主 专栏&#xff1a;《软件测试》 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录等价划分法边值分析法错误推测法因果图法示例习题等价划分法 等价类&#xff1a;一个几何&#xf…

阿里云 gradle maven配置中心地址

仓库名称阿里云仓库地址阿里云仓库地址(老版)源地址centralhttps://maven.aliyun.com/repository/centralhttps://maven.aliyun.com/nexus/content/repositories/centralhttps://repo1.maven.org/maven2/jcenterhttps://maven.aliyun.com/repository/publichttps://maven.aliyu…

dp(五) 最长公共子串

最长公共子串_牛客题霸_牛客网 描述 给定两个字符串str1和str2,输出两个字符串的最长公共子串 题目保证str1和str2的最长公共子串存在且唯一。 数据范围&#xff1a; 1≤∣str1∣,∣str2∣≤50001≤∣str1∣,∣str2∣≤5000 要求&#xff1a; 空间复杂度 O(n2)O(n2)&#x…

【阶段三】Python机器学习22篇:机器学习项目实战:GBDT分类模型

本篇的思维导图: 项目实战(GBDT分类模型) 项目背景 应用GBDT算法实现多分类模型,目标是实现GBDT多分类项目的全流程。 数据获取 本次建模数据来源于网络,数据项统计如下: 编号  变量名称 <

聚焦:XuperOS成长计划FAQ

1月12日&#xff0c;百度超级链发布XuperOS成长计划&#xff08;&#x1f449;XuperOS 新年致辞&#xff1a;创世、监督、共建、国际&#xff09;。以下是我们整理的关于成长计划的常见问题&#xff0c;为关心XuperOS的广大朋友答疑解惑。问&#xff1a;XuperChain除了发行这四…

662. 二叉树最大宽度

662. 二叉树最大宽度 难度中等530 给你一棵二叉树的根节点 root &#xff0c;返回树的 最大宽度 。 树的 最大宽度 是所有层中最大的 宽度 。 每一层的 宽度 被定义为该层最左和最右的非空节点&#xff08;即&#xff0c;两个端点&#xff09;之间的长度。将这个二叉树视作…

IT信息化推进那么难,为什么,怎么办 ?

IT信息化推进除了管理层的支持外&#xff0c;更重要的是要赢得业务的支持。但往往业务方有时会排斥IT信息化&#xff0c;这里面有很多的原因&#xff0c;比如&#xff1a;不懂业务的想法难沟通&#xff1b;系统不好用、体验不好、问题太多&#xff0c;不想用。换一波IT团队&…

华为双点双向路由引入实验配置

配置接口IP地址&#xff0c;建立相关的路由邻居 然后在AR2上将ISIS引入OSPF&#xff08;isis-ospf&#xff09;&#xff0c;将OSPF引入ISIS&#xff08;ospf-isis&#xff09; 然后在AR4上将ISIS引入OSPF&#xff08;isis-ospf&#xff09;&#xff0c;将OSPF引入ISIS&#x…

【Electron】解决 npm安装出现 self-signed certificate in certificate

问题 按照Electron 官网步骤安装时 npm install electron --save-dev出现报错 error RequestError: self-signed certificate in certificate chain 解决 解决方式1&#xff1a; 优先尝试 git config --global http.sslVerify false npm set strict-ssl false解决方式2&…

【写作能力提升】“5种搭建⽂章架构的⽅法”免费赠送!

“ 【写作能力提升】系列文章&#xff1a; 为什么建议你一定要学会写作? “5 种搭建⽂章架构的⽅法”免费赠送! 写作小白需要避免的五个写作误区和灵魂五问 ”一、前言 Hello&#xff0c;我是小木箱&#xff0c;今天主要分享的内容是: 5 种搭建⽂章架构的⽅法! 大家普遍有一个…

【jQuery】常用API——jQuery元素操作

jQuery元素操作主要是遍历、创建、添加、删除元素操作。一、遍历元素 jQuery 隐式迭代是对同一类元素做了同样的操作。 如果想要给同一类元素做不同操作&#xff0c;就需要用到遍历。 主要用于DOM处理$("div").each(function (index, domEle) { xxx; });each&#xf…

c++11 标准模板(STL)(std::forward_list)(七)

定义于头文件 <forward_list> template< class T, class Allocator std::allocator<T> > class forward_list;(1)(C11 起)namespace pmr { template <class T> using forward_list std::forward_list<T, std::pmr::polymorphic_…

分享57个Python源码,总有一款适合您

Python源码 分享57个Python源码&#xff0c;总有一款适合您 57个Python源码下载链接&#xff1a;https://pan.baidu.com/s/1YZcrJAYFFy3OrdEN5IxnQQ?pwd6666 提取码&#xff1a;6666 采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 下面是文件的名字&#xff0c;我放…