算法笔记p251队列循环队列

目录

  • 队列
  • 循环队列
    • 循环队列的定义
    • 初始化
    • 判空
    • 判满
    • 入队
    • 出队
    • 获取队列内元素的个数
    • 取队首元素
    • 取队尾元素

队列

  • 队列是一种先进先出的数据结构,总是从队尾加入元素,从队首移除元素,满足先进先出的原则。
  • 队列的常用操作包括获取队列内元素的个数(size)、判空(empty)、入队(push)、出队(pop)、取队首元素(get_front)、取队尾元素(get_rear)等。

循环队列

  • 循环队列允许队列的头尾相接,形成一个环。
  • 用数组实现循环队列,队头指针front指向队列第一个元素,队尾指针rear指向最后一个元素的下一个位置。
  • 由于是循环队列,因此队头指针和队尾指针每次移动都需要对数组长度取余,以确保移动到正确的位置上。
    • 后移:rear = (rear + 1)% MaxSize
    • 前移:rear = (rear + MaxSize - 1)% MaxSize

循环队列示例
如上图所示,MaxSize = 6,rear当前指向5的位置:

  • 后移:rear = (5 + 1)% 6 = 0
  • 前移:rear = (5 + 6 - 1)% 6 = 4

循环队列的定义

#include <stdbool.h>#define MaxSize 1000typedef int ElemType;typedef struct Queue {ElemType data[MaxSize];int front, rear;
} Queue;

初始化

循环队列初始化时,front和rear都指向数组的第一个位置。

void init(Queue *q) {q->front = 0;q->rear = 0;
}

判空

队尾指针rear和队头指针front指向同一个地方,即队列为空。

bool empty(Queue *q) {return q->front == q->rear;
}

判满

队尾指针的下一个位置指向的是队头指针,则队满。(空出一个元素)

bool full(Queue *q) {return (q->rear + 1) % MaxSize == q->front;
}

入队

入队先判满。
由于队尾指针指向队列最后一个元素的下一个位置,因此入队时,先把元素存放到rear指向的位置,然后再将rear + 1。

bool push(Queue *q, ElemType value) {if (full(q))return false;q->data[q->rear] = value;q->rear = (q->rear + 1) % MaxSize;return true;
}

出队

出队先判空
由于队头指针指向队列第一个元素,因此出队时,先记录front指向位置的元素,然后再将front + 1。

bool pop(Queue *q, ElemType *p) {if (empty(q))return false;*p = q->data[q->front];q->front = (q->front + 1) % MaxSize;return true;
}

获取队列内元素的个数

队列内元素的个数:(rear + MaxSize - front)% MaxSize

int size(Queue *q) {return (q->rear + MaxSize - q->front) % MaxSize;
}

取队首元素

取队首元素先判空。
将front指针所在位置的元素记录下来即可。

bool get_front(Queue *q, ElemType *value) {if (empty(q))return false;*value = q->data[q->front];return true;
}

取队尾元素

取队尾元素先判空。
将rear指针所在位置的前一个位置的元素记录下来即可。

bool get_rear(Queue *q, ElemType *value) {if (empty(q))return false;int pos = (q->rear + MaxSize - 1) % MaxSize;*value = q->data[pos];return true;
}

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

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

相关文章

【Godot4.2】颜色完全使用手册

概述 本篇简单汇总Godot中的颜色的构造和使用&#xff0c;内容包括了&#xff1a; RGB、RGBA&#xff0c;HSV以及HTML16进制颜色值、颜色常量等形式构造颜色颜色的运算以及取反、插值用类型化数组、紧缩数组或PNG图片形式存储多个颜色 构造颜色 因为颜色是一种视觉元素&…

Jmeter接口测试步骤

一、使用工具测试 1、使用Jmeter对接口测试 首先我们说一下为什么用Posman测试后我们还要用Jmeter做接口测试&#xff0c;在用posman测试时候会发现的是一个接口一个接口的测试&#xff0c;我们每次测试成功后的数据&#xff0c;在工具中是无法保存的&#xff0c;再次测试的时…

【蓝桥杯入门记录】继电器、蜂鸣器及原理图分析

一、继电器、继电器概述 &#xff08;1&#xff09;蜂鸣器原理 蜂鸣器的发声原理由振动装置和谐振装置组成&#xff0c;而蜂鸣器又分为无源他激型与有源自激型&#xff0c;蜂鸣器的发声原理为: 1、无源他激型蜂鸣器的工作发声原理是&#xff1a;方波信号输入谐振装置转换为声…

day11【网络编程】

day11【网络编程】 1.4 网络编程三要素 协议 **协议&#xff1a;**计算机网络通信必须遵守的规则&#xff0c;已经介绍过了&#xff0c;不再赘述。 IP地址 IP地址&#xff1a;指互联网协议地址&#xff08;Internet Protocol Address&#xff09;&#xff0c;俗称IP。IP地…

Vue.js开发基础

单文件组件 使用Vite创建Vue项目后&#xff0c;目录结构中包含一些扩展名为.vue的文件&#xff0c;每个.vue文件都可用来定义一个单文件组件。Vue中的单文件组件是Vue组件的文件格式。每个单文件组件由模板、样式和逻辑3个部分构成。 运行结果&#xff1a; 1.模板 模板用于搭建…

每日OJ题_字符串②_力扣5. 最长回文子串(中心拓展)

目录 力扣5. 最长回文子串 解析代码&#xff08;中心拓展&#xff09; 力扣5. 最长回文子串 5. 最长回文子串 难度 中等 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例 1&#…

latex变量上下加自适应长度箭头

latex变量上下加自适应长度箭头 在变量上加箭头的代码如下 % 在上 \overrightarrow{A B} \overleftarrow{A B} % 在下 \underrightarrow{A B} \underleftarrow{A B}得出的结果依次如下 A B → , A B ← , A B → , A B ← \overrightarrow{A B},\overleftarrow{A B}, \under…

探索并发编程:深入理解线程池

文章目录 前言一、线程池是什么&#xff1f;二、如何创建线程池1.使用Executors类2.使用ThreadPoolExecutor类手动配置线程池 总结 前言 随着计算机系统的不断发展和进步&#xff0c;我们需要处理更多的并发任务和复杂的操作。而线程池作为一种高效的线程管理机制&#xff0c;…

PyTorch 深度学习(GPT 重译)(一)

第一部分&#xff1a;PyTorch 核心 欢迎来到本书的第一部分。在这里&#xff0c;我们将与 PyTorch 迈出第一步&#xff0c;获得理解其结构和解决 PyTorch 项目机制所需的基本技能。 在第一章中&#xff0c;我们将首次接触 PyTorch&#xff0c;了解它是什么&#xff0c;解决了…

爬虫基础:HTTP基本原理

爬虫基础&#xff1a;HTTP基本原理 前言HTTP基本原理URI 和 URLHTTP 和 HTTPSHTTP 请求过程请求与响应HTTP请求HTTP响应请求与响应的交互过程 HTTP 2.0二进制传输多路复用Header压缩服务器端提前响应内容安全 前言 了解 HTTP的基本原理&#xff0c;了解从往测览器中输人 URL到获…

设计模式总结(四)

上一篇总结了设计模式的结构型&#xff0c; 接下来总结一下设计模式的几种行为型模式。 模板方法模式&#xff1a; 模板方法模式定义了一个算法的骨架&#xff0c;将一些步骤延迟到子类中实现。这样做的目的是使得子类可以在不改变算法结构的情况下重新定义算法的某些步骤&…

「连载」边缘计算(三十二)03-14:边缘部分源码(源码分析篇)

&#xff08;接上篇&#xff09; EdgeCore之edgemesh 前面对EdgeCore组件的edged、devicetwin、edgehub、eventbus、metamanager功能模块进行了分析&#xff0c;本节对EdgeCore组件的另一个功能模块edgemesh进行剖析。目前&#xff0c;KubeEdge官网没有edgemesh相关介绍&…

Visio 2021专业版密钥下载安装

Visio 2021 专业版是微软公司开发的一款功能强大的流程图制作软件&#xff0c;适用于创建各种类型的图表和流程图&#xff0c;包括&#xff1a; 流程图&#xff1a;用于可视化业务流程、工作流程和系统流程。组织结构图&#xff1a;用于展示组织结构和人员关系。网络图&#x…

算法沉淀——贪心算法四(leetcode真题剖析)

算法沉淀——贪心算法四 01.最长回文串02.增减字符串匹配03.分发饼干04.最优除法 01.最长回文串 题目链接&#xff1a;https://leetcode.cn/problems/longest-palindrome/ 给定一个包含大写字母和小写字母的字符串 s &#xff0c;返回 通过这些字母构造成的 最长的回文串 。 …

YOLOV5 改进:修改网络结构--C2f 模块

1、前言 YOLOV5 采用C3模块,类似于残差结构的思想 class C3(nn.Module):# CSP Bottleneck with 3 convolutionsdef __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5): # ch_in, ch_out, number, shortcut, groups, expansionsuper().__init__()c_ = int(c2 * e) #…

一篇文章搞懂vue基础(上)

01._初识vue 初识vue: 1.想让Vue工作&#xff0c;就必须创建一个vue实例&#xff0c;且要传入一个配置对象&#xff1b; 2.root容器里的代码依然符合html规范&#xff0c;只不过混入了一些特殊的vue语法 3.root容器里的代码被称为【Vue模版】 4.Vue实例和容器是一一对应的 5.真…

《1w实盘and大盘基金预测 day8》

昨日预测还行&#xff0c;大盘最低到3054缺口附近&#xff0c;并没有补缺口 &#xff0c;顶住了&#xff0c;震荡向上&#xff0c;评分B。 今天行情是指数涨却赚不到钱&#xff0c;像极了拉指数掩护蓝筹股出货 公众号&#xff1a;JavaHelmet 昨天预测&#xff1a; 3042-305…

大数据开发(Hadoop面试真题)

大数据开发&#xff08;Hadoop面试真题&#xff09; 一、HDFSⅠ、HDFS基础概念和架构1、HDFS的作用2、介绍下HDFS&#xff0c;说下HDFS优缺点&#xff0c;以及使用场景&#xff1f;3、请解释一下Hadoop中NameNode和DataNode的作用。4、请解释一下HDFS架构中NameNode和DataNode之…

一文带你了解MySQL事务特性以及其底层原理

MySQL的事务支持是通过其存储引擎&#xff0c;特别是InnoDB存储引擎来提供的。事务的四大特性&#xff0c;通常被称为ACID属性&#xff0c;分别是原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isolation&#xff0…

Linux中,运行程序,顺便将打印信息存储在Log文件中查看

前言 如题&#xff0c;原本打算在代码中自己写一个类去管理将打印信息收集到log日志中&#xff0c;忽然想到&#xff0c;其实也可以写sh脚本 简单demo1 #!/bin/bash# 启动应用程序 test&#xff0c;并将标准输出和标准错误输出都追加到 log 文件中 ./test >> output.log…