数据结构——循环队列(数组)

news2024/11/25 11:51:54

一、循环队列的定义

二、循环队列图示

 

三、循环队列使用规则 

为解决队满和队空的判断条件相同。

我们 采用  损失一个单元不用的方法

即当循环队列元素的个数是MAXSIZE-1时,就认为队列已满(front指向空的单元)

这样循环队列的队满条件就变成 :

(rear+1)%MAXSIZE==front

循环队列的队空条件依旧是:

front==rear

 

四、循环队列的代码 

#define MAXSIZE 4     

typedef int DataType;
typedef struct
{
    DataType data[MAXSIZE];  //实际上只能存MAXSIZE-1 个数据
    int front;
    int rear;
}SeqQueue;

//损失一个单元不用,即当循环队列中元素个数是MAXSIZE-1时,就认为队列已经满了
//front指向那个不使用的单元
//循环队列的队满的条件就是(rear+1)%MAXSIZE==front
//队空的条件是  front==rear

//初始化队列
void InitQueue(SeqQueue* Q)//初始化队列函数
{
    Q->front = Q->rear = 0;//指针初始化
}

//判断是否为空
int  EmptyQueue(SeqQueue* Q)//判断队空函数
{
    if (Q->front == Q->rear)//队列为空
        return 1;
    else
        return 0;
}

//判断是否为满
int  FullQueue(SeqQueue* Q)//判断队满函数
{
    if (Q->front == (Q->rear + 1) % MAXSIZE)//队尾指针加上1,再取余MAXSIZE的值如果等于队头指针,说明队列为满
        return 1;
    else
        return 0;
}

//入队操作
void InQueue(SeqQueue* Q, DataType x)//入队函数
{
    if (FullQueue(Q))
    {
        printf("队列已满,无法继续入队\n");
        return;
    }
    else
    {
        Q->rear = (Q->rear + 1) % MAXSIZE;//更新队尾指针rear,队尾指针加1再取余MAXSIZE,将数组形成一个循环
        Q->data[Q->rear] = x;//将入队的数据放到队列数组,更新后的rear所指向的位置
    }
}

//出队操作
void DeQueue(SeqQueue* Q)//出队函数
{
    if (EmptyQueue(Q))
    {
        printf("队列已空,无法继续出队\n");
        return;
    }
    else
    {
        Q->front = (Q->front + 1) % MAXSIZE; //更新队头指针front, 队头指针加1再取余MAXSIZE, 将数组形成一个循环
    }
}

//取队头操作
DataType GetFront(SeqQueue* Q)//取队头函数
{
    if (EmptyQueue(Q))
    {
        printf("队列已空,无队头元素\n");
        return 0;
    }
    else
    {
        int t;  //因为front指向的位置无元素,队头元素在front指向的后一位
        t = (Q->front + 1) % MAXSIZE; //将 队头指针加1再取余MAXSIZE 的值赋给t
        return Q->data[t]; //返回数组中下标为t的元素
    }
}

void ShowQueue(SeqQueue* Q)//显示队中元素函数
{
    int p = Q->front;
    if (p == Q->rear)
        printf("队列为空,无元素!\n");
    else
    {
        printf("\n从队头起队列中的个元素为:");
        while (p != Q->rear)
        {
            printf("%5d", Q->data[(p + 1) % MAXSIZE]);
            p++;        
            p %= MAXSIZE; //使得p能从数组的首位地址重新遍历,形成循环,打印出所有的数组元素

        }
    }
}

五、循环队列的函数使用

1.入队函数:InQueue

int main()
{
    SeqQueue SQ;
    InitQueue(&SQ);//初始化
    InQueue(&SQ, 3);//入队
    InQueue(&SQ, 4);//入队
    InQueue(&SQ, 5);//入队
    //插入3次,满了
   
    InQueue(&SQ, 5);//第四次插入不了

    ShowQueue(&SQ);//打印数组中所有的值
    return 0;
}

 结果:

插入3次,满了。第四次插入不了

 

 2.取队头函数GetFront

int main()
{
    SeqQueue SQ;
    InitQueue(&SQ);//初始化
    InQueue(&SQ, 3);//入队
    InQueue(&SQ, 4);//入队
    InQueue(&SQ, 5);//入队
    //插入3次,满了
   
    printf("循环队列中的元素依次是:");
    ShowQueue(&SQ);//打印数组中所有的值
    printf("\n");

    DataType x = GetFront(&SQ);//取队头元素
    printf("\n队头元素是:%d \n", x);
    return 0;
}

结果:

 

3.出队函数DeQueue

int main()
{
    SeqQueue SQ;
    InitQueue(&SQ);//初始化
    InQueue(&SQ, 3);//入队
    InQueue(&SQ, 4);//入队
    InQueue(&SQ, 5);//入队
    //插入3次,满了
   
    printf("循环队列中的元素依次是:");
    ShowQueue(&SQ);//打印数组中所有的值
    printf("\n\n");

    DeQueue(&SQ);//出队一次
    InQueue(&SQ,99);//出队之后,再入队一次
    printf("操作后循环队列中的元素依次是:");
    ShowQueue(&SQ);//打印数组中所有的值

    return 0;
}

结果;

出队之后,再入队一次,打印新的循环队列

六、心得体会

  1. 队列是一种运算受限制的线性表,插入在队尾,删除在队头。
  2. 队列的逻辑结构和线性表也相同,数据元素之间存在一对一的关系,它的主要特性是先进先出
  3. 循环队列是队列的一种顺序表示和实现方法。与顺序栈类似,在队列的顺序存储结构中,用一组地址连续的存储单元依次存放从队头到队尾的元素。
  4. 由于队列中队头和队尾的位置都是动态变化的,因此需要附设两个指针front和rear,分别知识队头元素和队尾元素在数组中的位置。
  5. 普通的顺序队列会有假溢出,一个巧妙的办法就是将顺序队列的数组看成一个环状的空间,即规定最后一个单元的后继为第一个单元,我们形象地称之为循环队列。

 

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

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

相关文章

提升文本到图像模型的空间一致性:SPRIGHT数据集与训练技术的新进展

当前的T2I模型,如Stable Diffusion和DALL-E,虽然在生成高分辨率、逼真图像方面取得了成功,但在空间一致性方面存在不足。这些模型往往无法精确地按照文本提示中描述的空间关系来生成图像。为了解决这一问题,研究人员进行了深入分析…

vivado Virtex UltraScale 配置存储器器件

Virtex UltraScale 配置存储器器件 下表所示闪存器件支持通过 Vivado 软件对 Virtex UltraScale ™ 器件执行擦除、空白检查、编程和验证等配置操作。 本附录中的表格所列赛灵思系列非易失性存储器将不断保持更新 , 并支持通过 Vivado 软件对其中所列非易失…

交易复盘-20240513

仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整,采用龙空龙模式 一支股票 10%的时候可以操作, 90%的时间适合空仓等待 双成药业 (1)|[9:30]|[3566万]|0.34 中通客车 (1)|[9:43]|[7678万]|0.15 嘉华股份 (2)|[9:30]|[36…

分类预测 | Matlab实现DBO-CNN-SVM蜣螂算法优化卷积神经网络结合支持向量机多特征分类预测

分类预测 | Matlab实现DBO-CNN-SVM蜣螂算法优化卷积神经网络结合支持向量机多特征分类预测 目录 分类预测 | Matlab实现DBO-CNN-SVM蜣螂算法优化卷积神经网络结合支持向量机多特征分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现DBO-CNN-SVM蜣螂算法…

【软设】常见易错题汇总

目录 计算机系统基础 程序语言基础 数据结构 算法设计与分析 计算机网络与信息安全 软件工程基础 开发方法(结构化与面向对象) 数据库 操作系统 知识产权相关的法律法规 🤯🤯🤯🤯🤯&#x1f9…

2024最新软件测试【测试理论+ 数据库】面试题(内附答案)

一、测试理论 3.1 你们原来项目的测试流程是怎么样的? 我们的测试流程主要有三个阶段:需求了解分析、测试准备、测试执行。 1、需求了解分析阶段 我们的 SE 会把需求文档给我们自己先去了解一到两天这样,之后我们会有一个需求澄清会议, …

外卖系统微信小程序支付

微信小程序支付时序图 其中第9.步骤就是微信小程序前端调用wx.requestPayment

如何写好网评文章?写好了怎么去投稿呢,教程来了

如何写好网评文章,可谓仁者见仁、智者见智。俗话说:“冰冻三尺非一日之寒。”写好网评文章决不是一朝一夕能够练成的,是一个漫长的修炼的过程,需要我们耐得住寂寞、静得下心神。从事网评写作六年多,我有一些心得体会和…

Linux-磁盘管理类实训

一、Linux分区和磁盘操作命令 (1)将系统内所有的分区(文件系统)列出来) (2)将系统中所有特殊文件格式及名称都列出来 (3)将/bin下面的可以用的磁盘容量以易读的容量格式…

Dev-C++的下载和安装教程(超详细图文,小白入门)

Dev-C(或者叫做Dev-Cpp)是Windows环境下的一个轻量级C/C集成开发环境(IDE)。它是一款自由软件,遵守GPL许可协议分发源代码。 Dev-C集合了功能强大的源码编辑器、MingW64/TDM-GCC编译器、GDB调试器和AStyle格式整理器等…

通过ip addr命令无法获取到ip地址,无法ping通百度

问题 今天通过VM安装CentOS虚拟机时,安装完成后,想查看ip地址,使用ip addr命令,发现没有展示网络ip地址,ping百度也不通。 解决方案 CentOS使用网络配置文件来设置网络接口的参数,出现这个问题说明网络的…

初识C++ · string的使用(1)

目录 1 STL简介 2 string类 2.1 构造 析构 拷贝 2.2 size length 2.3 [ ]的使用 2.4 迭代器 2.5 Push_Back和append 3 sort的使用 1 STL简介 STL是一个标准库,是C标准库的一个重要部分,那么什么是STL?STL是一个模板库,包…

Python自动化测试 | 如何使用Robot Framework进行自动化测试?

你还在手动测试?不妨了解一下更高效、准确且简单的测试方法——使用Python的Robot Framework进行自动化测试。 什么是Robot Framework? Robot Framework是一款开源的Python自动化测试框架,它基于关键字驱动的思想,具有易读、易扩…

Day_4

1. 地址簿功能 查询地址列表 属于常规方案 新增地址 属于常规方案 修改地址 删除地址 设置默认地址 2. 用户下单业务 数据库分析 订单表和订单明细表的关系:一对多 代码开发 controller 层 service 层 异常处理(收货地址为空、超出配送范围、购物…

使用规则进行命名实体识别(NER)

使用规则进行命名实体识别(NER) 命名实体识别(Named Entity Recognition,NER)是自然语言处理(NLP)中的一项基础任务,它旨在从文本中识别出具有特定意义的实体,如人名、地…

【Unity从零开始学习制作手机游戏】第01节:控制3D胶囊体运动

1. 新建Project L01 使用3D Mobile模板。 2. 建立一个平面,用来承载物体 3. 导入Unity库内的胶囊体 下载 StandardAssets https://download.unitychina.cn/download_unity/e80cc3114ac1/WindowsStandardAssetsInstaller/UnityStandardAssetsSetup-5.6.7f1.exe …

STM32真的是很落后吗?

STM32 真的是很落后吗?这是一个值得探讨的问题。 STM32 是意法半导体(STMicroelectronics)推出的一款 32 位微控制器,它在嵌入式领域有着广泛的应用。虽然我对 Python 的了解有限,无法直接对 STM32 进行深入的比较&am…

系统定时器(SysTick)

介绍SysTick SysTick结构框图 时钟选择 计数器部分 中断部分 工作流程 相关寄存器 配置流程 相关库函数

【Nginx】如何在 Nginx 中阻止来自特定国家的 IP 地址访问

文章目录 前言一、准备工作二、查看 Nginx 服务器都拥有哪些模块2.1 先查看本地nginx是否有ngx_http_geoip2模块2.2 安装nginx并配置ngx_http_geoip2模块2.2.1下载所需版本的nginx到服务器2.2.2 先安装所需依赖2.2.3 解压文件2.2.4 下载ngx_http_geoip2模块2.2.5 编译安装nginx…

linux笔记5--shell命令2

文章目录 一. linux中的任务管理1. 图形界面2. 命令① top命令② grep命令③ ps命令补充: ④ kill命令图形界面杀死进程 二. 挂载(硬盘方面最重要的一个知识点)1. 什么是挂载2. 关于挂载目录① Windows② linux查看硬件分区情况(/dev下):更改挂载目录结束…