数据结构之队列

news2025/1/12 7:08:36

文章目录


前言

今天学习数据结构中另一种特殊的线性表——队列。
我们平时在医院、银行等地方办理业务时,先排队在抽号机进行抽号,服务窗口会根据号码的顺序叫号,再为我们进行业务办理。
其中抽号机的工作原理就类似于是队列,先进入的数据先出(先抽号的人先服务),遵循了先来后到,确保了公平性。
在这里插入图片描述

一、队列

只允许在一端进行插入数据的操作,在另一端进行删除数据的操作的特殊线性表。
队列中的元素遵循先进先出(FIFO)的原则。

对队列的操作:
1.入队列:在插入数据的一端插入数据(队尾);
2.出队列:在删除队列的一端删除数据(队头)。

二、队列应该如何实现

顺序表or链表

队列也可以数组和链表的结构实现,使用链表的结构实现更优一些。因为如果使用数组的结构,出队列在数组上进行头删数据,效率会比较低。

扩展了解

实际中我们有时还会使用一种队列叫循环队列。如操作系统中的生产者消费者模型就会使用循环队列。环形队列可以使用数组实现,也可以使用循环链表实现。
在这里插入图片描述

三、队列的实现

1.队列的声明

typedef int QueueNodeType;
typedef struct QueueNode//队列节点
{
	QueueNodeType node;//存储数据的节点
	struct QueueNode* next;//指向下一个节点
}QueueNode;
typedef struct Queue//队列
{
	QueueNode* head;//指向头结点
	QueueNode* tail;//指向尾节点
	int size;//队列中的元素个数
}Queue;

2.接口(声明)

//队列的初始化
void QueueInit(Queue* ps);
//出队
void QueuePop(Queue* ps);
//入队
void QueuePush(Queue* ps, QueueNodeType x);
//销毁队列
void QueueDistory(Queue* ps);
//队头元素
QueueNodeType QueueFront(Queue* ps);
//判断队列为空(空就返回1,非空就返回0)
bool QueueEmpty(Queue* ps);

3.接口的实现

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

创建一个新的节点

QueueNode* QueueBuyNode(QueueNodeType x)
{
	QueueNode* t = (QueueNode*)malloc(sizeof(QueueNode));
	if (t == NULL)
	{
		perror("malloc fail");
	}
	t->node = x;
	t->next = NULL;
	return t;
}

判断队列为空

(空就返回1,非空就返回0)

bool QueueEmpty(Queue* ps)
{
	return ps -> tail == NULL &&ps -> head == NULL;
}

队头元素

QueueNodeType QueueFront(Queue* ps)
{
	assert(ps);
	assert(!QueueEmpty(ps));
	return ps->head->node;
}

入队

void QueuePush(Queue* ps, QueueNodeType x)
{
	QueueNode* newnode = QueueBuyNode(x);
	if (ps->tail == NULL)
	{
		ps->head = ps->tail = newnode;
	}
	else
	{
		ps->tail->next = newnode;
		ps->tail = newnode;
	}
	ps->size++;
}

出队

void QueuePop(Queue* ps)
{
	assert(ps);
	assert(!QueueEmpty(ps));
	if (ps->head->next == NULL)
	{
		free(ps->head);
		ps->head = ps->tail = NULL;
	}
	else
	{
		QueueNode* temp = ps->head;
		ps->head = ps->head->next;
		free(temp);
		temp = NULL;
	}
	ps->size--;
}

销毁队列

void QueueDistory(Queue* ps)
{
	assert(ps);
	QueueNode* cur = ps->head;
	while (cur)
	{
		QueueNode* del = cur;
		cur = cur->next;
		free(del);
	}
	ps->head = ps->tail = NULL;
}

注意:

使用某些库函数时要记得包含它对应的头文件,我也给大家整理了本次所需要的头文件。

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>

4.主函数(测试)

测试队列的相应功能,以下是我使用的主函数,大家也可以根据需要进行修改,测试其他的测试用例。

void test()
{
	Queue ps;
	QueueInit(&ps);//初始化队列
	QueuePush(&ps, 1);
	QueuePush(&ps, 2);
	QueuePush(&ps, 13);
	QueuePush(&ps, 14);
	//打印队列元素(遍历一边队列的元素,实质上就是出队列)
	while (!QueueEmpty(&ps))
	{
		printf("%d ", QueueFront(&ps));
		QueuePop(&ps);
	}
	QueueDistory(&ps);//销毁队列
}
int main()
{
	test();
	return 0;
}

四、相关习题

到这篇文章,我们已经了解了很多栈和队列的相关知识,所以我在这里同大家分享一些与栈和队列有关的概念性的选择题,以便让大家对这些知识掌握更加熟练。
大家可以先自己尝试着做一下这些选择题,我也会将它们的答案公布在下一篇博客的评论区里。
在这里插入图片描述

总结

以上就是今天要讲的内容,本文介绍了数据结构中的队列。对队列的概念以及它的具体实现都进行了讲解。大家感兴趣的也可以根据作者所写思路自行实现。
本文作者目前也是正在学习数据结构的知识,如果文章中的内容有错误或者不严谨的部分,欢迎大家在评论区指出也欢迎大家在评论区提问、交流。
最后,如果本篇文章对你有所启发的话,也希望可以多多支持作者,谢谢大家!
在这里插入图片描述

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

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

相关文章

【C++基础】友元

友元 定义&#xff1a;类的特点是私有成员无法在作用域外访问&#xff0c;而友元函数是特权函数&#xff0c;允许访问私有成员。 语法&#xff1a;在函数或类前加friend。 例子&#xff1a;在message中&#xff0c;published每个人都可访问&#xff0c;secret只有自己可以访问…

开放经济中的货币-中国视角下的宏观经济

开放经济中的货币 – 潘登同学的宏观经济学笔记 文章目录开放经济中的货币 -- 潘登同学的宏观经济学笔记汇率&#xff1a;复习外汇冲销下的可能三角中国的811汇改国际货币体系的现在与未来当前国际货币体系存在三个主要问题体系具有内生不稳定性美元的中心地位带来了不平等非对…

[附源码]java毕业设计校园博客系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

树莓派快速上手-远程调试图形界面

0 简述 前面的文章里介绍过通过ssh在局域网或者远程访问树莓派&#xff0c;一般而言&#xff0c;对于非图形界面的开发仅通过ssh命令行交互就能够完成的&#xff0c;但是要开发图形界面展示或交互的应用时&#xff0c;光命令行交互的方式就远远不够了。这篇文章将针对树莓派这…

Conformer测试问题

https://github.com/pengzhiliang/Conformer 抽空测试了conformer&#xff0c;训练起来很简单&#xff0c;但是会遇到一个问题&#xff1a; Loss is nan, stopping training 我用的默认配置&#xff0c;不知道为什么会有这个问题&#xff0c;知道的来探讨下。 1.数据准备 我…

华为机试 - 最长连续子序列

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 有N个正整数组成的一个序列。给定整数sum&#xff0c;求长度最长的连续子序列&#xff0c;使他们的和等于sum&#xff0c;返回此子序列的长度&#xff0c; 如果没有满足要求的序列&#xff0c;返回-1…

【Hack The Box】Linux练习-- Mirai

HTB 学习笔记 【Hack The Box】Linux练习-- Mirai &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月17日&#x1f334; &#x1f36…

元宇宙技术在几年后质变,迎来体验终端世界

京东集团高级副总裁、京东探索研究院院长陶大程京东集团高级副总裁、京东探索研究院院长陶大程是京东“产业元宇宙”的提出者和构建者。他谈到&#xff0c;希望通过构建元宇宙供应链降低实体经济参与数字经济的门槛&#xff0c;帮助实体经济完成数实融合的商业转型&#xff0c;…

设计模式复习题

1.选择题 1&#xff0e;在观察者模式中&#xff0c;表述错误的是(C )C.观察者可以改变被观察者的状态&#xff0c;再由被观察者通知所有观察者依据被观察者的状态进行。 2&#xff0e;对于违反里式代换原则的两个类&#xff0c;可以采用的候选解决方案错误的是: ( D )D.以上方…

斗鱼发布Q3财报:连续三个季度收入下滑,市值年初至今缩水五成

11月21日&#xff0c;斗鱼&#xff08;NASDAQ:DOYU&#xff09;发布2022年第三季度财务报告。 财报显示&#xff0c;斗鱼2022年第三季度的营收为17.98亿元&#xff0c;同比减少23.4%&#xff1b;净亏损660万元&#xff0c;2021年同期为亏损1.435亿元&#xff1b;调整后净利润为…

面向对象编程·上

面向对象编程上1.包1.1导入包中的类1.2静态导入1.3将类放到包中1.4包的访问权限控制 - [只能在当前包当中使用]1.5常见的系统包2.继承2.1背景2.2语法规则2.2.1super[不能出现在静态方法当中]作用总结 父类对象的引用2.3protected 关键字2.4更复杂的继承关系2.5final 关键字2.6组…

电容笔和触控笔有什么区别?值得入手电容笔品牌推荐

电容笔与传统的触控笔最大的不同之处是&#xff0c;电容笔具有良好的防误触和倾斜压感&#xff0c;能有效地降低书写过程中的麻烦。如果我们想要 IPAD和电容笔一起很好地使用&#xff0c;而且我们就没有过多的预算的话。那么&#xff0c;这款平替电容笔&#xff0c;就是最好的选…

看懂这篇文章-你就懂了数据库死锁产生的场景和解决方法

一、什么是死锁 加锁&#xff08;Locking&#xff09;是数据库在并发访问时保证数据一致性和完整性的主要机制。任何事务都需要获得相应对象上的锁才能访问数据&#xff0c;读取数据的事务通常只需要获得读锁&#xff08;共享锁&#xff09;&#xff0c;修改数据的事务需要获得…

京东神灯文档:JVM参数GC线程数ParallelGCThreads合理性设置

目录 1. ParallelGCThreads参数含义 2. ParallelGCThreads参数设置 3. ParallelGCThreads参数实验 4. ParallelGCThreads扫描结果 5. ParallelGCThreads修改建议 1. ParallelGCThreads参数含义 在讲这个参数之前&#xff0c;先谈谈JVM垃圾回收(GC)算法的两个优化标的&…

ERP (SAP) Integrator Delphi Edition

ERP (SAP) Integrator Delphi Edition ERP(SAP)Integrator支持RFC和SAP服务&#xff0c;并允许开发人员轻松编写桌面、服务器和移动应用程序。它提供了一种连接到SAP R/3和NetWeaver系统的简单方法&#xff0c;并使应用程序能够进行远程功能调用&#xff0c;以便向这些远程功能…

SQL Server 卸载和安装

在莫不知名链接下载sql失败了&#xff0c;然就几天变化&#xff0c;让我从sql Server2019到2022了&#xff0c; 首先讲一下卸载吧&#xff0c;很简单一共就5步&#xff0c; 先停止服务&#xff0c;有关sql server的相关服务全部停止&#xff0c;再进入控制面板 > 卸载程序…

解决:Uncaught (in promise) TypeError: Failed to fetch 的问题

1、问题展示&#xff1a; 其一、报错的代码信息为&#xff1a; Access to fetch at .......... from origin ................. has been blocked by CORS policy: Response to preflight request doesnt pass access control check: Redirect is not allowed for a preflight…

HashSet和HashMap

目录 一、HashSet 1、HashSet简单介绍 2、HashSet的常用方法 3、HashSet保证元素不重复的原理 二、HashMap 1、HashMap简单介绍 2、HashMet的常用方法 3、使用LinkedHashMap集合保证元素添加顺序 三、HashSet和HashMap的区别和联系 1、区别 2、联系 一、HashSet 1、Has…

Web3 入门教程 1 —— 认知篇

如果你也喜欢Web3&#xff0c;希望在这做些有趣的、有意义的事情&#xff0c;那么我希望这篇文章可以帮助到你。 其实在很早之前&#xff0c;我就计划写一篇《Web3 新手教程》&#xff0c;送给想要进入 Web3 或者刚刚进入 Web3 的小伙伴&#xff0c;但是考虑到两点原因&#xf…

力扣 53. 最大子数组和 --- C语言求解

题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 题解&#xff1a; 此题可以用动态规划和分治法。 方法1. 动态…