当前位置: 首页 > news >正文

设计循环队列

文章目录

    • 一、循环队列的构建
    • 二、判断是否为空
    • 三、判断队列是否满了
    • 四、队列插入
    • 五、队列的删除
    • 六、队列取头尾

设计循环队列
在这里插入图片描述
下面是队列提供的接口函数

typedef struct {int* a;int k;int front;int rear;
} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* Queue = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));if(Queue==NULL){perror("malloc fail");return NULL;}Queue->a = malloc(sizeof(int)*(k+1));Queue->k=k;Queue->front = Queue->rear=0;return Queue;
}bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->rear == obj->front;
}bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj->rear+1)%(obj->k+1)==obj->front;
}bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if(myCircularQueueIsFull(obj))return false;else{obj->a[obj->rear]=value;obj->rear++;obj->rear%=(obj->k+1);}return true;
}bool myCircularQueueDeQueue(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return false;else{obj->front++;obj->front%=(obj->k+1);}return true;
}int myCircularQueueFront(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;elsereturn obj->a[obj->front];
}int myCircularQueueRear(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;elsereturn obj->a[(obj->rear-1+obj->k+1)%(obj->k+1)];
}void myCircularQueueFree(MyCircularQueue* obj) {free(obj->a);free(obj);
}

一、循环队列的构建

这里我们用数组构建循环队列,因为如果用链表的话需要前后衔接,用双向循环列表,比较麻烦,用数组的话不需要衔接,因为数组是连续的。
然后就是用循环队列里面需要设置front和rear两个整数来判断这个循环队列是否为空或者是否满了
这里的rear必须是指向尾元素的下一个位置

因为这样容易判断队列是否为空,如果不指向下一个元素那么有一个元素的情况下rear和front的值相同,没有元素的情况下rear与front的值还是相同。

typedef struct {int* a;int k;int front;int rear;
} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* Queue = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));if(Queue==NULL){perror("malloc fail");return NULL;}Queue->a = malloc(sizeof(int)*(k+1));Queue->k=k;Queue->front = Queue->rear=0;return Queue;
}

二、判断是否为空

1.没有元素的情况下
在这里插入图片描述
2.有元素的情况下
在这里插入图片描述
在这里插入图片描述

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {return obj->rear == obj->front;
}

三、判断队列是否满了

1.第一种情况
在这里插入图片描述

rear+1 = front

2.第二种情况
在这里插入图片描述

这里的rear需要除以一个周期,因为我们开辟了k+1个空间,所以这里的rear对应的值为k,所以需要+1除以一个周期k+1才能回到最开始的位置
即:(rear+1)%(k+1)==front

bool myCircularQueueIsFull(MyCircularQueue* obj) {return (obj->rear+1)%(obj->k+1)==obj->front;
}

四、队列插入

需要判断这个队列是否满了
然后还有个细节的地方,如下图
在这里插入图片描述

此时的rear需要回到第一个位置,不然后面继续插入数据,数组出现越界访问

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {if(myCircularQueueIsFull(obj))return false;else{obj->a[obj->rear]=value;obj->rear++;obj->rear%=(obj->k+1);}return true;
}

五、队列的删除

基本上与上面的原理差不多

bool myCircularQueueDeQueue(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return false;else{obj->front++;obj->front%=(obj->k+1);}return true;
}

六、队列取头尾

取头很简单,重要的是取尾
取尾我们知道rear-1就是尾,但是我们忽略了一种特殊情况
在这里插入图片描述
这种情况下rear-1为负数,所以我们需要回正,再者考虑其他正常情况,我们需要加上队列的一个周期k+1然后%(k+1)

int myCircularQueueFront(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;elsereturn obj->a[obj->front];
}int myCircularQueueRear(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;elsereturn obj->a[(obj->rear-1+obj->k+1)%(obj->k+1)];
}

相关文章:

设计循环队列

文章目录 一、循环队列的构建二、判断是否为空三、判断队列是否满了四、队列插入五、队列的删除六、队列取头尾 设计循环队列 下面是队列提供的接口函数 typedef struct {int* a;int k;int front;int rear; } MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) {…...

linux文件解压和压缩命令

linux文件解压和压缩命令 1.格式.zip 解压:unzip filename.zip 压缩:zip filename.zip directoryName 2.格式.rar 解压: #解压方式1(会在当前解压目录内产生一个以压缩包名字命名的目录,目录内是解压内容) …...

飞链云:让AI创造价值,让人类享受收益

我梦想有天,每个有能力的人都可以做自己喜欢的事情,都应该去做自己喜欢的事情,并且可以获得应有的收益。 有的人可以称之为“人”,有的人你得称他为鬼,有的人不如畜生。 如今社会,每个人都为了“生活”日…...

[NSSCTF 2nd]MyJs

做一题ejs原型链污染 首先是登录界面 源码里面提示了源码的路由 js不熟先审计一下 const express require(express); #导入Express框架,用于构建Web应用程序的服务器和路由 const bodyParser require(body-parser); #导入body-parser中间件,用于解析…...

NLP-词向量、Word2vec

Word2vec Skip-gram算法的核心部分 我们做什么来计算一个词在中心词的上下文中出现的概率? 似然函数 词已知,它的上下文单词的概率 相乘。 然后所有中心词的这个相乘数 再全部相乘,希望得到最大。 目标函数(代价函数&#xff0…...

Java学习--学生管理系统(残破版)

代码 Main.java import java.util.ArrayList; import java.util.Scanner;public class Main {public static void main(String[] args) {ArrayList<Student> list new ArrayList<>();loop:while (true) {System.out.println("-----欢迎来到阿宝院校学生管理系…...

柯西矩阵介绍

经典定义 柯西矩阵&#xff08;Cauchy Matrix&#xff09;&#xff0c;是一种特殊类型的矩阵&#xff0c;它在数学中的多个领域&#xff0c;包括线性代数、数值分析和插值理论中都有重要应用。柯西矩阵以19世纪法国数学家奥古斯丁-路易柯西的名字命名。 柯西矩阵是一个方阵&am…...

PureFlash v1.9.1特性介绍

PureFlashv1.9.1版本特性主要有4个&#xff1a; 1. 支持RDMA网络 使用RDMA协议可以大大减少对CPU的消耗&#xff0c;性能提升30%以上。 PureFlash的网络配置分为存储节点间网络&#xff08;存储后端网&#xff09;和客户端网络&#xff08;前端网&#xff09;。都支持使用RD…...

XXE 漏洞简单研究

近期在做个基础的 web 常见漏洞的 ppt&#xff0c;主要参考 OWASP TOP 10 2017RC2&#xff0c;此版本中增加了 XXE 攻击&#xff0c;所以自己简单的研究下 XXE 攻击。XXE&#xff08;XML External Entity&#xff09;XML 外部实体&#xff0c;当前端和后端通信数据采用 xml&…...

web漏洞与规避

文章目录 一、XSS 跨站脚本攻击1.1 XSS攻击的主要类型反射型XSS存储型XSSDOM型XSS 1.2 前端开发如何应对XSS 二、CSRF 跨站请求伪造2.1 CSRF例子2.2 前端开发如何应对CSRF 三、SQL 注入3.1 前端如何防御SQL注入 四、前端如何使用CSP 一、XSS 跨站脚本攻击 攻击者通过在受害者的…...

#FPGA(基础知识)

1.IDE:Quartus II 2.设备&#xff1a;Cyclone II EP2C8Q208C8N 3.实验&#xff1a;正点原子-verilog基础知识 4.时序图&#xff1a; 5.步骤 6.代码&#xff1a;...

LockBit病毒入侵揭秘:如何防范与应对

在数字时代&#xff0c;随着科技的飞速发展&#xff0c;网络安全问题愈发凸显。恶意软件和勒索软件等网络威胁正不断演变&#xff0c;其中一款备受关注的勒索软件就是LockBit。本文将深入介绍LockBit的特征、攻击手段、演进历程以及对网络安全的威胁。 01 主要特征 LockBit是…...

vue-router4 (六) 路由嵌套

应用场景&#xff1a; ①比如京东页面的首页、购物车、我的按钮&#xff0c;可以点击切换到对应的页面&#xff1b; ② 比如 Ant Design左侧这些按钮点击就会切到对应的页面&#xff0c;此时可以把左侧按钮放在父路由中&#xff0c;右侧的子路由 1.路由配置&#xff0c;子路由…...

【NR 定位】3GPP NR Positioning 5G定位标准解读(一)

目录 前言 1. 3GPP规划下的5G技术演进 2. 5G NR定位技术的发展 2.1 Rel-16首次对基于5G的定位技术进行标准化 2.2 Rel-17进一步提升5G定位技术的性能 3. Rel-18 关于5G定位技术的新方向、新进展 3.1 Sidelink高精度定位功能 3.2 针对上述不同用例&#xff0c;3GPP考虑按…...

【AI绘画】免费GPU Tesla A100 32G算力部署Stable Diffusion

免责声明 在阅读和实践本文提供的内容之前&#xff0c;请注意以下免责声明&#xff1a; 侵权问题: 本文提供的信息仅供学习参考&#xff0c;不用做任何商业用途&#xff0c;如造成侵权&#xff0c;请私信我&#xff0c;我会立即删除&#xff0c;作者不对读者因使用本文所述方法…...

JVM(2)

JVM类加载 指的是java进程运行时,需要把.class文件从硬盘加载到内存,并进行一系列校验解析的过程. 核心: .class文件>类对象; 硬盘>内存. 类加载过程 在整个JVM的执行流程中,和程序员关系最密切的就是类加载的过程了,所以我们来看一下类加载的执行流程. 对于一个类…...

青少年CTF擂台挑战赛 2024 #Round 1 Web方向题解 WP 全

EasyMD5 题目描述&#xff1a;php没有难题 考点总结&#xff1a;脑洞题目&#xff0c;不如我出&#xff08;狗头 只允许两个都上传pdf文件。 文件还不能太大了。burp多次发包发现要求两个pdf内容不一样 不一样时候&#xff0c;提示我们MD5碰撞。 科学计数法绕过 PHP的后门 …...

一文认识蓝牙(验证基于Aduino IDE的ESP32)

1、简介 蓝牙技术是一种无线通信的方式&#xff0c;利用特定频率的波段&#xff08;2.4GHz-2.485GHz左右&#xff09;&#xff0c;进行电磁波传输&#xff0c;总共有83.5MHz的带宽资源。 1.1、背景 蓝牙&#xff08;Bluetooth&#xff09;一词取自于十世纪丹麦国王哈拉尔Haral…...

2W字-35页PDF谈谈自己对QT某些知识点的理解

2W字-35页PDF谈谈自己对QT某些知识点的理解 前言与总结总体知识点的概况一些笔记的概况笔记阅读清单 前言与总结 最近&#xff0c;也在对自己以前做的项目做一个知识点的梳理&#xff0c;发现可能自己以前更多的是用某个控件&#xff0c;以及看官方手册&#xff0c;但是没有更…...

Docker知识点总结

二、Docker基本命令&#xff1a; Docker支持CentOs 6 及以后的版本; CentOs7系统可以直接通过yum进行安装&#xff0c;安装前可以 1、查看一下系统是否已经安装了Docker: yum list installed | grep docker 2、安装docker&#xff1a; yum install docker -y -y 表示自动确认…...

Cloudflare四重验证机制与行为建模反爬原理深度解析

1. 这不是“绕过Cloudflare”&#xff0c;而是重新理解“人机边界”的实战现场最近两周&#xff0c;我连续接手了三个爬虫项目&#xff0c;全卡在同一个地方&#xff1a;Cloudflare的“Checking your browser before accessing...”页面。不是5秒跳转失败&#xff0c;就是直接返…...

AI给组内同事的脚本能力价值打了1折!

以前一个做了七八年前端设计的工程师&#xff0c;遇到一个简单的VCD波形解析需求&#xff0c;第一反应可能是是找工具组的人或者脚本能力强的人帮忙。这个场景挺普遍的&#xff0c;只是大家都不太好意思说出来。现在有个概念叫 Vibe Coding&#xff0c;核心是借助AI工具&#x…...

Java NIO.2 异步基石:AsynchronousChannel 接口契约与并发安全深度剖析

前言&#xff1a;异步 I/O 的“宪法级”契约 在 Java NIO.2&#xff08;AIO&#xff09;的宏大架构中&#xff0c;AsynchronousChannel 是所有异步通道的根接口。它不定义任何具体的读写方法&#xff0c;也不关心网络拓扑或文件偏移——它只做一件事&#xff1a;确立异步 I/O 操…...

FinML-Chain:融合链上链下数据,构建可信金融机器学习数据集

1. 项目概述&#xff1a;当区块链数据遇见机器学习 在金融科技这个日新月异的领域&#xff0c;我们每天都在和数据打交道。无论是高频交易、风险评估还是市场预测&#xff0c;机器学习模型早已成为我们手中不可或缺的“利器”。但干这行久了&#xff0c;你一定会遇到一个绕不开…...

2026财务分析师新人如何快速提升能力:从“账房先生”到“战略参谋”的跃迁之路

2026年的财务领域&#xff0c;规则已经彻底改写。传统的“记账、算账、报账”正在被RPA和AI快速替代&#xff0c;企业真正渴求的&#xff0c;不再是只会做账的“会计”&#xff0c;而是能够深入业务、洞察数据、驱动决策的财务分析师。这不仅是职业进阶的必然要求&#xff0c;更…...

Maven POM(项目对象模型)

Maven POM(项目对象模型) 引言 Maven 是一个强大的构建自动化工具,用于简化项目构建、依赖管理和项目信息维护。在 Maven 中,每个项目都有一个名为 pom.xml 的配置文件,该文件被称为项目对象模型(Project Object Model,简称 POM)。本文将详细介绍 Maven POM 的结构和…...

Unity序列化三要素:Serializable、SerializeField与SerializeReference详解

1. 为什么Unity序列化总让人困惑——从一个真实报错说起 刚接手一个老项目时&#xff0c;我遇到个特别典型的场景&#xff1a;美术同事在Inspector里调好了角色的装备配置&#xff0c;保存后切到另一台机器打开&#xff0c;所有装备栏全空了。Debug发现&#xff0c; List<E…...

AI Agent的节能与绿色计算:优化计算资源消耗的算法与策略

AI Agent节能与绿色计算实战:从算法优化到工程落地的全栈减碳指南 摘要/引言 你有没有算过,调用一次GPT-4生成1000字的回答,消耗的电量相当于一个普通家庭LED灯亮3个小时?据国际能源署2024年发布的报告,全球数据中心的年碳排放已经达到12亿吨,占全球总碳排放的2.1%,和…...

MacBook新手福音:用Final Cut Pro 10.6.5搞定你的第一门视频课(附保姆级设置与导出指南)

MacBook新手福音&#xff1a;Final Cut Pro 10.6.5视频课制作全流程精解第一次打开Final Cut Pro时&#xff0c;那个布满陌生术语的界面是否让你望而却步&#xff1f;作为Mac用户专属的视频剪辑利器&#xff0c;它其实远比想象中友好。本文将带你用最直接的方式&#xff0c;从零…...

避坑指南:在openEuler 22.03上配置vsftpd虚拟用户,解决PAM认证和SELinux权限问题

深度实战&#xff1a;openEuler 22.03中vsftpd虚拟用户配置全流程与疑难解析 在服务器运维领域&#xff0c;FTP服务作为经典的文件传输方案&#xff0c;其安全配置一直是系统管理员的核心技能。本文将聚焦openEuler 22.03操作系统环境&#xff0c;深入剖析vsftpd虚拟用户模式的…...