算法笔记p251队列循环队列

news2024/11/27 10:21:29

目录

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

队列

  • 队列是一种先进先出的数据结构,总是从队尾加入元素,从队首移除元素,满足先进先出的原则。
  • 队列的常用操作包括获取队列内元素的个数(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 1000

typedef 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.coloradmin.cn/o/1530585.html

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

相关文章

2023年蓝桥杯模拟省赛——列名

目录 题目链接&#xff1a;2.列名 - 蓝桥云课 (lanqiao.cn) 思路 高级思路&#xff1a;进制转换 难点一 难点二 难点三 总结 题目链接&#xff1a;2.列名 - 蓝桥云课 (lanqiao.cn) 思路 先来看我的暴力的思路吧 主要有以下步骤&#xff1a; 初始化一个长度为3的数组res用…

图像分割之k-means聚类分割

文章目录 k-means聚类原理k-means基本思路聚类效果评估k-means聚类算法流程MATLAB实现测试结果参考文献 k-means聚类原理 k-means聚类是一种无监督学习的聚类算法&#xff0c;它的目的是将数据集中的样本划分成若干个类别&#xff0c;使得同一类别内的样本相似度高&#xff0c…

Java:类和对象

目录 1.面对对象的初步认识1.1 什么是面向对象&#xff1f;&#xff08;Java当中一切皆为对象&#xff09;1.2 面对对象与面对过程 2.类的定义和使用2.1简单认识类2.2 类的定义格式 3.类的实例化3.1 什么是实例化3.2类和对象的说明 4.this引用4.1为什么要使用this引用4.2 什么是…

集合系列(十) -Set接口详解

一、摘要 关于 Set 接口&#xff0c;在实际开发中&#xff0c;其实很少用到&#xff0c;但是如果你出去面试&#xff0c;它可能依然是一个绕不开的话题。 言归正传&#xff0c;废话咱们也不多说了&#xff0c;相信使用过 Set 集合类的朋友都知道&#xff0c;Set集合的特点主要有…

重磅:Python 迎来多线程重大更新 no-GIL

“在 Python 中&#xff0c;GIL 将不复存在。对 AI 生态系统来说是巨大的胜利。”PyTorch 核心维护者 Dmytro Dzhulgakov 感慨地说道。 GIL 是什么&#xff1f;GIL 的全称是 Global Interpreter Lock&#xff08;全局解释器锁&#xff09;&#xff0c;这不仅是 Python 的特性…

计算机毕业设计-基于python的旅游信息爬取以及数据分析

概要 随着计算机网络技术的发展&#xff0c;近年来&#xff0c;新的编程语言层出不穷&#xff0c;python语言就是近些年来最为火爆的一门语言&#xff0c;python语言&#xff0c;相对于其他高级语言而言&#xff0c;python有着更加便捷实用的模块以及库&#xff0c;具有语法简单…

彻底学会系列:一、机器学习之梯度下降(2)

1 梯度具体是怎么下降的&#xff1f; ∂ J ( θ ) ∂ θ \frac{\partial J (\theta )}{\partial \theta} ∂θ∂J(θ)​&#xff08;损失函数&#xff1a;用来衡量模型预测值与真实值之间差异的函数&#xff09; 对损失函数求导&#xff0c;与学习率相乘&#xff0c;按梯度反方…

mabatis 下

mybatis 原生的API&注解的方式MyBatis-原生的API调用快速入门需求快速入门代码实现 MyBatis-注解的方式操作快速入门需求快速入门代码实现注意事项和说明 mybatis-config.xml配置文件详解说明properties属性settings全局参数定义typeAliases别名处理器typeHandlers类型处理…

长安链团队论文入选国际顶会Usenix Security 2024

零知识证明是区块链扩容和隐私保护的关键前沿技术&#xff0c;其天然具备完备性、可靠性和零知识性的特点&#xff0c;是提升区块链交易吞吐量与可扩展性、在验证用户身份的同时保护用户数据隐私&#xff0c;实现复杂计算不可或缺的关键技术。基于零知识证明技术实现高兼容性、…

C++ 组合 委托 继承 组合使用

关于组合和委托看C中的组合&#xff0c;委托和继承 - 知乎 (zhihu.com) 继承和组合关系下的构造和析构 ​ 还有一种情况 ​ 构造函数由内到外&#xff0c;析构由外到内。 委托和继承关系组合 设计模式-观察者模式&#xff08;Observer&#xff09; ​ 如下图左边&#x…

稀碎从零算法笔记Day22-LeetCode:

题型&#xff1a;链表 链接&#xff1a;2. 两数相加 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;Leet 题目描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 …

MySQL表的增删改查(基础版本)

MySQL的增删改查也就是CRUD CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写。 1.新增 1.1 语法&#xff1a; INSERT [INTO] table_name [(column [, column] ...)] VALUES (value_list) [, (value_list)] ... value_list: value, [,…

【C语言】遍历目录树

在 Linux 环境下&#xff0c;如果编写程序且需要通过函数接口来遍历目录树&#xff0c;可以考虑使用以下几个常用的调用&#xff1a; 1. opendir() / readdir() / closedir()&#xff1a; 这是 POSIX 标准定义的函数&#xff0c;用于遍历目录。opendir() 用于打开一个目录&…

【C语言】access和stat函数

access 在C语言中&#xff0c;access 函数是一个用于检查文件的存在性以及对文件的访问权限的函数。它定义在 <unistd.h> 头文件中&#xff0c;通常在 Unix 系统中可用。这个函数可以用来验证当前用户是否有权访问指定的文件&#xff0c;以及这些权限的类型。 access 函…

express+mysql+vue,从零搭建一个商城管理系统16--收货地址(全国省市县名称和code列表)

提示&#xff1a;学习express&#xff0c;搭建管理系统 文章目录 前言一、新建config/area.js二、新建models/address.js三、新建dao/address.js四、新建routes/address.js五、添加地址六、查询用户地址列表总结 前言 需求&#xff1a;主要学习express&#xff0c;所以先写serv…

微积分基础概念和在AI中的应用

基本概念 微积分是数学中的一个主要分支&#xff0c;专注于研究函数、极限、导数、积分等的理论。它是现代科学和工程中不可或缺的基础工具&#xff0c;尤其在处理变化率和累积量的问题时显得尤为重要。微积分通常分为两大部分&#xff1a;微分学和积分学。 微分学 微分学关…

NASA数据集——2017 年阿拉斯加和加拿大上空彩色红外图像中的 AirSWOT 水掩模数据集

简介 ABoVE: AirSWOT Water Masks from Color-Infrared Imagery over Alaska and Canada, 2017 摘要 本数据集提供了&#xff1a;1&#xff09;用于未来从共存的 AirSWOT Ka 波段干涉测量数据中提取水面高程 (WSE) 的保守开放水域掩膜&#xff1b;2&#xff09;沿 NASA 北极-…

宋仕强论道之华强北科技创新说

宋仕强论道之华强北科技创新说&#xff0c;“创新”是深圳市和华强北灵魂&#xff0c;创新再加上敢想敢干永不言败&#xff0c;造就了深圳市经济奇迹和华强北财富神话&#xff01;首次在深圳市落槌的“土地拍卖”&#xff0c;华强北“一米柜台”赋予独立经营权&#xff0c;把最…

Springboot通过注解+切面实现接口权限校验

Springboot通过注解&#xff0b;切面实现接口权限校验 主要说一下在对接口请求时&#xff0c;如何用注解切面去拦截校验当前登录用户是否有访问权限 1.首先创建注解 HasPermission &#xff0c;跟普通注解创建方式基本一致 Retention(RetentionPolicy.RUNTIME) Target(Element…

Python矩阵计算

文章目录 求积求逆最小二乘法特征值 Python科学计算&#xff1a;数组&#x1f4af;数据生成&#x1f4af;数据交互&#x1f4af;微积分&#x1f4af;插值&#x1f4af;拟合&#x1f4af;FFT&#x1f4af;卷积&#x1f4af;滤波&#x1f4af;统计 求积 矩阵是线性代数的核心对…