循环队列、循环队列的基本操作

我要成为嵌入式高手之3月22日数据结构第五天!!
————————————————————————————

顺序队列

存在问题:假溢出——解决办法:循环队列

空队列、满队列如何判断?

满队列:rear + 1 = front

空队列:rear = front

循环队列

相当于数组

由于有一个指针始终要进行判断队列,所以只有n-1个数据

1、创建

SEQ_QUE *CreateSqeQueue(int max)
{
    SEQ_QUE *pseq = malloc(sizeof(SEQ_QUE));
    if (NULL == pseq)
    {
        perror("fail to malloc");
        return NULL;
    }

    pseq->pbase = malloc(max*sizeof(DATA_TYPE));
    if (NULL == pseq->pbase)
    {
        perror("fail to malloc");
        return NULL;
    }

    pseq->front = 0;
    pseq->rear = 0;
    pseq->size = max;

    return pseq;
}

2、判断是否为满队列

/* 满队列 */
int FullOfSeq(SEQ_QUE *pseq)
{
    if ((pseq->rear+1) % pseq->size == pseq->front)//尾的下一个是头
    {
        return 1;
    }
    return 0;
}

3、判断是否为空队列

/* 空队列 */
int EmptyOfSeq(SEQ_QUE *pseq)
{
    if (pseq->front == pseq->rear)//头和尾相同
    {
        return 1;
    }
    return 0;
}

4、入队

int JoinInSeq(SEQ_QUE *pseq, DATA_TYPE data)
{
    if (FullOfSeq(pseq))
    {
        return -1;
    }

    pseq->pbase[pseq->rear] = data;
    pseq->rear = (pseq->rear+1) % pseq->size;

    return 0;
}

5、遍历

int SearchQueAll(SEQ_QUE *pseq)
{
    int i = pseq->front;
    while (i != pseq->rear)
    {
        printf("%d ", pseq->pbase[i]);
        i = (i+1) % pseq->size;
    }
    putchar('\n');

    return 0;
}

6、出队

int PopInSeq(SEQ_QUE *pseq, DATA_TYPE *pdata)
{
    if (EmptyOfSeq(pseq))
    {
        return -1;
    }

    if (pdata != NULL)
    {
        *pdata = pseq->pbase[pseq->front];
    }

    pseq->front = (pseq->front+1) % pseq->size;

    return 0;
}

7、清空队列

void ClearSeq(SEQ_QUE *pseq)
{
    pseq->front = pseq->rear = 0;
}
//头和尾相同且为0,意为清空队列

8、销毁队列

void DestroySeq(SEQ_QUE *pseq)
{
    free(pseq->pbase);
    free(pseq);
}

总程序:

head.h

#ifndef _HEAD_H
#define _HEAD_H

#include <stdio.h>
#include <stdlib.h>

typedef int DATA_TYPE;

typedef struct que
{
    DATA_TYPE *pbase;
    int front;
    int rear;
    int size;
}SEQ_QUE;

extern SEQ_QUE *CreateSqeQueue(int max);
extern int JoinInSeq(SEQ_QUE *pseq, DATA_TYPE data);
extern int SearchQueAll(SEQ_QUE *pseq);
extern int PopInSeq(SEQ_QUE *pseq, DATA_TYPE *pdata);
extern void ClearSeq(SEQ_QUE *pseq);
extern void DestroySeq(SEQ_QUE *pseq);

#endif

queue.c


#include "head.h"

SEQ_QUE *CreateSqeQueue(int max)
{
    SEQ_QUE *pseq = malloc(sizeof(SEQ_QUE));
    if (NULL == pseq)
    {
        perror("fail to malloc");
        return NULL;
    }

    pseq->pbase = malloc(max*sizeof(DATA_TYPE));
    if (NULL == pseq->pbase)
    {
        perror("fail to malloc");
        return NULL;
    }

    pseq->front = 0;
    pseq->rear = 0;
    pseq->size = max;

    return pseq;
}

/* 满队列 */
int FullOfSeq(SEQ_QUE *pseq)
{
    if ((pseq->rear+1) % pseq->size == pseq->front)//尾的下一个是头
    {
        return 1;
    }
    return 0;
}

/* 空队列 */
int EmptyOfSeq(SEQ_QUE *pseq)
{
    if (pseq->front == pseq->rear)//头和尾相同
    {
        return 1;
    }
    return 0;
}

int JoinInSeq(SEQ_QUE *pseq, DATA_TYPE data)
{
    if (FullOfSeq(pseq))
    {
        return -1;
    }

    pseq->pbase[pseq->rear] = data;
    pseq->rear = (pseq->rear+1) % pseq->size;

    return 0;
}

int SearchQueAll(SEQ_QUE *pseq)
{
    int i = pseq->front;
    while (i != pseq->rear)
    {
        printf("%d ", pseq->pbase[i]);
        i = (i+1) % pseq->size;
    }
    putchar('\n');

    return 0;
}

int PopInSeq(SEQ_QUE *pseq, DATA_TYPE *pdata)
{
    if (EmptyOfSeq(pseq))
    {
        return -1;
    }

    if (pdata != NULL)
    {
        *pdata = pseq->pbase[pseq->front];
    }

    pseq->front = (pseq->front+1) % pseq->size;

    return 0;
}

void ClearSeq(SEQ_QUE *pseq)
{
    pseq->front = pseq->rear = 0;
}

void DestroySeq(SEQ_QUE *pseq)
{
    free(pseq->pbase);
    free(pseq);
}

 main.c

#include "head.h"

int main(void)
{
    DATA_TYPE data;
    SEQ_QUE *pseq = CreateSqeQueue(2);
    if (NULL == pseq)
    {
        perror("fail to create!");
        return -1;
    }
    JoinInSeq(pseq, 1);
    JoinInSeq(pseq, 2);
    JoinInSeq(pseq, 3);
    SearchQueAll(pseq);
    
    

    return 0;
}

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

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

相关文章

一图详解 UVM phase机制

UVM验证环境构建时&#xff0c;引入 phase机制 &#xff0c;通过该机制可以很清晰的 将UVM仿真阶段层次化 。这里层次化&#xff0c;不仅仅是 各个phase的执行顺序 &#xff0c;还有 同一phase中的层次化组件之间phase也有先后关系 。 phase函数/任务执行顺序功能典型应用buil…

Java22已发布,支持SpringBoot3.3.0正式版

Java22已发布&#xff0c;支持SpringBoot3.3.0正式版 文章目录 Java22已发布&#xff0c;支持SpringBoot3.3.0正式版1. JDK22现已推出&#xff01;2. Java22的新功能1. 语言改进1. 语言预览 2. 库文件3. 性能4. 工具 3. 资源 Java 22现已发布 下一个Java版本提高了Java应用程序…

python绘图matplotlib——使用记录1

本博文来自于网络收集&#xff0c;如有侵权请联系删除 使用matplotlib绘图 1 常用函数汇总1.1 plot1.2 legend1.3 scatter1.4 xlim1.5 xlabel1.6 grid1.7 axhline1.7 axvspan1.8 annotate1.9 text1.10 title 2 常见图形绘制2.1 bar——柱状图2.2 barh——条形图2.3 hist——直…

计算机三级——网络技术(综合题第五题)

第一题 填写路由器RG的路由表项①至④。 目的网络&#xff0f;掩码长度输出端口输出端口172.19.63.192&#xff0f;30S0(直接连接)172.19.63.188&#xff0f;30S1(直接连接) 路由器RG的S0的IP地址是172.19.63.193&#xff0c;路由器RE的S0的IP地址是172.19.63.194。 【解析】…

【Hive】HIVE运行卡死没反应

Hive运行卡死 再次强调 hive&#xff1a;小兄弟&#xff0c;没想到吧&#xff0c;咱可不是随便的人。&#x1f604; 那么&#xff0c;这次又遇见了hadoop问题&#xff0c;问题描述是这样的。 hive> insert into test values(1, nucty, 男); Query ID atguigu_202403241754…

Spring Boot整合Spring Security

Spring Boot 专栏&#xff1a;Spring Boot 从零单排 Spring Cloud 专栏&#xff1a;Spring Cloud 从零单排 GitHub&#xff1a;SpringBootDemo Gitee&#xff1a;SpringBootDemo Spring Security是针对Spring项目的安全框架&#xff0c;也是Spring Boot底层安全模块的默认技术…

MRC是谁?- 媒体评级委员会 Media Rating Council

在在线广告的世界里&#xff0c;有许多不同的技术和实践用于提供和衡量广告。对于广告商、出版商和营销人员来说&#xff0c;了解这些技术是如何工作的以及如何有效使用这些技术很重要。在这方面发挥关键作用的一个组织是媒体评级委员会&#xff08;MRC&#xff09;。 1. 了解…

[Linux]文件系统

1.理解文件系统 Linux磁盘文件特性&#xff1a;内容加属性&#xff0c;内容大小是不确定的&#xff0c;但是属性大小是一定的&#xff0c;并且内容和属性是分开存储的。文件属性是用一个结构体来定义的&#xff0c;在Linux中&#xff0c;该结构体是固定128字节大小如下代码: …

LC 98.验证二叉搜索树

98.验证二叉搜索树 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例…

Vue cli创建项目时键盘操作无效;vue3.0项目搭建自定义配置

一. 问题描述 在创建vue3.0项目时&#xff0c;在建好的文件夹&#xff0c;鼠标右键 git bash 使用 vue create my-vue3.0创建新项目时&#xff0c;键盘方向键失效&#xff0c;无法选中对应的选项&#xff08;交互提示符不工作&#xff09; 解决方案&#xff1a; 方案一 使用…

架构评估方法相关知识总结

一、架构评估中的重要概念 定义&#xff1a;软件架构评估是在对架构分析、评估的基础上&#xff0c;对架构策略的选取进行决策。 常用系统架构评估的方式&#xff1a; 1. 基于调查问卷或检查表的方法&#xff1a;该方法的关键是设计好问卷或检查表。缺点是在很大 程度上依赖于评…

华为北向网管NCE开发教程(5)打包org.omg.CosNotification找不到

1问题描述 在IDE中&#xff0c;代码能正常运行&#xff0c;但是打包的时候&#xff0c;会抱不到一些类 2问题原因 导入的本地包中&#xff0c;能在IDE中找到&#xff0c;但是在使用maven打包时&#xff0c;maven找不到这些依赖包 3解决办法 将依赖包通过maven安装到maven…

算法沉淀 —— 动态规划篇(斐波那契数列模型)

算法沉淀 —— 动态规划篇&#xff08;斐波那契数列模型&#xff09; 前言一、第 N 个泰波那契数二、三步问题三、使用最小花费爬楼梯四、解码方法 前言 几乎所有的动态规划问题大致可分为以下5个步骤&#xff0c;后续所有问题分析都将基于此 1.、状态表示&#xff1a;通常状态…

Matlab|【免费】基于数据驱动的模型预测控制电力系统机组组合优化

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现文章《Feature-Driven Economic Improvement for Network-Constrained Unit Commitment: A Closed-Loop Predict-and-Optimize Framework》&#xff0c;程序主要做的是一个基于数据驱动的电力系统机…

YOLO算法改进Backbone系列之:CoaT

在本文中&#xff0c;我们提出了co-scale conv-attention image transformer&#xff08;CoaT&#xff09;&#xff0c;这是一种基于Transformer的图像分类器&#xff0c;配备了co-scale和conv-attention机制。首先&#xff0c;co-scale机制在各个尺度上保持Transformer编码器支…

09、ArrayList

ArrayList 文章目录 ArrayList集合与数组ArrayList集合进阶集合体系结构Collection集合List集合&#xff08;接口&#xff09;数据结构ArrayList集合LinkedList集合 Set集合HashSet 双列集合创建不可变集合 集合与数组 自动扩容 无法存储基本数据类型&#xff0c;只能将其变为…

【C++】CC++内存管理

目录 一、C/C内存分布二 、C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free三、 C内存管理方式3.1 new/delete操作内置类型3.2 new和delete操作自定义类型3.3 长度域 四、operator new与operator delete函数五、new和delete的实现原理5.1 内置类型5.2 自定义类…

K8S--水平自动扩缩容实战演练

原文网址&#xff1a;K8S--水平自动扩缩容实战演练-CSDN博客 简介 本文用实例来展示K8S的自动扩缩容&#xff08;水平方向&#xff09;。 官网网址 HorizontalPodAutoscaler 演练 | Kubernetes 为 Pod 和容器管理资源 | Kubernetes 水平扩缩的原理 水平扩缩容&#xff…

阿里云-零基础入门NLP【基于深度学习的文本分类3-BERT】

文章目录 学习过程赛题理解学习目标赛题数据数据标签评测指标解题思路BERT代码 学习过程 20年当时自身功底是比较零基础(会写些基础的Python[三个科学计算包]数据分析)&#xff0c;一开始看这块其实挺懵的&#xff0c;不会就去问百度或其他人&#xff0c;当时遇见困难挺害怕的…

NKCTF2024-Eznative

首先使用blutter解析&#xff0c;拿到如上的output文件 先看看asm 都被混淆了&#xff0c;真的是太可恶了。 查看libapp.so的内容 一点符号都不给&#xff0c;首先我们使用LoadScript File去添加一部分符号 加载之前解析的 恢复了一部分&#xff0c;但是没有什么乱用啊 这个时候…