06.队列介绍+实现

news2024/11/29 6:31:19

目录

 一、队列的概念

 二、队列的实现

1、头文件定义

2、功能函数实现

3、主函数测试


一、队列的概念

        队列就像吃饭排队类似,先来先吃,先进先出。

        队头:队列的头部。

        队尾:队列的尾部。

        入队:在队尾操作。

        出队:在队头操作。

 二、队列的实现

        因为出队列需要对队头操作,而数组对队头操作需要遍历,所以队列用链表实现更优。而单链表较双向链表占用空间更小,且同样能实现队列,所以用单链表更好。

        队列的实现类似于单链表,所以定义了链表用的节点结构体,而队列需要对头和尾操作,所以再定义结构体分别表示队列的头和尾。头和尾分别指向链表的头部和尾部。

        定义头和尾方便,为什么单链表实现不定义头和尾,因为在链表尾删的时候,需要改变尾节点的前一个节点的指针,而尾节点找不到尾节点的前一个结点,还是需要遍历链表,定义尾部意义不大。

1、头文件定义

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

typedef int QDataType;
//链式结构,表示队列
typedef struct QList
{
	struct QList* next;
	QDataType data;
}QList;
//队列的结构
typedef struct Queue
{
	QList* front;
	QList* rear;
	int size;
}Queue;

//队列初始化
void QInit(Queue* ps);
//队尾入队列
void QPush(Queue* ps, QDataType x);
//队头出队列
void QPop(Queue* ps);
//获取队列队头元素
QDataType QFront(Queue* ps);
//获取队列队尾元素
QDataType QRear(Queue* ps);
//检测队列是否为空
bool QEmpty(Queue* ps);
//获取队列数据个数
int QSize(Queue* ps);
//销毁队列
void QDestory(Queue* ps);

2、功能函数实现

#include "Queue.h"

//队列初始化
void QInit(Queue* ps)
{
	assert(ps);
	ps->front = ps->rear = NULL;
	ps->size = 0;
}
//申请空间
QList* QCheck(QDataType x)
{
	QList* new = (QList*)malloc(sizeof(QList));
	if (new == NULL)
	{
		perror("malloc fail\n");
		exit(1);
	}
	new->data = x;
	new->next = NULL;
	return new;
}
//队尾入队列
void QPush(Queue* ps, QDataType x)
{
	assert(ps);
	QList* new = QCheck(x);
	if (ps->front == NULL)
	{
		ps->front = ps->rear = new;
	}
	else
	{
		ps->rear->next = new;
		ps->rear = new;
	}
	ps->size++;
}
//队头出队列
void QPop(Queue* ps)
{
	assert(ps);
	assert(ps->front);
	QList* nextfront = ps->front->next;
	free(ps->front);
	ps->front = nextfront;
	if (ps->front == NULL)
	{
		ps->rear = NULL;
	}
	ps->size--;
}
//获取队列队头元素
QDataType QFront(Queue* ps)
{
	assert(ps);
	assert(ps->size > 0);
	return ps->front->data;
}
//获取队列队尾元素
QDataType QRear(Queue* ps)
{
	assert(ps);
	assert(ps->size > 0);
	return ps->rear->data;
}
//检测队列是否为空
bool QEmpty(Queue* ps)
{
	assert(ps);
	return ps->size == 0;
}
//获取队列数据个数
int QSize(Queue* ps)
{
	assert(ps);
	return ps->size;
}
//销毁队列
void QDestory(Queue* ps)
{
	assert(ps);
	while (ps->front)
	{
		QList* nextfront = ps->front->next;
		free(ps->front);
		ps->front = nextfront;
	}
	ps->front = ps->rear = NULL;
	ps->size = 0;
}

3、主函数测试

#include "Queue.h"

int main()
{
	Queue Q;
	QInit(&Q);
	QPush(&Q, 1);
	QPush(&Q, 2);
	QPush(&Q, 3);
	QPush(&Q, 4);
	printf("队列入队顺序为1,2,3,4,出队顺序也应该为1,2,3,4\n");
	while (!QEmpty(&Q))
	{
		QDataType x = QFront(&Q);
		printf("%d ", x);
		QPop(&Q);
	}
	QDestory(&Q);
	return 0;
}

分别建立名为Queue.h的头文件和Queue.c的源文件,和一个主函数文件。运行上述代码: 

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

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

相关文章

汽车免拆诊断案例 | 2023款零跑C01纯电车后备厢盖无法电动打开和关闭

故障现象  一辆2023款零跑C01纯电车&#xff0c;累计行驶里程约为2万km&#xff0c;车主进厂反映&#xff0c;后备厢盖无法电动打开和关闭。 故障诊断  接车后试车&#xff0c;操作后备厢盖外侧、驾驶人侧及遥控钥匙上的后备厢盖开启按钮&#xff0c;可以听到后备厢盖解锁的…

Dropout为何能防止过拟合?dropout和BN 在前向传播和方向传播阶段的区别?

Dropout是一种用于防止过拟合的正则化技术&#xff0c;它通过在训练过程中随机关闭一部分神经元来降低模型的复杂度和参数数量&#xff0c;从而有效地减少过拟合的风险。 以下是dropout能够防止过拟合的几个原因&#xff1a; 减少神经元间的共适应性&#xff1a; 在训练过程中&…

Redis --- 第七讲 --- 关于事务和主从复制

一、事务的认识 redis事务和mysql的事务相似&#xff0c;但是比它的简单。 原子性、一致性、持久性、隔离性。 Redis的事务和MySQL一比就是一个弟弟。 原子性&#xff1a;Redis的事务到底有没有原子性&#xff0c;存在争议。最原本的含义&#xff0c;是吧多个操作打包到一起…

一个简单的Qt Console Application计算练习程序

初步体验Qt Creator 用途&#xff1a;练习20以内2位数乘法速算的程序 功能1&#xff1a;支持用户设定题目数量 std::cout << "请输入本次练习题目数量&#xff1a;";int numProblems 0;std::string num;std::cin >> num;try {numProblems std::stoi(…

CMOS晶体管的串联与并联

CMOS晶体管的串联与并联 前言 对于mos管的串联和并联&#xff0c;一直没有整明白&#xff0c;特别是设计到EDA软件中&#xff0c;关于MOS的M和F参数&#xff0c;就更困惑了&#xff0c;今天看了许多资料以及在EDA软件上验证了电路结构与版图的对应关系&#xff0c;总算有点收…

沧穹科技受邀出席第二届空间信息产业无锡创新发展大会暨软件定义卫星技术大会

10月9日&#xff0c;第二届空间信息产业无锡创新发展大会暨软件定义卫星技术大会在江苏省无锡市隆重举行。沧穹科技荣幸受邀参加这一行业盛事&#xff0c;公司董事长陈锐志教授出席本次会议。 在大会产品展示环节&#xff0c;沧穹科技展示了其自主研发的室内定位解决方案领域的…

Android Framework定制navigationBar显示

导航栏3种模式 在安卓系统中&#xff0c;“config_navBarInteractionMode” 是一个特定的配置参数&#xff0c;用于设定安卓设备导航栏的交互模式。 frameworks/base/core/res/res/values/config.xml <!-- Controls the navigation bar interaction mode:0: 3 button mode …

Qt5.14.2 安装详细教程(图文版)

Qt 是一个跨平台的 C 应用程序开发框架&#xff0c;主要用于开发图形用户界面&#xff08;GUI&#xff09;程序&#xff0c;但也支持非 GUI 程序的开发。Qt 提供了丰富的功能库和工具&#xff0c;使开发者能够在不同平台上编写、编译和运行应用程序&#xff0c;而无需修改代码。…

C++初阶——入门

目录 1、C发展历史 2、C版本更新 3、C参考文档 4、C书籍推荐 5、C的程序 6、命名空间 6.1 namespace的作用 6.2 namespace的定义 6.3 namespace的使用 7、C输入&输出 8、缺省参数 9、函数重载 10、引用 10.1 引用的概念和定义 10.2 引用的特性 10.3 引用的使…

Mysql 5.7 安装与卸载(非常详细)

一、环境介绍 操作系统&#xff1a;CentOS 7 MySQL&#xff1a;5.7 二、MySQL卸载 # 查看软件 rpm -qa|grep mysql # 卸载MySQL yum remove -y mysql mysql-libs mysql-common rm -rf /var/lib/mysql rm /etc/my.cnf 继续查看是否还有 MySQL 软件&#xff0c;有的话继续删…

空间解析几何 4:空间中线段到圆的距离【附MATLAB代码】

目录 理论公式 matlab代码 理论公式 对于解一元4次方程&#xff0c;请详见我的博客 一元四次方程求解 -【附MATLAB代码】-CSDN博客文章浏览阅读1.4k次&#xff0c;点赞41次&#xff0c;收藏4次。最近在研究机器人的干涉&#xff08;碰撞&#xff09;检测&#xff0c;遇到了一…

【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第五十四章 Pinctrl 子系统和 GPIO 子系统

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

uniapp,获取头部高度

头部自定义时候&#xff0c;设置获取安全区域&#xff0c;可以用 uni.getSystemInfoSync();接口。 <view class"statusBar" :style"{height:statusBarHeightpx}"> let SYSuni.getSystemInfoSync(); let statusBarHeightref(SYS.statusBarHeight) …

最后一周征稿!第四届计算机、物联网与控制工程国际学术会议(CITCE 2024)

第四届计算机、物联网与控制工程国际学术会议&#xff08;CITCE 2024&#xff09;将于2024年11月1-3日在中国-武汉召开。CITCE 2024将围绕计算机、物联网与控制工程的最新研究领域&#xff0c;为来自国内外高等院校、科学研究所、企事业单位的专家、教授、学者、工程师等提供一…

Shell编程-break

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们前面学习了那么多命令&#xff0c;以及涉及到部分逻辑判断的问题。从简单来说&#xff0c;他就是Shell编程&#xff0c;…

Linux与Windows文件共享:Samba的详细配置(Ubuntu)

序 什么是samba&#xff1f;Samba是一种在Linux和UNIX系统上实现SMB协议的免费软件&#xff0c;用于局域网内不同计算机之间的文件和打印机共享服务。今天我们将通过配置samba来进行Windows与linux系统之间的文件共享。 配置 此次配置&#xff0c;我们所使用的Linux发行版版本信…

萤石云服务支持云端视频AI自动剪辑生成

萤石视频云存储及媒体处理服务是围绕IoT设备云端存储场景下的音视频采集、媒体管理、视频剪辑和分发能力的一站式、专业云服务&#xff0c;并可面向广大开发者提供复杂设备存储场景下的完整技术方案。目前该服务新增了视频剪辑功能&#xff0c;支持将视频片段在云端进行裁剪并拼…

WordPress+Nginx 安装教程

WordPress 是一个开源的网站建设工具&#xff0c;可以用它来“快速”搭建个人博客&#xff0c;官网等等。它本身是用 php 开发的&#xff0c;本身部署不复杂&#xff0c;主要是需要一些配套的东西才能跑起来&#xff0c;网上的一些教程也是写的不清不楚&#xff0c;本文针对非 …

LeetCode :LCR 173. 点名

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;leetcode刷题 ​ ​ LeetCode :LCR 173. 点名 这个题就是缺失的数字&#xff0c;我们可以通过三种方式来解决这个问题。 1.可以通过位异或的方式来找到这个数&#xff08;相同的数异或为…

枸杞常见病虫害识别数据集(猫脸码客 第220期)

枸杞常见病虫害识别数据集 枸杞&#xff0c;作为一种在中医药学和食品保健领域都备受瞩目的植物&#xff0c;其生长过程中常常会受到各种病虫害的侵扰。这些病虫害不仅影响枸杞的产量&#xff0c;还对其品质产生不良影响。因此&#xff0c;对枸杞病虫害的研究和防治显得尤为重…