【数据结构与算法】第7课—数据结构之队列

news2024/11/7 20:38:27

文章目录

  • 1. 队列
    • 1.1 什么是队列
    • 1.2 队列的结构
    • 1.3 队列初始化
    • 1.4 队列入栈
    • 1.5 出队列
    • 1.6 查找队列有效元素个数
    • 1.7 取队头和队尾数据
    • 1.8 销毁链表
  • 2. 用两个队列实现栈
  • 3. 用两个栈实现队列
  • 4. 循环队列

1. 队列

  • 注:文中Queue是队列,Quene是错误写法

1.1 什么是队列

  • 只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表
  • 栈只允许在栈顶进行插入数据删除数据的操作,称为入栈、出栈(或压栈)
  • 队列则是队尾进队头出,满足先进先出的原则,而栈则是后进先出

在这里插入图片描述


1.2 队列的结构

在这里插入图片描述


typedef int QueueDataType;
//定义队列节点的结构
typedef struct QueueNode
{
	QueueDataType data;
	struct QueueNode* next;
}QueueNode;

//定义队列的结构
typedef struct Queue
{
	QueueNode* phead;//队头
	QueueNode* ptail;//队尾
}Queue;

1.3 队列初始化

在这里插入图片描述


1.4 队列入栈

在这里插入图片描述


//入队列
void QueuePush(Queue* pq, QueueDataType x)
{
	assert(pq);
	//申请节点
	QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
	if (newnode== NULL)
	{
		perror("malloc fail!\n");
		exit(1);
	}
	newnode->data = x;
	newnode->next = NULL;
	//队列为空,队头队尾都是newnode
	if (pq->phead == NULL)
	{
		pq->phead = pq->ptail = newnode;
	}
	//队列不为空
	else
	{
		pq->ptail->next = newnode;
		//pq->ptail往后走
		pq->ptail = pq->ptail->next;
	}
}

1.5 出队列

在这里插入图片描述


//队列判空
bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->phead == NULL;
}

//出队列--头删
void QueuePop(Quene* pq)
{
	assert(pq && !QueueEmpty(pq));
	//队列只有一个有效数据
	if (pq->phead == pq->ptail)
	{
		free(pq->phead);
		pq->phead = pq->ptail = NULL;
	}
	//队列有多个有效数据
	else
	{
		QueueNode* next = pq->phead->next;
		free(pq->phead);
		pq->phead = next;
	}
		
}

1.6 查找队列有效元素个数

在这里插入图片描述


//查找队列有效元素个数
int QueueSize(Queue* pq)
{
	assert(pq);
    //第一种
	//int size = 0;
	//QueueNode* pcur = pq->phead;
	//while (pcur)
	//{
	//	size++;
	//	pcur = pcur->next;
	//}
	//return size;

	//第二种
	return pq->size;
}

1.7 取队头和队尾数据

在这里插入图片描述


1.8 销毁链表

在这里插入图片描述


2. 用两个队列实现栈

  • 栈的结构

在这里插入图片描述


  • 栈的初始化

在这里插入图片描述


  • 入栈

在这里插入图片描述


  • 出栈----取栈顶元素

在这里插入图片描述


  • 返回栈顶元素

在这里插入图片描述


  • 判断栈是否为空和销毁栈

在这里插入图片描述


3. 用两个栈实现队列

在这里插入图片描述


  • 自定义的队列的数据结构

在这里插入图片描述


  • 队列的初始化

在这里插入图片描述


  • 入队和出队

在这里插入图片描述


在这里插入图片描述


  • 判断队列是否为空和销毁队列

在这里插入图片描述


4. 循环队列

在这里插入图片描述


  • 循环队列初始化

在这里插入图片描述


  • 判断循环队列是否为空循环队列是否满了

在这里插入图片描述


  • 循环队列插入元素

在这里插入图片描述


  • 循环队列出队列

在这里插入图片描述


  • 循环队列取队头和队尾

在这里插入图片描述


  • 释放循环队列

在这里插入图片描述


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

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

相关文章

window快捷键:window + v 打开剪切板历史记录 / 非常实用

一、剪切板历史记录功能介绍 1.1、window v 打开剪切板历史记录 / 文字、图片都可记录 1.2、window v 最近使用 1.3、window v 表情符号 1.4、window v GIF 1.5、window v 颜文字 1.6、window v 符号 二、欢迎交流指正

手机功耗异常大数据看板建设

一、背景 基于《软件绿色联盟应用体验标准—功耗标准》监控软硬件资源功耗异常类别与趋势 上述为手机功耗问题的前世今生及我们应该在哪些维度建立功耗的埋点监控支持分析​ 二、目标 手机端侧建立alarm\wakelock\wakeup\gps\bt\cpu\sensor\netTriffic等功耗相关的使用次数和时…

多彩电子显示屏

在仓储管理的广阔舞台上,一款名为“仓库46代”的创新标签悄然登场,它不仅是技术的飞跃,更是智慧仓储的新篇章。这款标签,以其独特的515.6x260x29mm身材,优雅地融入了繁忙的仓库环境,其沉稳的黑色外观&#…

sklearn|机器学习:决策树(一)

文章目录 sklearn|机器学习:决策树(一)(一)概述(二)实战1. 环境配置2. sklearn 中的决策树(1)模块 sklearn.tree(2)sklearn 基本建模流…

服务器Linux系统网络重启失败 Restarting network (via systemctl):......

网络重启时报错: Linux 网络服务重启失败可能由网络配置工具冲突或配置错误引起。 冲突问题:在 Linux 中,network 和 NetworkManager 这两个工具可能会冲突,禁用 NetworkManager 可以尝试解决该问题。 先停止服务 systemctl s…

域控操作二十四:主域故障辅域接替

模拟环境:上海DC1故障无法开机,导致只有一个DNS的电脑无法上网(实际可以添加DC2但是为了实验就不说了) FSMO还在DC1上 使用powershell把角色迁移到DC2 ntdsutil roles connections connect to server DC2SHA.whbk.cn quitSeize …

边缘AI计算技术应用-实训解决方案

一、解决方案架构 1.1 来自产业的项目 实训项目全部是基于产业的商业化项目,经过角色拆解、任务拆解、代码拆解、部署流程拆解等过程,讲其标准化为教师可以带领学生完成的实训内容,真正帮助学生接触产业前沿技术和工作内容,提升就…

贪心算法习题其二【力扣】【算法学习day.18】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴&am…

【Axure原型分享】颜色选择器——填充颜色

今天和大家分享颜色选择器——填充颜色的原型模板,点击颜色区域可以弹出颜色选择器,点击可以选择对应颜色,颜色区域会变色我们选择的颜色,具体效果可以观看下方视频或者打开预览地址体验。 【原型效果】 【Axure高保真原型】颜色…

SQL实战训练之,力扣:1843. 可疑银行账户

目录 一、力扣原题链接 二、题目描述 三、建表语句 四、题目分析 五、SQL解答 六、最终答案 七、验证 八、知识点 一、力扣原题链接 1843. 可疑银行账户 二、题目描述 表: Accounts ---------------------- | Column Name | Type | ---------------------- | acco…

软件系统交付阶段必备文档,验收体系配套资料,软件系统各阶段各步骤相关配套资料,各类软件建设方案(word,ppt)

软件文档交付清单是指在软件开发项目完成后,开发团队需要准备的一份详细清单,用于确保交付的软件产品符合客户需求并达到预期的质量标准。以下是软件文档交付清单中可能包含的一些关键要素 软件资料清单列表部分文档清单:工作安排任务书&…

Day07爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? class Solution {public int climbStairs(int n) {if (n 1) return 1;if (n 2) return 2;return climbStairs(n - 1) climbStairs(n - 2);} }用…

【51单片机】串口通信原理 + 使用

学习使用的开发板:STC89C52RC/LE52RC 编程软件:Keil5 烧录软件:stc-isp 开发板实图: 文章目录 串口硬件电路UART串口相关寄存器 编码单片机通过串口发送数据电脑通过串口发送数据控制LED灯 结束语 串口 串口是一种应用十分广泛…

c盘满了怎么清理垃圾而不误删?6招轻松清理C盘,快来试试

c盘满了怎么清理垃圾而不误删?相信平时工作生活中离不开电脑,随着使用电脑时间就了,C 盘的空间会不断被占据,进而致使系统运行变得迟缓,甚至出现卡顿现象。因此,定期清理 C 盘的是非常重要的。很多电脑小白…

Android 托管 Github Action 发布 Github Packages ,实现 Mvn 免费自动化托管

自从多年前 JCenter 关闭服务之后,GSY 项目版本就一直发布在 Jitpack 上,如今每个月也都有大概 10w 左右下载,但是近年来时不时就会出现历史版本丢失的问题,而且有时候还不是某个具体版本丢失,而是版本里的某几个依赖突…

MATLAB中pinv函数用法

目录 语法 说明 示例 使用伪逆求解线性方程组 pinv的功能是得到矩阵的Moore-Penrose 伪逆。 语法 B pinv(A) B pinv(A,tol) 说明 B pinv(A) 返回矩阵 A 的 Moore-Penrose 伪逆。 B pinv(A,tol) 指定容差的值。pinv 将 A 中小于容差的奇异值视为零。 示例 使用伪逆…

DP31 买卖股票的最好时机(二)

DP31 买卖股票的最好时机(二) import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);int n in.nextInt();int [] p new int[n];int sum 0;for…

.NET Core WebApi第5讲:接口传参实现、数据获取流程、204状态码问题

一、接口传参实现 1、引入:通过网址上两个参数mod...和FID....,区分开要的是哪个板块里面的数据​​​​​ 2、传参实现:在方法的参数处定义STRING字符串 (1)传1个参数 2>运行代码,在网页上输入以“点…

为什么一定要学AI(Stable Diffusion)做设计?

在当今数字化时代,人工智能技术正在以前所未有的速度和规模改变着各行各业的工作方式和流程。 更多实操教程可以扫描下方,免费获取 而室内设计领域中,AI技术也正在迅速崛起,为设计师们带来了前所未有的便利和创作可能性&#xff0…

mysql密码过期问题处理

链接mysql报错 Your password has expired. To log in you must change it using a client that supports expired passwords; 1、打开mysql链接工具 LINUV bin目录 windows 打开mysql client 2、进入mysql命令框 输入旧密码 3、执行 mysql> set passwordpassword(12345…