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

目录

前言:

一、队列概述:

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;
}

总结:

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PyTorch 深度学习实战 | 基于 ResNet 的花卉图片分类

“工欲善其事,必先利其器”。如果直接使用 Python 完成模型的构建、导出等工作,势必会耗费相当多的时间,而且大部分工作都是深度学习中共同拥有的部分,即重复工作。所以本案例为了快速实现效果,就直接使用将这些共有部…

YAML /Excel /CSV?自动化测试测试数据管理应用,测试老鸟总结...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 自动化测试无论是…

ChatGPT实战100例 - (02) 自动出PPT它不香么?

文章目录 ChatGPT实战100例 - (02) 自动出PPT它不香么?一、需求与思路1. 需求:出个PPT,5分钟后要用2. 思路:生成markdown然后转化 二、生成markdown语法的思维导图1. 问题2. 回答 三、把markdown文本转换成PPT ChatGPT实战100例 -…

MIMO-OFDM无线通信技术(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 本代码为MIMO-OFDM无线通信技术及MATLAB实现。分为十章,供大家学习。 📚2 运行结果 主函数部分代码&a…

Mysql安装详细教程

数据库相关概念 而目前主流的关系型数据库管理系统的市场占有率排名如下: Oracle:大型的收费数据库,Oracle公司产品,价格昂贵。 MySQL:开源免费的中小型数据库,后来Sun公司收购了MySQL,而Oracle…

逆向-还原代码之(*point)[4]和char *point[4] (Interl 64)

// source code #include <stdio.h> #include <string.h> #include <stdlib.h> /* * char (*point)[4] // 数组指针。 a[3][4] // 先申明二维数组,用它来指向这个二维数组 * char *point[4] // 指针数组。 a[4][5] // 一连串的指针…

知识点学习登记备份信息

知识点记录 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8ovilnIi-1681441105895)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20211228090433836.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上…

全景丨0基础学习VR全景制作,平台篇第五章:开场封面功能

大家好欢迎观看蛙色平台使用教程 开场封面功能&#xff0c;现已支持开场图片和开场视频两种呈现方式&#xff0c; 分别针对PC端和移动设备访问分别设置呈现图片、视频内容&#xff0c;满足市场主流需求。 开场图片 传达主旨 1、全局-开场封面-图片 2、分别对PC端和移动设备访…

【加载plist文件展示单组数据 Objective-C语言】

一、接下来,我们要为大家演示如何通过加载plist文件,使用UITableView展示单组数据, 1.最后运行起来的效果,是一个什么效果呢,是这样一个效果: 2.这个里面,这就是一个单元格吧, 这就是一个单元格, 这个单元格里面,包括一个图片框、一个TextLabel、一个DetailLabel、…

[CVPR 2020] Regularizing Class-Wise Predictions via Self-Knowledge Distillation

Contents IntroductionClass-wise self-knowledge distillation (CS-KD)Class-wise regularizationEffects of class-wise regularization ExperimentsClassification accuracy References Introduction 为了缓解模型过拟合&#xff0c;作者提出 Class-wise self-knowledge di…

3.rabbitmq-集群

1.修改3台的主机名称,也可以不改 vi /etc/hostname 2.配置各个节点的host文件,让各节点都能识别对方 vi /etc/hosts 192.168.3.132 host-rabbitmq 192.168.3.133 host-rabbitmq2 192.168.3.134 host-rabbitmq3 3.以确保各个节点的cookie文件使用的同一个值 在node1上执行远程命…

PostgreSQL技术内幕(七)索引扫描

索引概述 数据库索引&#xff0c;是将一个表的某些字段的数据进行重新组织的数据库对象。通过使用索引&#xff0c;可以大大加速数据库的一些操作&#xff0c;其背后的思想也很简单朴素&#xff1a;空间换时间。 数据库中的索引&#xff0c;可以类比为一本书的目录&#xff0…

远程代码执行渗透与防御

远程代码执行渗透与防御 1.简介2.PHP RCE常见函数3.靶场练习4.防御姿势 1.简介 远程代码执行漏洞又叫命令注入漏洞 命令注入是一种攻击&#xff0c;其目标是通过易受攻击的应用程序在主机操作系统上执行任意命令。 当应用程序将不安全的用户提供的数据&#xff08;表单、cook…

如何在Java中创建临时文件?

在Java程序中&#xff0c;有时需要创建临时文件来暂存数据或者执行某些操作。Java提供了许多方式来创建临时文件。在本教程中&#xff0c;我们将介绍如何使用Java标准库来创建临时文件。 一、使用File.createTempFile()方法 Java标准库中的File类提供了createTempFile()方法来…

条款08: 别让异常逃离析构函数

文章目录 背景知识析构函数 背景知识 下面是一段测试代码&#xff1a; class Test { public:Test(int para){m_num para;};void test_throw(){throw(3);};~Test() {cout<<"delete Test"<<m_num<<endl;//test_throw();};int m_num; }; int main(…

无线耳机哪个音质比较好?四百内音质最好的无线耳机排行

蓝牙耳机常常作为手机的伴生产品而出现在人们的日常生活当中&#xff0c;其使用场景也越来越广泛。而随着蓝牙技术的发展&#xff0c;蓝牙耳机在音质上的表现也越来越好。下面&#xff0c;我来给大家推荐几款四百内音质最好的无线耳机&#xff0c;一起来看看吧。 一、南卡小音舱…

Java多线程基础面试总结(三)

线程的生命周期和状态 Java 线程在运行的生命周期中的指定时刻只可能处于下面 6 种不同状态的其中一个状态&#xff1a; NEW&#xff1a;初始状态&#xff0c;线程被创建出来&#xff0c;但是还没有调用start()方法。RUNABLE&#xff1a;运行中状态&#xff0c;调用了start()…

什么是 AUTOSAR C++14?

总目录链接>> AutoSAR入门和实战系列总目录 总目录链接>> AutoSAR BSW高阶配置系列总目录 文章目录 什么是 AUTOSAR C14&#xff1f;AUTOSAR C14 规则和偏差静态分析工具可以完全支持自动 什么是 AUTOSAR C14&#xff1f; 它是 C 版本 14 (ISO/IEC 14882:2014…

layui框架学习(23:代码文本修饰模块)

Layui中的代码文本修饰模块layui.code主要用于修饰代码区域或文本行&#xff0c;其基本用法是使用预设类layui-code标识包含代码或文本的元素&#xff0c;然后调用layui.code函数渲染样式。Layui官网教程及示例中主要使用pre元素包含带修饰的代码或文本&#xff08;pre元素可定…

Qt在安卓手机输出‘hello,world‘

我也想实现这样的功能。 最开始的参考文章&#xff1a; (2条消息) Qt android 开发环境搭建_逝水流年丶轻染尘的博客-CSDN博客 方案1&#xff1a;(失败) 我之前已经下载过 Qt5.14.2了&#xff0c;所以我想直接添加组件 中间过程参考&#xff1a; (2条消息) Qt更新组件出现&…