小工具      在线工具  汉语词典  dos游戏  css  js  c++  java

顺序队列和链队列

程序、数据结构与算法,c++,开发语言 额外说明

收录于:18天前

队列也是一种线性结构,不同于栈的是队列为先进先出的数据结构,遵循一边入队一边出队。

在这里插入图片描述

顺序队列底层使用的是数组,所以需要提前申请足够大的内存空间来初始化顺序队列。另外,为了满足顺序队列中的数据从队尾进入,从队头退出,先进先出的要求,我们还需要定义两个指针(top和rear)分别指向顺序队列中的头元素和尾元素。尾部元素。

入栈的数据始终存储在数组中,但读取数据时,是从记录的第一个元素开始读取。

在这里插入图片描述
在添加(入队)时,元素被添加到队位(rear)所在位置,对位加一,依次类推,这样在添加元素时元素依次填充数组的位置。

#include<stdio.h>
#define MAXSIZE 5
typedef struct Queue{
    
	int datas[MAXSIZE];
	int front;
	int rear;
}SqQueue;

//入队
int Push(SqQueue *S,int e){
    
	if(S->rear == MAXSIZE) return 0;
	S->datas[S->rear] = e;
	S->rear++;
	return 1;
}

//出队
int Pop(SqQueue *S){
    
	int e = S->datas[S->front];
	S->front++;
	return e;
}

int main(){
    
	SqQueue S;
	S.front = S.rear =0;
	Push(&S,3);
	Push(&S,5);
	Push(&S,7);
	int e = Pop(&S);
	printf("%d\n",e);
	int e1 = Pop(&S);
	printf("%d\n",e1);
	int e2 = Pop(&S);
	printf("%d\n",e2);
	
	return 0;
}

删除(出队)时,队列头(top)指向的元素被赋给临时变量,队列头移回指向下一个元素。队头继续像光标一样记录当前位置,模拟元素出队。

对于数组实现的会遇到假溢出问题,如下:
在这里插入图片描述
当rear指向最后一个元素时,rear无法在后移,于是队列满了,但是看top的位置却在第4个元素的位置,也是说前三个元素都出栈了,空出了三个元素的位置。为了解决该假溢出的问题,可以将队列变成一个循环队列

循环队列利用top,rear,MAXSIZE的关系巧妙模拟循环。rear在指向最后一个位置时再次添加就回到数组第一个位置,再一次向后移,top也是如此。

如果是循环队列,则操作必须基于MAXSIZE。所以rear只能在[1, MAXSIZE]范围内。那么rear的操作就变成:

S->rear = (S->rear+1)%MAXSIZE

注意如果以mAXSIZE定义数组那么数组为[MAXSIZE-1],因为数组是从0开始的。

如何判断队列是否已满?

  • 第一种情况

在这里插入图片描述

在这里插入图片描述

主要有以上两种情况表示队列满了。第一种S->rear = (S->rear+1)%MAXSIZE,注意是计算后的情况,满足Q.front = Q.rear。这种判断是不合理的,因为该判断条件也是判空的条件。

一般情况下,可以少用一个元素空间。即当队列空间大小为m时,如果有m-1个元素则认为队列已满。这样,判断队列为空的条件保持不变,即头尾指针的值相同时,认为队列为空;当尾指针循环加1等于千个头指针时,认为队列已满。 (完美解决问题,无需放弃存储元件的空间)。

在这里插入图片描述
在这里插入图片描述

途中的后值是加入队列后计算的后值。

在少用一个元素的情况下,满足(S->rear+1)%MAXSIZE) == S->front 表示队满。

因此, 在循环队列中队空和队满的条件是:
队空的条件:Q.front = Q.rear
队满的条件:(Q rear+ 1)%MAXSIZE = Q.front

#include<stdio.h>
#define MAXSIZE 5
typedef struct Queue{
    
	int datas[MAXSIZE];
	int front;
	int rear;
}SqQueue;

//入队
int Push(SqQueue *S,int e){
    
	if( (S->rear+1)%MAXSIZE ==S->front) return 0;
	S->datas[S->rear] = e;
	S->rear = (S->rear+1)%MAXSIZE;
	return 1;
}

//出队
int Pop(SqQueue *S){
    
	int e = S->datas[S->front];
	S->front = (S->front+1)%MAXSIZE;
	return e;
}

int main(){
    
	SqQueue S;
	S.front = S.rear =0;
	Push(&S,3);
	Push(&S,5);
	Push(&S,7);
	int e = Pop(&S);
	printf("%d\n",e);
	int e1 = Pop(&S);
	printf("%d\n",e1);
	int e2 = Pop(&S);
	printf("%d\n",e2);
	
	return 0;
}

连锁团队是指采用链式存储结构实现的队列。和顺序队列一样链对也需要队头和队尾游标,并以链表为存储结构。链队就是后插法创建链表。

. . .

相关推荐

额外说明

使用hutool实现邮件发送功能

 如何利用hutool工具包实现邮件发送功能呢? 1、首先引入hutool依赖 <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId>

额外说明

MATLAB蒙特卡罗法求圆周率(详细代码解释)

一 计算原理         一个正方形内部内切一个圆,设圆的半径为r,则正方体的边长为2r。在该正方体内部,随机投掷n个均匀分布的点,统计投掷点在圆内的与总点数的比例,得出圆的近似面积,就是π的值。理论上,n越大,实验次数越多,计算得出的π的值就越精准

额外说明

逆波兰表达式

逆波兰表达式又称作后缀表达式,在四则混合运算的程序设计中用到。 例如: 1+2写成后缀表达式就是12+ 4+5*(3-2)的后缀表达式就是4532-*+ 后缀表达式在四则运算中带来了意想不到的方便,在生成过程中自动保持了优先级; 生成逆波兰表达式的算法如

额外说明

树苺派-新手入门

树苺派 QQ 1285575001 Wechat M010527 技术交流 QQ群599020441 纪年科技aming 树莓派2B,CPU是4核900MHz,内存1GB 更新源 nano /etc/apt/sources.list deb http:/

额外说明

java面试基础题,学习笔记!

JAVA 1:简述Java的基本历史 java起源于SUN公司的一个GREEN的项目,其原先目的是为家用消费电子产品 发送一个信息的分布式代码系统,通过发送信息控制电视机、冰箱等. 2:简单写出Java特点,写出5个以上,越多越好 简单的、面向对象的、分

额外说明

VC++分别使用WinExec、CreateProcess、ShellExecute和ShellExecuteEx来启动程序(附源码)

VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新.

额外说明

【玩转Linux操作】详细讲解 Linux分区&&磁盘 操作以及相关的命令

-专栏【玩转Linux操作】 -喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 -音乐分享【Counting Stars 】 欢迎并且感谢大家指出小吉的问题- 文章目录 -什么是Linux的分区 -Linux分区的作用 -Linux分区的原理介绍 -查看所

额外说明

Angular开发(十一)-关于响应式表单及表单的校验

一、响应式表单定义 响应式表单:我们在组件中创建表单控件的对象树,并使用特定的方式将绑定到组件模板中的原声表单控件元素上 二、响应式表单的好处 我们可以在组件类中直接创建和维护表单控件对象。由于组件类可以同时访问数据模型和表单控件结构, 因此我们可以把表

额外说明

yolo,mAP, F1值, 召回率(Recall),精确率(Precision),(TP,TN,FP,FN),交除并(Intersection-over-Union(IoU))

一.深度学习中的F1值 1.1 公式 F1 = 2 * (精确度 * 召回率) / (精确度 + 召回率) 1.2 是什么? F1也叫F1-Score或者F1-Measure,F1值是精确度和召回率的调和平均数。 1.3 作用 评估模型在检测任务中的精

额外说明

解决系统丢失datime.dll文件无法启动软件问题

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个datime.dll文件(挑

ads via 小工具