数据结构 第三章 栈和队列(队列)

news2024/11/28 8:36:24

感谢:点击收听

1 基本知识点

1、允许删除的一端称为队头(front)
2、允许插入的一端称为队尾(rear)
3、当队列中没有元素时称为空队列
4、顺序队列:

1 使用顺序表来实现队列
2 两个指针分别指向队列的前端和尾端
**3 如果队列的大小为MaxSize个,那么元素的下标范围从0到MaxSize-1**
4 假设队头指针front指向队头元素的前一个位置,队尾指针rear指向队尾元素

顺序队列存在“假上溢”现象:
由于入队和出队操作中,头尾指针只增加不减小,致使被删元素的空间永远无法重新利用。
当队列中实际的元素个数远远小于向量空间的规模时,也可能由于尾指针已超越向量空间的上界而不能做入队操作。

5、循环队列
请添加图片描述

1 满队列条件:Q.rear = Q.front;
2 空队列条件:Q.rear = Q.front;
如何区分? 

区分队列是满还是空:

1 牺牲一个存储空间(front与rear是相邻的而非相等的)
2 引入一个标志变量flag区别空和不空
3 使用计数器count

请添加图片描述
请添加图片描述
如果选择牺牲一个空间的方法,那么满队列的判断条件为:

(rear+1)%MaxSize == front

队列为空的条件依然是:

front == rear

入队为:

rear = (rear+1)%MaxSize

出队为:

front = (front+1)%MaxSize

获取队列中元素的个数:

(rear-front+MaxSize)%MaxSize

6、链队列(使用单链表来实现队列)

1 使用无头结点的单链表表示队列
2 表头为队头,表尾为队尾
3 设置头尾指针,方便对表的两端进行操作

初始时:front = NULL;rear = NULL;
链队列的基本操作:

**1 入队:**
if(rear == NULL)//原来的队列就是空的
	front = rear = newnode;//入队元素不但是队首也是队尾
else{
	rear->next = newnode;//在队尾入队
	rear = rear->next;//修改队尾指针
}
**2 出队:**
需要考虑队列是否为空、队列是否只有一个元素
if(队列为空)
	退出
else
	队列非空
	那么需要
node* p = front;
value = front->data;//保存队首元素
front = front->next;//在队首出队
free(p);
//如果原来只有一个元素,那么出队之后为空
if(front == NULL)	rear = NULL;//修改队尾指针
return value;

2 典型题目

请添加图片描述

请添加图片描述

请添加图片描述

注意:数组A的长度为m+1
请添加图片描述

注意:队列中只有一个元素的情况
请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

3 算法题目

1、
使用两个栈来模拟队列
请添加图片描述
2、
请添加图片描述
入队:

Queue Queue_in(Queue Q,int e){
	//如果队列不为空,并且rear等于front
	if((Q.tag == 1)&&(Q.rear == Q.front)){
		//打印队列已满
		printf("队列已满\n");
	}else{
		//入队
		Q.rear = (Q.rear+1)%m;
		Q.data[Q.rear] = e;
		if(Q.tag == 0)
			Q.tag = 1;//队列已经不为空
	}
	return Q;
}

出队:

ElemType Queue_out(Queue Q){
	if(Q.tag == 0)
		printf("队列为空\n");
		//退出
	else{
		Q.front = (Q.front+1)%m;
		e = Q.data[Q.front];
		if(Q.front == Q.rear)	
			Q.tag = 0;//空队列
	}
	return e;
}

3、
请添加图片描述
入队:

Queue Queue_in(Queue Q,int e){
	//表示队满
	if(Q.length == m)
		return 0;
	else{
		Q.rear = (Q.rear+1)%m;
		Q.data[Q.rear] = e;
		Q.length++;
	}
	return Q;
}

出队:

ElemType Queue_out(Queue Q){
	if(Q.length == 0)//队列为空
		return 0;
	else{
		int front = (Q.rear-Q.length+1+m)%m;//获取队头元素
		Q.length--;
		return Q.data[Q.front];
	}
}

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

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

相关文章

什么是倒排表(倒排索引)

这种搜索引擎的实现常常用的就是倒排的技术 文档(Document):一般搜索引擎的处理对象是互联网网页,而文档这个概念要更宽泛些,代表以文本形式存在的存储对象,相比网页来说,涵盖更多种形式,比如Word&#xff…

在Mac下如何创建文件

相比于windows中创建Mac是比较复杂的 第一步:打开启动台,依次打开「启动台-其他-自动操作」,可以按住「 Command 空格」直接搜索「自动操作」程序。 第二步:打开之后在「选取文稿类型」选项时,选择「快速操作」&#…

工地车辆未冲洗识别抓拍系统 yolov5网络

工地车辆未冲洗识别抓拍系统通过yolov5网络深度算法学习模型,自动对画面中每辆进出车辆的清洗实现自动识别判定。如果识别到车辆冲洗不合格,就会自动进行抓拍并将违规车辆信息回传。目标检测架构分为两种,一种是two-stage,一种是o…

「兔了个兔」看我如何抓取兔兔图片到本地(附源码)

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后…

如何在IDEA中使用Maven构建Java项目?Maven的使用详细解读

文章目录1. 前言2. IDEA 中配置 Maven 环境3. Maven 的坐标问题4. IDEA 中创建 Maven 项目5. IDEA 中导入 Maven 项目6. 安装插件7. 依赖管理8. 依赖范围6. 总结Java编程基础教程系列1. 前言 前面在如何使用 Maven 构建 Java 项目一文中,我们一直在命令行中执行构建…

LabVIEW什么是实时操作系统(RTOS)

LabVIEW什么是实时操作系统(RTOS)一般而言,操作系统的任务是管理计算机的硬件资源和应用程序。实时操作系统会执行这些任务,但是运行时间精度和可靠度都极高。在实际应用中,有的系统失常代价高昂,甚至会引起安全事故。这时&#x…

成为提示专家,AI艺术杂志:AI Unleashed 第一期

shadow最近发现了一期AI艺术的杂志。名称叫 AI Unleashed,是一本深入探索 AI 和想象力的杂志。每期杂志都将填满精彩的 AI 艺术,激发你的好奇心, 让你更加了解最新的 AI 技术,以及它如何改变现有工作流和我们对艺术和技术的看法。…

LVS+keepalived(双主)+Nginx实现高可用负载均衡

#为什么采用双主架构: 单主架构只有一个keepalived对外提供服务,该主机长期处于繁忙状态,而另一台主机却很空闲,利用率低下 #双主架构的优点: 即将两个或以上VIP分别运行在不同的keepalived服务器,以实现…

C++11使用线程类thread的方法

C11 之前,C 语言没有对并发编程提供语言级别的支持。如果需要使用线程,windows系统需要使用CreateThread函数创建线程,而linux需要使用pthread库使用线程。C11 中增加了线程以及线程相关的类,很方便地支持了并发编程。由于可以跨平…

活动星投票十大商业品牌网络评选微信的投票方式线上免费投票

“十大商业品牌”网络评选投票_线上系统免费投票_功能齐全的视频投票_在线投票免费小程序用户在使用微信投票的时候,需要功能齐全,又快捷方便的投票小程序。而“活动星投票”这款软件使用非常的方便,用户可以随时使用手机微信小程序获得线上投…

CV学习笔记-VGG

VGG 1. 常见的卷积神经网络 VGG属于一种经典的卷积神经网络结构,其出现在AlexNet之后,由于AlexNet的突破证实了卷积神经网络的可行性,VGG的思路主要是将网络层数加深,从某种意义上说,网络层数的加深可以粗略地认为考虑…

编译原理学习笔记14——属性文法与语法制导翻译1

编译原理学习笔记14——属性文法与语法制导翻译114.1 属性文法14.2 属性计算14.1 属性文法 属性文法 综合属性 自下而上传递信息语法规则:根据右 部候选式中的符号 的属性计算左部被 定义符号的综合属性语法树:根据子结 点的属性和父结点 自身的属性…

【日常系列】LeetCode《30·动态规划总结》

动态规划总结 线性动态规划问题总结 打家劫舍总结 最大子数组和总结 dp[i] 依赖于前面一个或者两个状态 dp[i] 依赖于前面多个状态 注意:子序列可以不连续 dp[i] 带有一个或者多个维度 输入为两个数组或者两个字符串 lc 10【剑指 19】【top100】:正…

【LeetCode每日一题:2309. 兼具大小写的最好英文字母~~~模拟+Hash表+贪心】

题目描述 给你一个由英文字母组成的字符串 s ,请你找出并返回 s 中的 最好 英文字母。返回的字母必须为大写形式。如果不存在满足条件的字母,则返回一个空字符串。 最好 英文字母的大写和小写形式必须 都 在 s 中出现。 英文字母 b 比另一个英文字母 …

Java生成微信小程序二维码,5种实现方式,一个比一个简单

文章目录前言先看官网一、JDK自带的URLConnection方式二、Apache的HttpClient方式三、okhttp3方式四、Unirest方式五、RestTemplate方式其它细节getAccessToken构建参数mapbyte[]数组源码下载前言 先介绍一下项目场景,主要是通过微信小程序二维码裂变分享&#xff…

一时重构一时爽,一直重构一直爽

笔者(后台技术汇)恭祝各位大佬:2023年春节快乐,兔年祥瑞。距离上次更新,已经过去5个月有余了,有小伙伴疑惑笔者是不是删库跑路了..其实不是,这段时间是在参加一次比较大的项目重构(目…

学习笔记 —— python代码耗时及内存占用测试方法

1、手写耗时测试 先看结果; 主要有三种方法,各自的时钟间隔如下: time.time() timeit time.time_ns() ( time is outputted in ns!). 可见方法2,即timeit 的时钟间隔最短。 注:最后一个是以ns为单位的,前两个是…

二叉树的概念与结构

文章目录前言一、树的概念及结构1.树的概念2.树的相关概念3.树的表示4. 树在实际中的运用二、二叉树概念及结构1.概念2.特殊的二叉树5.二叉树的性质6.二叉树的存储结构(1).顺序存储(2).链式存储结语前言 因为二叉树的知识点太多,一篇文章讲不…

《真象还原》读书笔记——第一章 部署工作环境

环境: 由于平时使用 windows 系统 所以 linux 环境 使用了 linux子系统。 $ cat /proc/version Linux version 4.4.0-22000-Microsoft (MicrosoftMicrosoft.com) (gcc version 5.4.0 (GCC) )1.1 工欲善其事 必先利其器 操作环境很重要呀。 1.2 编译器 GCC: gc…

Java 23种设计模式(8.结构型模式-桥接模式)

结构型模式-桥接模式 代码分析 类图 代码 public interface Implementor {void operation(); }public class ConcreteImplementorA implements Implementor{Overridepublic void operation() {System.out.println("A");} }public class ConcreteImplementorB imple…