【数据结构】解析队列各接口功能实现

news2025/1/16 15:39:50

目录

前言:

一、队列概述:

1.队列的概念:

二、队列的各种接口功能实现:

1.初始化队列:

2.入队(尾插):

3.出队(头删):

4.查看队头:

5.查看队尾

6.查看队列大小:

7.判断队列是否为空:

8.队列的销毁:

总结:

前言:

        在上一章中我们使用数组实现了数组栈各接口功能的实现,对各接口的原理和工作方式有了一定了解,而今天,在这节课我们将使用链表来实现队列的相关接口功能。现在我们进入今天的学习。

一、队列概述:

1.队列的概念:

        队列是一种特殊的线性表,它允许在表的的前端进行删除,而在表后端进行插入操作,也就是先进先出。它和栈一样,队列也是一种操作说限制的线性表。进行插入操作的一端称之为队尾,进行删除操作的端称之为对头。

队列的元素又叫队列元素。在队列中插入一个队列元素称之为入队,从队列中删除一个队列元素称之为出队。

二、队列的各种接口功能实现:

        队列的实现也可以用数组,但是我们一般通过链表来实现,因为链表实现会更好。

1.初始化队列:

①.执行操作之前需要进行非空判断,防止对空指针进行操作。

②.判断非空之后,只需要将头指针与尾指针置空,和size赋值0就可了。

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

}

2.入队(尾插):

①.执行操作之前需要进行非空判断,防止对空指针进行操作。

②.判断非空之后,申请新节点,并向新节点中存入数据,存入之后进行插入。

③.节点插入时需分两种情况进行讨论,一种是在队列为空时,及内部无有效数据,此时只需要让头指针与尾指针都指向新节点即可,是新节点成为队列中唯一有效数据。另外一种就是当队列中有有效数据时,此时首先时原本为尾节点的next指向新节点,再更新尾节点就可以了。

void QueuePush(Queue* pq,QDatatype x)
{
	assert(pq);

	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	newnode->data = x;
	newnode->next = NULL;
	if (pq->head == NULL && pq->tail == NULL)
	{
		pq->head = pq->tail = newnode;
	}
	else
	{
		pq->tail->next = newnode;
		pq->tail = pq->tail->next;
	}
	pq->size++;
}

3.出队(头删):

①.执行操作之前需要进行非空判断,防止对空指针进行操作。

②.再出队之前应需要对队列内容量进行判断,方队没有有效数据的空队列进行错误操作。

③.满足条件之后,使第二节点成为第一节点,再释放第一节点,同时注意对操作后将队列删空的情况进行区别处理。

void QueuePop(Queue* pq)
{
	assert(pq);
	assert(pq->head != NULL);

	if (pq->head->next == NULL)
	{
		free(pq->head);
		pq->head = pq->tail = NULL;
	}
	else
	{
		QNode* next = pq->head->next;
		free(pq->head);
		pq->head = next;
	}

	pq->size--;

}

4.查看队头:

①.执行操作之前需要进行非空判断,防止对空指针进行操作。

QDatatype QueueFront(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));


	return pq->head->data;
}

5.查看队尾

①.执行操作之前需要进行非空判断,防止对空指针进行操作。

QDatatype QueueBack(Queue* pq)
{
	assert(pq);
	assert(QueueEmpty(pq));

	return pq->tail->data;
}

6.查看队列大小:

①.执行操作之前需要进行非空判断,防止对空指针进行操作。

int QueueSize(Queue* pq)
{
	assert(pq);

	return pq->size;
}

7.判断队列是否为空:

①.执行操作之前需要进行非空判断,防止对空指针进行操作。

int QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->size == 0;
}

这里也可以直接返回队列是否为空的判断结果:
 

bool QEmpty(Q* pq)
{
    assert(qp);
    return qp->head==NULL;
}

8.队列的销毁:

①.执行操作之前需要进行非空判断,防止对空指针进行操作。

②.从头结点开始,遍历释放所有节点,最后再将头指针和尾指针进行置空。

void QueueDestroy(Queue* pq)
{
	assert(pq);
	QNode* cur = pq->head;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	pq->head = pq->tail = NULL;
	pq->size = 0;
}

总结:

        到此我们关于队列的各接口功能实现就全部结束了,本文中我是通过链表来实现队列的,大家感兴趣也可用数组自己实现一下。

文章仍有许多不足,欢迎大家私信交流。

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

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

相关文章

Zookeeper安装(Win和Linux)

Zookeeper安装 Zookeeper单机安装(Windows) 下载地址:Apache ZooKeeper 1.1 下载安装 下载好的文件进行解压缩得到apache-zookeeper-3.8.0-bin目录,创建zkdata及log目录,后续作为数据存放目录 1.2 配置启动 我们…

易点易动设备管理系统高效管理海量备品备件

纸质设备备品备件管理是企业运营中的重要环节,其管理效率和精度直接关系到企业的生产效率和经济效益。然而,传统的纸质管理方式存在诸多问题,如信息不透明、数据难以更新、易丢失等。为解决这些问题,易点易动设备管理系统应运而生…

webpack 之 Loader开发(一)

1. You may need an additional loader to handle the result of these loaders.(我们可能还需要一个额外的加载器来处理当前加载器的结果) 2. Loader可能经过一层层链路、又或者只有一层,最终的处理都是转化成 js,(L…

【LeetCode: 139. 单词拆分 | 暴力递归=>记忆化搜索=>动态规划】

🍎作者简介:硕风和炜,CSDN-Java领域新星创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎 🍎座右…

Ae:灯光选项

灯光选项 Light Options,用于调整光源的特性以及所产生的投影的相关设置。下面以属性最多的聚光灯的灯光选项为例进行说明。强度 Intensity光源的亮度。数值越大,光照越大。负值可产生吸光效果,即降低场景中其它光源的光照强度。颜色 Color默…

KNN、SVM、MLP、K-means分类实验

来源:投稿 作者:摩卡 编辑:学姐 数据集简介 实验使用了两个数据集,一个是经典的鸢尾花数据集(iris)另一个是树叶数据集(leaf) 鸢尾花数据集(iris): 鸢尾花数据集发布于1988年7月1日,该数据集共有150条数…

客快物流大数据项目(一百一十二):初识Spring Cloud

文章目录 初识Spring Cloud 一、Spring Cloud简介 二、SpringCloud 基础架构图

使用cocopod就那么容易

第一节、配置coopod 打开终端替换ruby镜像源,系统自带的镜像源(gem sources --remove https://rubygems.org/)被墙挡住了或者(https://ruby.taobao.org/)已过期。需替换成新的镜像源。 1).先查看已有的镜像是否是:ht…

Spring Security --- 快速入门

概念 Spring Security是一个功能强大且高度可定制的,主要负责为Java程序提供声明式的 身份验证和访问控制 的安全框架Spring Security的底层主要是 基于 Spring AOP 和 Servlet 过滤器 来实现安全控制它提供了全面的安全解决方案同时授权粒度可以在 Web请求级和方法…

GPT-4 介绍

1 简介 本文根据openAI的2023年3月的《GPT-4 Technical Report 》翻译总结的。 原文地址:https://arxiv.org/pdf/2303.08774.pdf 原文确实没有GPT-4 具体的模型结构,openAI向盈利组织、非公开方向发展了。也没透露硬件、训练成本、训练数据、训练方法等…

攻防世界-web-easyupload

题目描述:一名合格的黑客眼中,所有的上传点都是开发者留下的后门 很简单的一个上传图片的界面。 我们先正常上传一个图片,从提示信息中可以看出我们是上传到了uploads目录下 然后通过bupsuite抓包修改请求,将文件名修改为1.php&a…

spark第七章:SparkStreaming实例

系列文章目录 系列文章目录 spark第一章:环境安装 spark第二章:sparkcore实例 spark第三章:工程化代码 spark第四章:SparkSQL基本操作 spark第五章:SparkSQL实例 spark第六章:SparkStreaming基本操作 spa…

HTML标签结构1.1(标题标签、文本格式化标签)

1&#xff0c;标签结构图&#xff1a; <!-- 加粗标签 双标签 --><strong>文字变粗</strong> <!-- 换行 单标签--><br><!-- 水平分割线 单标签--><hr> HTML标签与标签之间的关系&#xff1a; ①父子关系&#xff08;嵌套关系&…

开源代码只是心里安慰,开源软件如何选择?

大家好&#xff0c;欢迎来到停止重构的频道。 本期我们聊一个比较开放的话题&#xff0c;也是项目中经常遇到的问题。 在实际项目当中&#xff0c;由于开发成本、上线周期等因素&#xff0c;不可避免地需要使用开源软件。 开源软件意味着源码公开。 但是&#xff0c;使用开…

[零刻]EQ12EQ12Pro安装软路由教程

OpenWRT系统安装 安装前准备 1.U盘一个 2.WePE写盘工具 3.Openwrt固件 4.Img镜像写盘工具 安装步骤&#xff1a; 1.首先下载WePE写盘工具&#xff0c;制作一个PE系统安装环境&#xff0c;启动软件后&#xff0c;选择安装PE到U盘 2.插入U盘后&#xff0c;刷新一下设备&#x…

【多微电网】计及碳排放的基于交替方向乘子法(ADMM)的多微网电能交互分布式运行策略研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Vue2 API-源码解析

目录 Vue.extend(option) delimiters functional Vue.component(id, Function | Object) Vue.directive( id, [definition] ) Vue.filter( id, function) Vue.nextTick() Vue.set() Vue.delete(target, index/key) Vue.compile(template) Vue.observable(object) …

相机的内参和外参介绍

注&#xff1a;以下相机内参与外参介绍除来自网络整理外全部来自于《视觉SLAM十四讲从理论到实践 第2版》中的第5讲&#xff1a;相机与图像&#xff0c;为了方便查看&#xff0c;我将每节合并到了一幅图像中 相机与摄像机区别&#xff1a;相机着重于拍摄静态图像&#x…

智安网络|Ddos攻击原理和防范方法,你值得拥有

这几年网络越来越容易崩溃&#xff0c;今天不是这个网站崩&#xff0c;就是那个网站进不去&#xff0c;去年各个省份的健康码也接连崩溃&#xff0c;大家在寒风冷冽的冬天排队几小时做核酸&#xff0c;为什么现在的APP、网页都那么容易崩&#xff1f;还是同样的理由&#xff0c…

[Java·算法·困难]LeetCode10. 正则表达式匹配

每天一题&#xff0c;防止痴呆题目示例分析思路1题解1&#x1f449;️ 力扣原文 题目 给你一个字符串 s 和一个字符规律 p&#xff0c;请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符 * 匹配零个或多个前面的那一个元素 所谓匹配&#xff0c;是要涵盖 整…