数据结构系列——先进先出队列queue

2023-11-17

本期主题:
先进先出队列实现



1.队列定义

队列是什么?定义:

  • 一个先进先出的数据结构
  • 插入操作称为入队(enqueue),入队始终在队尾添加元素
  • 删除操作称为出队(dequeue),出队操作始终从队头开始

在这里插入图片描述

2.实现一个简单的队列以及分析

1.代码实现分析

先分析该怎么实现队列,其实前面描述了就三个特点,一一分析:

插入操作在队尾实现,使用vector的push_back接口,直接在动态数组尾部实现添加;
删除操作从队头开始,这个需要有一个位置指针,告诉我们现在头部在哪里,然后每次出一个,头部位置就++;

2.code

按如下分析完之后,我们可以实现代码了:

class MyQueue {
private:
    // store elements
    vector<int> data;
    // a pointer to indicate the start position
    int p_start;
public:
    MyQueue() { p_start = 0; }
    /** Insert an element into the queue. Return true if the operation is successful. */
    bool enQueue(int x) {
        data.push_back(x);
        return true;
    }
    /** Delete an element from the queue. Return true if the operation is successful. */
    bool deQueue() {
        if (isEmpty()) {
            return false;
        }
        p_start++;
        return true;
    };
    /** Get the front item from the queue. */
    int Front() {
        return data[p_start];
    };
    /** Checks whether the queue is empty or not. */
    bool isEmpty()  {
        return (p_start >= data.size());
    }
};

完整代码:

int main() {
    MyQueue q;
    q.enQueue(5);
    q.enQueue(3);
    if (!q.isEmpty()) {
        cout << q.Front() << endl;
    }
    q.deQueue();
    if (!q.isEmpty()) {
        cout << q.Front() << endl;
    }
    q.deQueue();
    if (!q.isEmpty()) {
        cout << q.Front() << endl;
    }
}

输出结果:
在这里插入图片描述

3.优缺点分析

优点:

代码简单,非常好实现

缺点:

存在假满的情况,效率低,有空间浪费情况存在

我们看一个例子:
假设我们定义一个size为5的queue,第一步我们先dequeue,然后再enqueue,会发现此时这个queue已经满了,但实际上有效的数据只有4个
在这里插入图片描述

3.循环队列实现

1.循环队列原理

针对上面提到的效率低、空间利用有限的问题,更好的方案是使用一个循环队列,即头和尾能够连在一起,如下图所示:
在这里插入图片描述

2.循环队列实现分析

循环队列实现需要分析以下几点:

  • 首先,肯定是需要两个位置变量,来表明当前的头和尾
  • 判断队列空条件分析:空的时候,头和尾都应该指向非当前数据区域,当头=尾时,应该是只剩了最后一个元素
  • 判断队列满条件分析:满的时候,尾+1=头,但是有循环回来的问题,所以应该是 (尾+1)%(整个size)=头

3.code

class MyCircularQueue {
public:
    vector<int> data;
    int head_pos = -1;
    int rear_pos = -1;
    int size = 0;
    
    MyCircularQueue(int k) {
        data.resize(k);
        size = k;
    }
    
    bool enQueue(int value) {
        if (isFull()) {
            return false;
        }

        if (isEmpty()) {
            head_pos = 0;
        }
        rear_pos++;

        rear_pos = rear_pos % size;
        data[rear_pos] = value;
        return true;
    }
    
    bool deQueue() {
        if (isEmpty()) {
            return false;
        }
        
        if (head_pos == rear_pos) {
            head_pos = -1;
            rear_pos = -1;
            return true;
        }

        head_pos++;
        head_pos = head_pos % size;
        return true;
    }
    
    int Front() {
        if (isEmpty()) {
            return -1;
        } else {
            return data[head_pos];
        }
    }
    
    int Rear() {
        if (isEmpty()) {
            return -1;
        } else {
            return data[rear_pos];
        }
    }
    
    bool isEmpty() {
        return (head_pos == -1);
    }
    
    bool isFull() {
        return ((rear_pos + 1) % size == head_pos);
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构系列——先进先出队列queue 的相关文章

随机推荐

  • vue项目 依赖打包 与 import和dependencies 的关系

    项目打包时 依赖与package json中的dependencies和devDependencies并无关 我曾这样认为了好久 原来他们之间的关系是这样的 项目打包的依赖来自于你import from xxx 如无特殊设置 import的
  • 信息安全无小事,手把手教你日志脱敏

    场景 我们开发的程序迟早有一天都会上线到生产环境运行 但是没有人能保证自己的代码100 不出BUG 别抬扛 真没BUG是代码写的少 当我们线上出BUG之后 最常见的定位问题方法就是排查日志文件 所以我们一般都会在开发程序时 在适当的位置输出
  • scikit-learn工具包中常用的特征选择方法介绍

    对于特征选择的作用在这里照搬 西瓜书 中的描述 常用的特征选择方法有以下三种 备注 以下代码采用Jupyter notebook编写 格式与传统稍有不同 1 过滤式特征选择 简单理解就是过滤式特征选择通过选择与响应变量 目标变量 相关性度量
  • typora 编辑器基本用法

    Markdown 由 Daring Fireball 创建 原始指南在 这里 但是 它的语法因不同的解析器或编辑器而异 Typora 正在使用 GitHub Flavored Markdown 1 段落换行 按 Shift Return 可
  • Unity3D碰撞后去掉相互之间的反弹力

    最近做一个小游戏的时候发现 小模型碰撞到墙壁之后会有一个小小的反弹力导致模型有一个微弱的回弹位移 这样给人一种不好的感觉 研究了一下 除了 rigidbody Freeze Rotation之外 在FixedUpdate 注意这里是物理特性
  • mysql 正序_请问mysql 中 怎么实现这种排序,按照状态排序正序,再按照开始时间排序正序,...

    展开全部 有两个思路 1 按照各自的活动状态先排序 插入到临时表 最后再union all所有结32313133353236313431303231363533e58685e5aeb931333363353862果集create tempo
  • calico分配网络使k8s节点指定固定网段

    文章目录 calico分配网络使k8s节点指定固定网段 1 配置calicoctl 1 1 下载calicoctl 1 2 配置calicoctl 1 3 测试calicoctl 2 配置ippool 3 添加ippool 4 创建pod测
  • vue3`

    1 ref是一个函数 响应式数据 使用前要引入 impor ref fro vue let name ref 张三 改变数据 name value 李四 vue3对不同对象处理不同 数据劫持才是响应式的根本 getset 处理对象用prox
  • SpringBoot生成二维码

    目录 Zxing原生方式 添加依赖 二维码生成工具类 添加Controller 添加测试页面 使用postman测试效果 Hutool的方式 添加依赖 创建QRCodeService 添加Controller 效果测试 我们使用两种方式 去
  • mutex_init() / mutex_lock() / mutex_unlock()

    请求 1 初始化互斥体 mutex init 2 获得互斥体 mutex lock 3 释放互斥体 mutex unlock 1 mutex init 注意mutex使用之前都需要先init void mutex init struct m
  • 最小交换次数-华为OD

    整数数组nums 整数k 输出将数组A中小于k的整数组合到一起的最小交换次数 组合在一起是指满足条件的数字相邻 不要求相邻后在数组中的位置 样例1 nums 1 3 1 4 0 k 2 输出 1 解析 交换第一个1和4 样例2 nums 0
  • Django跳坑:objects.all()、objects.get()与objects.filter()之间的区别

    文章目录 1 三者之间的区别 2 获取数据 2 1 取单个数据 3 序列化 3 1 QuerySet序列化 3 2 models序列化 1 三者之间的区别 all返回的是QuerySet对象 程序并没有真的在数据库中执行SQL语句查询数据
  • Github账号开启账号双重验证

    Github账号开启账号双重验证 发现问题 解决步骤 插件使用 发现问题 今天在浏览开源项目的时候 突然Github有个提示我要在10月12日前开启双重验证 说是不完成的话 到时候的Github账号会受到限制 如下图 通过设置也可以找到 解
  • win11设置任务栏不合并的方法教程

    win11系统的任务栏窗口默认设置是合并的 有些小伙伴表示用起来还不太习惯 那么win11任务栏怎么设置不合并呢 下面小编为大家分享下win11设置任务栏不合并的方法 感兴趣的小伙伴一起来看看吧 win11设置任务栏不合并的方法教程 1 我
  • Elasticsearch学习笔记2:ES核心概念 -- 索引、倒排索引、类型、文档

    一 ES和关系型数据库的对比 Elasticsearch Relational DB 索引 index 数据库 database 类型 types 表 tables 文档 documents 行 rows 字段 fields 列 colum
  • OLED透明屏报价:实现高质量展示的成本与选择

    引言 OLED透明屏作为商业展示领域的新兴技术 受到了广泛的关注和需求 然而 对于OLED透明屏的报价 人们常常存在疑虑 在这篇文章中 尼伽将详细解析OLED透明屏报价的构成和选择因素 希望能帮助您更好呢地了解OLED透明屏 一 OLED透
  • vue中textarea高度的设置_vue中textarea自适应高度

    HTML data return pltxt 评论 inputText isHeight true minHeight 0 methods autoTextarea var extra 0 设置光标与输入框保持的距离 默认0 maxHeig
  • SQL操作

    一 查询语句 1 基本查询 SELECT FROM lt 表名 gt 查询表的所有行 SELECT FROM students 2 条件查询 SELECT FROM lt 表名 gt WHERE lt 条件表达式 gt 查询分数在80分以上
  • vscode+phpstudy连接使用mysql(解决phpstudy中mysql无法启动的问题)

    vscode phpstudy连接使用mysql 解决phpstudy中mysql无法启动的问题 使用vscode phpstudy配置php开发环境网上很文章都是挺好的 都成功解决了我的问题 但是对于使用mysql方面始终找不到很系统的文
  • 数据结构系列——先进先出队列queue

    本期主题 先进先出队列实现 目录 1 队列定义 2 实现一个简单的队列以及分析 1 代码实现分析 2 code 3 优缺点分析 3 循环队列实现 1 循环队列原理 2 循环队列实现分析 3 code 1 队列定义 队列是什么 定义 一个先进