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

顺序队列和链队列

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

收录于:152天前

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

在这里插入图片描述

顺序队列底层使用的是数组,所以需要提前申请足够大的内存空间来初始化顺序队列。另外,为了满足顺序队列中的数据从队尾进入,从队头退出,先进先出的要求,我们还需要定义两个指针(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;
}

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

. . .

相关推荐

额外说明

将jenkins放入maven项目中

目录 不同环境,就发不同的yaml,比如dev环境,就放application.yml 和application-dev.yml放开发服务的config目录下     Jenkinsfile文件 ['DEV','SIT', 'PRE']对应的jenkin

额外说明

VMware安装CentOS7,蓝屏现象

0.控制面板\所有控制面板项\程序和功能\启用或关闭Windows功能 ==》勾选“虚拟机平台” 1.使用VMware16 +的软件

额外说明

Clickhouse与mysql主从复制模式MaterializeMySQL引擎实战

1、前言 clickhouse 20.8将新增 MaterializeMySQL引擎 ,可通过binlog日志实时物化mysql数据,极大提升了数仓的查询性能和数据同步的时效性;原有mysql中承担的数据分析工作 可交由clickhouse去做,这么做可

额外说明

Windows开发值得推荐的分析工具,值得收藏

目录 1、概述 2、常用工具介绍 2.1  窗口查看工具SPY++ 2.2  Dependency Walker 2.3  剪切板查看工具Clipbrd

额外说明

《Vue3实战》 第九章 路由

《Vue3实战》篇章整体栏目 ————————————————————————————— 【第一章】node.js/npm安装、配置 【第二章】创建项目和目录结构 【第三章】基础语法 【第四章】条件语句、循环语句 【第五章】计算、监听属性 【第六章】样式

额外说明

使用SpringBoot实现可以动态调整的定时任务

  定时任务需求我们经常需要用到。在实现定时任务的场景中,一类是需要考虑到多节点只能由一个节点来执行的场景,这种定时任务需要能够将执行的记录存入到第三方存储中(比如数据库或者redis),实际的开发中是用一些定时任务的框架来完成(如quartz);另一类

额外说明

前端模拟实现postman的send-and-download进行文件下载

今天在合后端做需求的时候,后端返文件流的形式前端解析并下载 后端接口返回文件流,使用postman的send and download可以直接将文件下载 主要参考第二种 1.刚开始的时候是这种下载 后端返URL前端直接进行下载,创建a标签并下载 expo

额外说明

【Java 进阶篇】Java会话技术之Cookie的存活时间

在Web应用程序中,会话管理是一项关键的任务,用于跟踪用户的活动和保持用户状态。Cookie是会话管理的一种重要方式之一,通过Cookie可以存储有关用户的信息,但这些信息不会永久保留,而是有一个特定的存活时间。本篇博客将详细介绍Java中Cookie的

额外说明

实时处理练习

文章目录 1 提出任务 1.1 实时数据采集 2 完成任务 2.1 创建Flume运行的配置文件 2.2 安装netcat 2.3 启动flume 2.4 启动netcat 2.5 Kafka消费数据 2.5 查看HDFS上的备份数据 1 提出任务 1.

额外说明

业务代码中有很多判断_在线发展业务的15条提示(无需花很多钱)

业务代码中有很多判断 希望在没有大量资金的情况下发展在线业务?如果你刚刚开始创业,那么你就不能浪费钱。在本文中,我们将分享有关如何以小额预算发展业务的实用技巧。我们的目标是帮助您在不花费大量资金的情况下与大公司竞争。 想要在没有大量资金的情况下发展在线业

ads via 小工具