数据结构——队列(十)

2023-05-16

数据结构

文章目录

  • 数据结构
  • 一、什么是队列
  • 二、队列的实现
    • 1.队列的结构
    • 2.队列的初始化
    • 3.入队
    • 4.出队
    • 6.队头队尾的获取
  • 总结


一、什么是队列

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)。

入队:进行插入操作的一端称为队尾。
在这里插入图片描述
出队:进行删除操作的一端称为队头。
在这里插入图片描述
队列也是分为顺序队列和链式队列

二、队列的实现

1.队列的结构

队列需要同时在队头和队尾进行操作,这里使用链表实现。
但由于链表访问队尾时效率较低,所以用tail结构体指针指向链表的末尾。

typedef int QNDataType;
typedef struct QueueNode//对列结点的结构体
{
	struct QueueNode* next;
	QNDataType val;
}QueueNode;

//队列
typedef struct Queue
{
	QueueNode* head;//指向队头结点
	QueueNode* tail;//指向队尾结点
}Queue;

2.队列的初始化

//队列的初始化
void QueueInit(Queue* pq)
{
	pq->head = NULL;
	pq->tail = NULL;
	printf("队列初始化成功\n"); 
}

在这里插入图片描述

3.入队

//入队 
void QueuePush(Queue* pq, QNDataType x)
{
	assert(pq);

	QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
	if (newnode == NULL)
	{
		exit(-1);//创建新结点失败,直接退出
	}
	newnode->val = x;
	newnode->next = NULL;
	
	//队列中一个结点都没有
	if (pq->tail == NULL)
	{
		//新结点即使队头也是队尾
		pq->head = newnode;
		pq->tail = newnode;
	}
	else
	{
		//队列中有结点,在队尾插入新结点
		pq->tail->next = newnode;
		pq->tail = newnode;
	}
		printf("%d入队成功\n",x); 
}

在这里插入图片描述

4.出队

//出队 
void QueuePop(Queue* pq)
{
	assert(pq);
//	assert(!QueueEmpty(pq));//没有结点不进行删除操作
	 
	//只有一个结点,删除该结点后将head,tail置空
	if (pq->head->next == NULL)
	{
		free(pq->head);
		pq->head = NULL;
		pq->tail = NULL; 
		i++;
	}
	//多个结点
	else
	{
		//保留头结点的下一个结点,下一个结点为新的头
		QueueNode* next = pq->head->next;
		free(pq->head);
		pq->head = next;
		i++;
	}
		printf("第%d个数出队成功\n",i); 
}

在这里插入图片描述
5.队列的判断

//判断队列是否为空
void QueueEmpty(Queue* pq)
{
	assert(pq);
	//头结点为空则队列为空
	if(pq->head == NULL)
	printf("队列为空\n");
	else
	printf("队列不为空\n"); 
}

//计算队列的结点个数
int QueueSize(Queue* pq)
{
	int size = 0;
	QueueNode* cur = pq->head;

	while (cur)
	{
		size++;
		cur = cur->next;
	}

	printf("队列长度为%d\n",size);
}

在这里插入图片描述

6.队头队尾的获取

//得到队头的数据
QNDataType QueueFront(Queue* pq)
{
	assert(pq);
	//assert(!QueueEmpty(pq));
    if(pq->head!=NULL) 
	printf("队头数据为%d\n",pq->head->val);
	else
	printf("无队头");
}

//得到队尾的数据
QNDataType QueueBack(Queue* pq)
{
	assert(pq);
//	assert(!QueueEmpty(pq));
 if(pq->tail!=NULL) 
		printf("队尾数据为%d\n",pq->tail->val);
			else
	printf("无队尾");
}

在这里插入图片描述

总结

附上完整代码

 //队列
 #include<stdio.h> 
 #include<assert.h>
 static i=0;
 typedef int QNDataType;
typedef struct QueueNode//对列结点的结构体
{
	struct QueueNode* next;
	QNDataType val;
}QueueNode;

//队列
typedef struct Queue
{
	QueueNode* head;//指向队头结点
	QueueNode* tail;//指向队尾结点
}Queue;
//队列的初始化
void QueueInit(Queue* pq)
{
	pq->head = NULL;
	pq->tail = NULL;
	printf("队列初始化成功\n"); 
}
//入队 
void QueuePush(Queue* pq, QNDataType x)
{
	assert(pq);

	QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
	if (newnode == NULL)
	{
		exit(-1);//创建新结点失败,直接退出
	}
	newnode->val = x;
	newnode->next = NULL;
	
	//队列中一个结点都没有
	if (pq->tail == NULL)
	{
		//新结点即使队头也是队尾
		pq->head = newnode;
		pq->tail = newnode;
	}
	else
	{
		//队列中有结点,在队尾插入新结点
		pq->tail->next = newnode;
		pq->tail = newnode;
	}
		printf("%d入队成功\n",x); 
}
//出队 
void QueuePop(Queue* pq)
{
	assert(pq);
//	assert(!QueueEmpty(pq));//没有结点不进行删除操作
	 
	//只有一个结点,删除该结点后将head,tail置空
	if (pq->head->next == NULL)
	{
		free(pq->head);
		pq->head = NULL;
		pq->tail = NULL; 
		i++;
	}
	//多个结点
	else
	{
		//保留头结点的下一个结点,下一个结点为新的头
		QueueNode* next = pq->head->next;
		free(pq->head);
		pq->head = next;
		i++;
	}
		printf("第%d个数出队成功\n",i); 
}
//判断队列是否为空
void QueueEmpty(Queue* pq)
{
	assert(pq);
	//头结点为空则队列为空
	if(pq->head == NULL)
	printf("队列为空\n");
	else
	printf("队列不为空\n"); 
}

//得到队列的结点个数
int QueueSize(Queue* pq)
{
	int size = 0;
	QueueNode* cur = pq->head;

	while (cur)
	{
		size++;
		cur = cur->next;
	}

	printf("队列长度为%d\n",size);
}
//得到队头的数据
QNDataType QueueFront(Queue* pq)
{
	assert(pq);
	//assert(!QueueEmpty(pq));
    if(pq->head!=NULL) 
	printf("队头数据为%d\n",pq->head->val);
	else
	printf("无队头");
}

//得到队尾的数据
QNDataType QueueBack(Queue* pq)
{
	assert(pq);
//	assert(!QueueEmpty(pq));
 if(pq->tail!=NULL) 
		printf("队尾数据为%d\n",pq->tail->val);
			else
	printf("无队尾");
}

int main()
{
	
	QueueNode que;
	QueueInit(&que);
	QueuePush(&que,1) ;
	QueuePush(&que,5) ;
	QueueEmpty(&que);
	QueueSize(&que);
	QueueFront(&que);
	QueueBack(&que);
	QueuePop(&que); 
	QueuePop(&que); 
	QueueEmpty(&que);
	QueueSize(&que);
	QueueFront(&que);
	QueueBack(&que);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构——队列(十) 的相关文章

随机推荐

  • 汇编语言--实验九

    实验名称 xff1a 根据材料编程 目录 实验名称 xff1a 根据材料编程 一 xff1a 实验目的 二 xff1a 实验内容及步骤 内容 xff08 1 xff09 步骤 xff08 1 xff09 结果 xff08 1 xff09 三
  • Visual Studio 2022 C++开发 (Win)配置教程

    前言 本文将讲解如何在Window系统下配置Visual Studio 2022版本的C 43 43 开发环境 步骤 下载并且安装Visual Studio Tools xff08 1 xff09 下载 Visual Studio Tool
  • template < class T> ,map和vector用法——恶补c++

    部分目录 template lt class T gt 是什么找到各素数因子map数组下用法map遍历map元素的默认值 vector 用法 template lt class T gt 是什么 template lt class T gt
  • 停车场寻车系统(识别车牌,手机app查询相关信息)

    停车场寻车系统 文章目录 停车场寻车系统前言一 手机app二 车牌识别三 数据查询总结 停车场寻车系统 前言 上个星期用了一周左右做了一个停车场寻车系统的项目 xff0c 可以识别车牌 xff0c 通过手机app查询车辆信息 一 手机app
  • K210+MLX90614红外测温

    红外测温 文章目录 红外测温前言一 MLX90614二 使用步骤总结 前言 K210随便找一个都行 一 MLX90614 这个模块之前的博客有介绍 xff0c 他是用IIC通信的 模块就不过多介绍了 xff0c 之间看代码吧 import
  • PHP mysql_connect()连接-已淘汰

    1 首先在mysql命令控制台新建数据库 mysql gt create database test Query OK 1 row affected 0 04 sec mysql gt use test Database changed m
  • STM32使用红外测温

    红外测温 文章目录 红外测温前言一 原理二 STM32代码1 MLX90614 c2 MLX90614 h 总结 前言 一 原理 红外测温的原理可以直接去看卖家的手册 xff0c 手册多余的话太多了 xff0c 知道他是IIC通信的就行了
  • Arduino——PAJ7620手势识别模块

    手势识别模块 文章目录 手势识别模块前言一 安装PAJ7620库二 代码 前言 在用arduino驱动这些模块得时候 xff0c 方法很简单 xff0c 先去管理库中找这个库 xff0c 如果有这个库 xff0c 然后下载这个库 xff0c
  • Arduino——正点原子sim800c模块

    sim800c 文章目录 sim800c前言一 arduino代码 前言 最近要做一个项目需要用到sim800c xff0c 就用arduino驱动一下吧 xff0c 用的是正点原子的sim800c 使用的时候最好使用12v1A供电 xff
  • Arduino——野火GPS模块

    GPS模块 文章目录 GPS模块前言一 Arduino代码 前言 手上还有一个GPS xff0c 用arduino做模块很方便 xff0c 打算和短信模块结合 xff0c 短信模块上次已经使用完成了 xff0c 这次学习一下GPS模块 看模
  • Arduino——GY39大气压、温湿度、光照模块

    GY39模块 文章目录 GY39模块前言一 模块介绍二 arduino代码 前言 前几天买东西的时候买了一个GY39 xff0c 这个模块集成了温湿度 xff0c 大气压 xff0c 海拔 xff0c 光照一体 xff0c 使用起来很方面
  • Arduino通过NRF24L01实现双机无线通信

    双机无线通信 文章目录 双机无线通信前言一 接线二 Arduino代码1 主机2 从机 总结 前言 无线通信对于做各种项目来说都很加分 xff0c 今天使用这个nrf模块进行无线通信 我原本是想用两个蓝牙的 xff0c 但是蓝牙有个缺点 x
  • STM32+ESP8266+机智云+DHT11数据上传

    机智云 文章目录 机智云前言一 工程的修改二 数据的上传1 标识符2 数据处理3 数据上传 三 app控制 前言 今天搞了一下机智云 xff0c 就想把温湿度发到app上去 xff0c 然后能够控制灯的开关 之前从来没有用过这个玩意 xff
  • 数据结构——线性结构(二)

    数据结构 文章目录 数据结构前言一 线性结构1 线性表2 线性表的特点 二 线性结构的存储形式1 顺序结构2 链式结构 前言 很早之前提到了数据结构 xff0c 上一篇博客简单介绍了什么是线性结构 xff0c 这篇博客简单做一个补充 常见的
  • 数据结构——顺序表(三)

    数据结构 文章目录 数据结构一 什么是顺序表二 顺序表的创建1 静态顺序表2 动态数据表 三 顺序表的初始化 销毁四 顺序表的插入1 尾插2 头插3 任意插入 总结 一 什么是顺序表 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线
  • PHP new mysqli()连接

    1 首先在mysql命令控制台新建数据库 mysql gt create database test Query OK 1 row affected 0 04 sec mysql gt use test Database changed m
  • 数据结构——链表(五)

    数据结构 96 文章目录 数据结构前言一 什么是链表二 实现单链表1 单链表的结构2 单链表的初始化3 单链表的插入4 遍历链表5 链表长度 总结 前言 接下来学习一下链表 xff0c 链表比数组用的更多 一 什么是链表 概念 xff1a
  • 数据结构——双向循环链表(八)

    数据结构 文章目录 数据结构前言一 双向循环链表初始化二 双向循环链表的插入遍历 三 双向链表的删除总结 前言 双向循环链表用的次数是最多的 xff0c 下面我们看一下双向循环链表的增删改查 一 双向循环链表初始化 双向循环链表不能出现NU
  • 数据结构——栈(九)

    数据结构 文章目录 数据结构前言一 栈的介绍二 栈的实现1 栈的结构2 栈的初始化3 进栈4 出栈5 栈的判断6 取栈顶元素7 栈的清空8 栈的销毁 总结 前言 栈是一种特殊的线性表 xff0c 只允许在固定的一端进行插入和删除元素的操作
  • 数据结构——队列(十)

    数据结构 文章目录 数据结构一 什么是队列二 队列的实现1 队列的结构2 队列的初始化3 入队4 出队6 队头队尾的获取 总结 一 什么是队列 队列 xff1a 只允许在一端进行插入数据操作 xff0c 在另一端进行删除数据操作的特殊线性表