数据结构 - 队列(精简介绍)

news2024/9/20 16:34:24

文章目录

  • 单端队列
    • 单端队列操作:Queue实现
  • 双端队列
    • 双端队列操作:Deque实现
  • 循环队列
    • 循环队列手动实现
  • 优先级队列
    • Q 不断取最大礼物并开方

单端队列

普通队列为单端队列,先进先出(FIFO)

只能从尾部插入,头部取出元素

省流图:

请添加图片描述

单端队列操作:Queue实现

Queue<Integer> queue = new LinkedList<>();
// 添加元素到队列的尾部
queue.offer(1);
queue.offer(2);
// 获取并移除队列的头部元素
int head = queue.poll();
// 获取但不移除队列的头部元素
int peek = queue.peek();
// 判断队列是否为空
boolean isEmpty = queue.isEmpty();
// 获取队列的大小
int size = queue.size();

双端队列

单端队列升级版,允许在队头和队尾都进行元素的插入删除操作

双端队列操作:Deque实现

Deque<Integer> deque = new ArrayDeque<>();
// 添加元素到双端队列的尾部
deque.offerLast(1);
deque.offerLast(2);
// 添加元素到双端队列的头部
deque.offerFirst(0);
// 获取并移除双端队列的头部元素
int head = deque.pollFirst();
// 获取并移除双端队列的尾部元素
int tail = deque.pollLast();
// 获取但不移除双端队列的头部元素
int peekHead = deque.peekFirst();
// 获取但不移除双端队列的尾部元素
int peekTail = deque.peekLast();
// 判断双端队列是否为空
boolean isEmpty = deque.isEmpty();
// 获取双端队列的大小
int size = deque.size();

循环队列

循环队列(Circular Queue),也称为环形队列,是一种队列数据结构,它将队列的最后一个位置连接到队列的第一个位置,使其形成一个环。在循环队列中,队列的前端和后端都可以绕回到数组的起始位置,从而有效利用数组的空间。

循环队列具有以下特点:

  1. 固定大小:循环队列的大小是固定的,一旦创建后就不能改变。
  2. 环绕:当到达数组的末尾时,指针将绕回到数组的起始位置。
  3. 满队列和空队列的区别:为了区分队列为空还是满,通常保留一个数组位置不使用,或者使用一个额外的变量来记录队列的大小。

循环队列手动实现

public class CircularQueue {
    private int[] queue;
    private int front;
    private int rear;
    private int size;
    private int capacity;

    public CircularQueue(int capacity) {
        this.capacity = capacity;  // 队列容量(一般大小固定)
        this.queue = new int[capacity];
        this.front = 0; // 前端索引
        this.rear = 0;  // 后端索引
        this.size = 0;  // 队列中元素个数
    }

    public boolean isFull() {
        return size == capacity;
    }

    public boolean isEmpty() {
        return size == 0;
    }

	// 入队
    public boolean enqueue(int item) {
        if (isFull()) {
            System.out.println("队列为空");
            return false;
        }
        queue[rear] = item;
        rear = (rear + 1) % capacity; // 后端指针往后移,循环队列要取余
        size++;
        return true;
    }

	// 出队
    public Integer dequeue() {
        if (isEmpty()) {
            System.out.println("队列为空");
            return null;
        }
        int item = queue[front];
        front = (front + 1) % capacity;
        size--;
        return item;
    }

    public void display() {
        if (isEmpty()) {
            System.out.println("队列为空");
            return;
        }
        for (int i = 0; i < size; i++) {
            System.out.print(queue[(front + i) % capacity] + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        CircularQueue cq = new CircularQueue(5);

        cq.enqueue(1);
        cq.enqueue(2);
        cq.display();
        
        cq.dequeue();
        cq.display();
    }
}

优先级队列

本质上是大/小根堆,队列中元素会根据某种规则进行优先级排序

  • 利用PriorityQueue,比较器Comparator 中指定 比较/排序 规则

Q 不断取最大礼物并开方

2558. 从数量最多的堆取走礼物 - 力扣(LeetCode)

public long pickGifts(int[] gifts, int k) {
    // 队列从头最大到尾最小,降序排序
    PriorityQueue<Integer> pq = new PriorityQueue<>((o1, o2) -> o2 - o1);
    for (int i = 0; i < gifts.length; i++) {
        pq.offer(gifts[i]);
    }
    // 关键步骤:取出最大数,开方,再放进去,重复k次
    for (int i = 0; i < k; i++) {
        int max = pq.poll();
        pq.offer((int)Math.sqrt(max)); // 由于是优先级队列,再放入元素后会自动重新排序的
    }
    long res = 0;
    while (!pq.isEmpty()){
        res += pq.poll();
    }
    return res;
}

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

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

相关文章

jscolor 赋值input 没能引起前边色框的颜色变化

&#x1f3c6;本文收录于《CSDN问答解答》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…

操作系统内核源码杂谈篇:临界区

临界资源&#xff0c;是指同一时刻只能由一个线程&#xff08;linux下为进程&#xff09;访问的资源&#xff0c;而临界区就是为了确保临界资源访问是单一数据流。 临界区的代码执行&#xff0c;也就是进行原子操作&#xff0c;不会被打断。 先分析RTOS的运行架构&#xff0c…

35道最新【软件测试】面试题,常见面试题及答案汇总

前言 除了掌握扎实的专业技能之外&#xff0c;你还需要一份《软件测试面试宝典2024版》才能在万千面试者中杀出重围&#xff0c;成功拿下offer。 小编特意整理了35道测试必问必过面试题&#xff0c;送给大家&#xff0c;希望大家都能顺利通过面试&#xff0c;拿下高薪。赶紧码…

ngnix添加自定义模块

参考如下的 示例: hello handler 模块 部分&#xff0c; handler模块(100%) — Nginx开发从入门到精通 参考&#xff1a; 【Nginx】Nginx新增自定义模块_nginx 自定义模块-CSDN博客 需要详细说明的是&#xff0c; 创建一个addtion_module文件夹&#xff0c;将.c文件放进去&…

应急靶场(6):Linux1

目录 黑客的IP地址遗留下的三个flag 第一个flag第二个flag第三个flag 下载好靶场&#xff08;应急响应靶机-Linux(1)&#xff09;并搭建好环境&#xff0c;使用帐号密码&#xff08;defend / defend&#xff09;登录靶机&#xff0c;然后使用su root命令和帐号密码&#xff08;…

为hugo博客添加isso评论

个人博客评论诉求 能简单的在页面看到评论即可 能找到评论人的邮箱评论可以折叠能私有化部署 之前用过twikoo,个人体验没有isso丝滑简洁 私有化安装isso 官网 https://isso-comments.de/https://github.com/isso-comments/isso 部署方法 服务端安装python, pip 通过以下命…

“社群+”生态下的开源AI智能名片源码:驱动商业与社会连接的新引擎

摘要&#xff1a;在“社群”生态日益成为主流趋势的今天&#xff0c;开源AI智能名片源码作为技术创新与社群运营的深度融合体&#xff0c;正逐步展现出其重塑商业格局、深化社会连接的巨大潜力。本文旨在深入探讨开源AI智能名片源码的技术特性、在“社群”生态中的具体应用、对…

C/C++ yaml 库

文章目录 一、yaml 介绍1.1 yaml 介绍1.2 yaml 教程1.3 yaml 在线工具1.4 yaml 出现背景 二、C/C yaml 库选型2.2 libfyaml2.3 yaml-cpp 一、yaml 介绍 1.1 yaml 介绍 YAML&#xff08;YAML Ain’t Markup Language&#xff09;是一种人类可读的数据序列化格式&#xff0c;通…

在安卓手机上原生运行docker

前言 之前的文章(香橙派5plus上跑云手机方案一 redroid(带硬件加速))在Ubuntu的docker里运行安卓&#xff0c;这里说下怎么在安卓手机下运行docker&#xff0c;测试也可以跑Ubuntu。 想在手机上运行docker想的不是一天两天了&#xff0c;其实很久之前就有这个想法了&#xff…

12款超实用的视频压缩软件,帮你一键压缩视频

视频压缩软件这么多&#xff0c;我们该怎样正确使用它们并高效地压缩视频大小呢&#xff1f;数字化时代&#xff0c;高清画面的视频往往意味着更大的视频文件大小&#xff0c;它们往往会影响电脑占用内存、视频传输速度。本文将为您提供12款视频压缩技巧&#xff0c;帮您轻松将…

智能化革新:数字装备场的移动信息终端实战攻略!

智慧营区发展项目在数字化装备管理领域取得了显著进展&#xff0c;得益于物联网、大数据和人工智能等先进技术的融合应用&#xff0c;极大地增强了装备场所硬件之间的互动性和协同作业能力。 此外&#xff0c;该系统亦提供了定制化的在线业务流程管理服务&#xff0c;使得管理活…

小白新手搭建个人网盘

小白新手搭建个人网盘 序云服务器ECS重置密码远程连接ECS实例 安装OwnCloud安装Apache服务PHP运行环境NAS挂载挂载验证操作体验 序 阿里云文件存储NAS&#xff08;Apsara File Storage NAS&#xff09;是一个可大规模共享访问&#xff0c;弹性扩展的分布式文件系统。本文主要是…

3.4、matlab实现SGM/BM/SAD立体匹配算法计算视差图

1、matlab实现SGM/BM/SAD立体匹配算法计算视差图简介 SGM&#xff08;Semi-Global Matching&#xff09;、BM&#xff08;Block Matching&#xff09;和SAD&#xff08;Sum of Absolute Differences&#xff09;都是用于计算立体匹配&#xff08;Stereo Matching&#xff09;的…

什么是上网行为审计系统?有哪些功能?一文全搞定!

员工A&#xff08;好奇地&#xff09;&#xff1a;“嘿&#xff0c;你听说了吗&#xff1f;公司最近要安装上网行为审计系统&#xff0c;说是要监控我们的上网行为。” 员工B&#xff08;惊讶地&#xff09;&#xff1a;“真的吗&#xff1f;那岂不是很没有隐私&#xff1f;”…

xpeviewer.exe工具查看pe结构

1、下载地址 Releases horsicq/XPEViewer (github.com) 2、效果图

MATLAB R2023b下载安装教程汉化中文版设置

MATLAB R2023b下载安装教程汉化中文版设置 Matlab 是一款功能强大的商业数学软件 Matlab&#xff08;Matrix Labortory&#xff09;即矩阵实验室&#xff0c;它在数值计算、数据分析、算法开发、建模与仿真等众多领域都发挥着重要作用。 Matlab 具有以下显著特点和优势&…

力扣第十七题——电话号码的字母组合

内容介绍 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digits "23" 输出…

关于Centos停更yum无法使用的解决方案

最近在使用Centos7.9系统时候&#xff0c;发现yum仓库无法进行安装软件包了&#xff0c;官方说2024年6月30日进行停更&#xff0c;停更后无法提供对应的软件服务。 我在使用yum安装包的时候发现确实不能使用官方服务了&#xff1a; CentOS停更的影响 CentOS停止更新之后&#…

Python基础——数据容器(超详细版!)

目录 数据容器简介: list(列表) 列表特点: 列表定义: 列表的下标索引: 列表的常用方法: 列表的遍历: tuple(元组) 元组嵌套list: string(字符串) 字符串常用方法: 序列: 集合: 集合特点: 集合常用方法: 前言: 本篇文章主要讲解Python数据容器的基…

Starrocks on hive如何判断Hive表存在数据倾斜

存在数据倾斜时MaxTime和MinTime相差过大&#xff1a; 不存在数据倾斜时MaxTime和MinTime相差不大&#xff1a;