数据结构-3.5.队列的顺序实现


一.队列的顺序实现,初始化操作以及判断队列是否为空:

1.图解:

2.代码:

#include<stdio.h>
#define MaxSize 10 //定义一个队列最多存储的元素个数 
​
typedef struct
{
    int data[MaxSize]; //用静态数组存放队列元素
    int front; //队头指针,队头删除元素 
    int rear; //队尾指针,队尾插入元素 
}SqQueue; 
​
//初始化队列
void InitQueue(SqQueue &Q)
{
    //初始时,队头和队尾指针都指向0 
    Q.front=0;//对头一开始就为0即第一个位置 
    Q.rear=0;//队尾指针指向下一个插入元素的位置,一开始没元素,下一个当然插在第一个位置即0索引处 
} 
​
//判断队列是否为空
bool QueueEmpty(SqQueue Q)
{
    if( Q.rear==Q.front ) //Q.rear==Q.front为队空条件 
    {
        return true; //代表队列为空 
    }
    else
    {
        return false; //代表队列不为空 
    } 
} 
​
int main()
{
    SqQueue Q; //声明一个队列(顺序存储)
    InitQueue(Q);
    //后续操作。。。 
    return 0;
}

二.队尾元素入队操作(添加数据元素):

1.图解:

a.判断队列是否已满:

b.举例,假设队尾指针指向9:

c.添加元素后:

d.队尾指针进行Q.rear = (Q.rear+1)%MaxSize操作后:对队列最大存储空间取模求出还能存几个元素

e.由于对队尾指针进行的操作是取余运算,会不断地从上到下的循环(比如除以3,余数只会是0,1,2),因此形成了一个闭环:

f.上述就是一个循环队列,循环队列还可以解决如下的队列假溢出的情况:

g.继续刚才的例子,此时还有空闲的空间,因此可以继续插入新的数据元素:

h.同时需要队尾指针不断的后移:

i.当队列只剩最后一个存储空间时,就认为此时队列已经满了:

可能会问,此时不是还剩一个存储空间吗,为什么认为满了呢,但需要注意的是,初始化队列时,队头指针和队尾指针是指向了同一个位置,因此判断是否队列已经满了,也需要看队头指针和队尾指针是否指向了同一个位置

(注:队尾指针指向下一个插入元素的位置)

j.总结:

2.代码:

#include<stdio.h>
#define MaxSize 10 //定义一个队列最多存储的元素个数 
​
typedef struct
{
    int data[MaxSize]; //用静态数组存放队列元素
    int front; //队头指针,队头删除元素 
    int rear; //队尾指针,队尾插入元素 
}SqQueue; 
​
//初始化队列
void InitQueue(SqQueue &Q)
{
    //初始时,队头和队尾指针都指向0 
    Q.front=0;//对头一开始就为0即第一个位置 
    Q.rear=0;//队尾指向下一个插入元素的位置,一开始没元素,下一个当然插在第一个位置即0索引处 
} 
​
//判断队列是否为空
bool QueueEmpty(SqQueue Q)
{
    if( Q.rear==Q.front ) //Q.rear==Q.front为队空条件 
    {
        return true; //代表队列为空 
    }
    else
    {
        return false; //代表队列不为空 
    } 
} 
​
//入队
bool EnQueue(SqQueue &Q,int x)
{
    if( (Q.rear+1)%MaxSize==Q.front )
    {
        return false;//此时队满,返回false 
    }
    //此时队没满
    Q.data[ Q.rear ] = x; 
    /*新元素插入队尾,应该插在Q.rear处,
    因为Q.rear队尾指针指向下一个插入元素的位置,而新插入的x刚好就要在
    下一个插入元素的位置*/
    Q.rear = (Q.rear+1)%MaxSize; //队尾指针加一取模 
    return true;
} 
​
int main()
{
    SqQueue Q; //声明一个队列(顺序存储)
    InitQueue(Q);
    //后续操作。。。 
    return 0;
}

三.队头元素出队操作(删除数据元素):

1.图解:

注:这里x有&,调用完函数后x也就跟着改变了 ,x就是被删除的那个元素,队头指针后移就相当于删除了一个元素:

a.Q.front = (Q.front+1)%MaxSize,也需要对MaxSize取模,这样才能让front循环移动:

b.每次出队的都是front指针所指向的元素即x = Q.data[Q.front],并且队头指针会向后移一位:

c.当队头指针和队尾指针再次指向同一个位置时,此时队列已经被取空,此时不能再进行出队操作:

2.代码:

#include<stdio.h>
#define MaxSize 10 //定义一个队列最多存储的元素个数 
​
typedef struct
{
    int data[MaxSize]; //用静态数组存放队列元素
    int front; //队头指针,队头删除元素 
    int rear; //队尾指针,队尾插入元素 
}SqQueue; 
​
//出队(删除一个队头元素,并用x返回)
bool DeQueue(SqQueue &Q,int &x) //这里x有&,调用完函数后x也就跟着改变了 
{
    if( Q.rear==Q.front ) //首先要判断队列是否为空,因为空队列无法删除元素 
    {
        return false; //此时队列为空 
    }
    //此时队列不为空
    x = Q.data[Q.front];//把队头指针指向的元素赋值给变量x 
    Q.front = (Q.front+1)%MaxSize;//队头指针后移一位,也需要对MaxSize取模,这样才能让front循环移动 
    return true; 
} 
​
int main()
{
    return 0;
}

四.查找队列中的元素:

1.图解:

通常只需要查询或者只需要读取队列中队头的元素:

获得队头元素的值即查找元素,用x返回。这里x有&,调用完函数后x也就跟着改变了,变为队头元素; x就是队头元素,获取到队头元素后可以与要查找的元素比较。

2.代码:

#include<stdio.h>
#define MaxSize 10 //定义一个队列最多存储的元素个数 
​
typedef struct
{
    int data[MaxSize]; //用静态数组存放队列元素
    int front; //队头指针,队头删除元素 
    int rear; //队尾指针,队尾插入元素 
}SqQueue; 
​
//获得队头元素的值即查找元素,用x返回
/*这里x有&,调用完函数后x也就跟着改变了,变为队头元素; 
  x就是队头元素,获取到队头元素后可以与要查找的元素比较*/
  //相比出队操作,就少了一个Q.front = (Q.front+1)%MaxSize,就不让队头指针后移 
bool GetHead(SqQueue Q,int &x)
{
    if( Q.rear==Q.front )//需要判断队列是否为空,空队列无法查找元素 
    {
        return false;//队空返回false 
    }
    //此时队列不为空
    x = Q.data[Q.front];
    return true; 
}
​
int main()
{
    return 0;
}

五.判断队列已满,已空:

1.队列此时已有的元素个数计算公式:

(队尾指针+队列最多存储个数-队头指针)%队列最多存储个数

2.方案一:牺牲一个存储空间来判断队列已满,已空

3.方案二:无需牺牲一个存储空间即可判断队列已满,已空

思路:在定义结构体队列时定义一个变量size,用来记录队列当前长度,size初始值为0,因为一开始没元素,

只要有元素入队,size自增;只要有元素出队,size自减

4.方案三:无需牺牲一个存储空间即可判断队列已满,已空

思路:在定义结构体队列时定义一个变量tag,初始化时tag为0,因为一开始没元素,可以认为是删除后才没元素

当tag为0时表示最近一次执行了一次删除操作,

当tag为1时表示最近一次执行了一次插入操作,


六.其他出题方式:

1.如果队尾指针指向最后一个元素而不是下一个元素要插入的位置,那么入队时就需要先让队尾指针后移一个位置,

腾出位置来添加元素,最后再添加元素

2.如果队尾指针指向最后一个元素而不是下一个元素要插入的位置,那么在初始化时,队头指针指向第一个位置,

队尾指针指向最后一个位置->这样的话在元素入队时就会先队尾指针后移一个位置,再取余就可以了


七.总结:

注:静态数组大小已经确定,因此要用模运算(取余运算)来重复地利用静态数组中各个空闲的存储空间。


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【springboot】整合沙箱支付

目录 1. 配置沙箱应用环境2. 配置springboot项目1. 引入依赖2. 配置文件注册下载ngrok 3. 创建支付宝支付服务类4. 支付界面模板5. 控制类实现支付6. 测试 1. 配置沙箱应用环境 使用支付宝账号登录到开放平台控制台。 使用支付宝登录后&#xff0c;看到以下页面&#xff0c;下…

MFC工控项目实例二十二主界面计数背景颜色改变

承接专栏《MFC工控项目实例二十一型号选择界面删除参数按钮禁用切换》 1、在SEAL_PRESSUREDlg.h文件中添加代码 class CSEAL_PRESSUREDlg : public CDialog { public: CBrush m_brush1;CBrush m_brush2;CBrush m_brush3;... } 2、在SEAL_PRESSUREDlg.cpp文件中添加代码 BO…

在2核2G服务器安装部署MySQL数据库可以稳定运行吗?

阿里云2核2G服务器可以安装MySQL数据库吗&#xff1f;当然可以&#xff0c;并且可以稳定运行MySQL数据库&#xff0c;目前阿里云服务器网aliyunfuwuqi.com使用的就是阿里云2核2G服务器&#xff0c;在云服务器上安装MySQL数据库&#xff0c;可以稳定运行。 目前阿腾云用于运行M…

查看 git log的过程中看到 :说明日志输出可能超出屏幕大小,系统进入了分页模式

在命令行提示符中&#xff0c;通常 : 表示系统等待进一步的输入。如果你在查看 git log 的过程中看到 :&#xff0c;说明日志输出可能超出屏幕大小&#xff0c;系统进入了分页模式&#xff0c;默认使用 less 命令查看内容。 此时你可以&#xff1a; 按 q 退出日志查看。按 En…

算法笔记(五)——分治

文章目录 算法笔记&#xff08;五&#xff09;——分治快排颜色分类排序数组数组中的第K个最大元素库存管理 III 归并排序数组交易逆序对的总数计算右侧小于当前元素的个数翻转对 算法笔记&#xff08;五&#xff09;——分治 分治算法字面上的解释是“分而治之”&#xff0c;就…

Python 从入门到实战32(数据库MySQL)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们讨论了数据库编程接口操作的相关知识。今天我们将学习…

【框架篇】过滤器和拦截器的区别以及使用场景

在项目开发中&#xff0c;常常会同时配置拦截器&#xff08;Interceptor&#xff09;和过滤器&#xff08;Filter&#xff09;&#xff0c;以下就是它们两个主要的区别&#xff1a; 过滤器&#xff08;Filter&#xff09; 配置和实现 Filter的实现还是很简单的&#xff0c;可…

【微服务】组件、基础工程构建(day2)

组件 服务注册和发现 微服务模块中&#xff0c;一般是以集群的方式进行部署的&#xff0c;如果我们调用的时候以硬编码的方式&#xff0c;那么当服务出现问题、服务扩缩容等就需要对代码进行修改&#xff0c;这是非常不好的。所以微服务模块中就出现了服务注册和发现组件&…

计算机毕业设计 基于Python的广东旅游数据分析系统的设计与实现 Python+Django+Vue Python爬虫 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

华为云+WordPress+Puock主题搭建个人博客

网站访问地址&#xff1a;qingxuly.cn 搭建网站 购买华为云服务器&#xff0c;购买域名&#xff0c;进行备案&#xff0c;配置域名解析等操作&#xff0c;请参考华为云文档。 安装Ubuntu系统 华为云控制台中给云服务器安装Ubuntu2204。 配置服务器安全组 华为云安全组中创建安…

【嵌入式系统】第18章 脉宽调试器(PWM)

目录 18.1 结构框图 18.3 功能说明 18.3.4 PWM 信号发生器 18.3.5 死区发生器 18.3.6 中断/ADC 触发选择器 18.3.7 同步方法 18.3.8 故障条件 18.3.9 输出控制块 LES 硬件介绍&#xff08;12&#xff09;正交编码接口QEI 19.1 结构框图 19.2 信号描述 19.3 功能说明…

GPG error golang 1.19

1. 问题描述及原因分析 在飞腾2000的服务器&#xff0c;OS为Kylin Linux Advanced Server release V10环境下&#xff0c;docker版本为18.09.0&#xff08;docker-engine-18.09.0-101.ky10.aarch64&#xff09;&#xff0c;基于容器镜像golang:1.19编译新的容器镜像&#xff0…

C++黑暗迷宫

目录 开头程序程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好&#xff0c;我叫这是我58。 程序 #include <iostream> #include <cstdlib> #include <ctime> using namespace std; struct near {int i;int ia;int ix;int iy;int iwalk; }; v…

22.1 k8s不同role级别的服务发现

本节重点介绍 : 服务发现的应用3种采集的k8s服务发现role 容器基础资源指标 role :nodek8s服务组件指标 role :endpoint部署在pod中业务埋点指标 role :pod 服务发现的应用 所有组件将自身指标暴露在各自的服务端口上&#xff0c;prometheus通过pull过来拉取指标但是promet…

SQL中基本SELECT语句及常见关键字的使用(内连接,左/右连接)

这里写目录标题 SQL中基本SELECT语句的使用SQL语法简介DDL、DML、DCLSEECT SELECT常用关键词group by分组having筛选limit限定条数UION和UION ALL合并SQL执行顺序 联表查询多表查询示例特殊用法&#xff1a;笛卡尔积&#xff08;交叉连接&#xff09;等值连接vs非等值连接自连接…

VScode 自定义代码配色方案

vscode是一款高度自定义配置的编辑器, 我们来看看如何使用它自定义配色吧 首先自定义代码配色是什么呢? 看看我的代码界面 简而言之, 就是给你的代码的不同语义(类名, 函数名, 关键字, 变量)等设置不同的颜色, 使得代码的可读性变强. 其实很多主题已经给出了定制好的配色方案…

D3.js中国地图可视化

1、项目介绍 该项目来自Github&#xff0c;基于D3.js中国地图可视化。 D3.js is a JavaScript library for manipulating documents based on data. It uses HTML, SVG, and CSS to display data. The full name of D3 is "Data-Driven Documents," which means it a…

【Flume Kafaka实战】Using Kafka with Flume

一 目标 在Cloudera Manager中创建两个Flume的Agent&#xff0c;Agent1从local file中获取内容&#xff0c;写入到kafka的队列中。Agent2以Agent1的sink作为source&#xff0c;将数据从kafka中读取出来&#xff0c;写入到HDFS中。 二 实战 2.1 Kafka Sink 第一步&#xff0…

828华为云征文|部署多功能集成的协作知识库 AFFiNE

828华为云征文&#xff5c;部署多功能集成的协作知识库 AFFiNE 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 AFFiNE3.1 AFFiNE 介绍3.2 AFFiNE 部署3.3 AFFiNE 使用 四、…

Nginx基础详解5(nginx集群、四七层的负载均衡、Jmeter工具的使用、实验验证集群的性能与单节点的性能)

续Nginx基础详解4&#xff08;location模块、nginx跨域问题的解决、nginx防盗链的设计原理及应用、nginx模块化解剖&#xff09;-CSDN博客 目录 14.nginx集群&#xff08;前传&#xff09; 14.1如何理解单节点和集群的概念 14.2单节点和集群的比较 14.3Nginx中的负载均衡…