数据结构---队列(Queue)

一、基本概念

队列是一种线性数据结构

二、特点

  1. 队列是"先进先出(FIFO---First In First Out)"(买饭排队:先排队的先买饭,买完饭就退出队列,准备买饭从队尾进入队列排队)

  2. 规定只能从一端(队尾)添加元素,从另一端(队首)取出元素

三、基本操作

  1. 定义一个接口,里面实现队列的相关操作

    public interface Queue_1<T> {//  入队void offer(T ele);//  出队T pool();//  查看队首元素T peek();//  队列中元素的个数int getSize();//  队列是否为空boolean isEmpty();
    }
  2. 以数组作为队列的底层数据结构

    public class ArrQueue<T> implements Queue_1<T> {}
    
  3. 创建全局变量

    //  队列的容器
    private MyArray<T> data;
  4. 重载构造方法

    public ArrQueue() {this.data = new MyArray<>(50);
    }
  5. 入队操作

    @Override
    public void offer(T ele) {this.data.add(ele);//  将元素添加到队尾
    }
  6. 出队操作

    @Override
    public T pool() {if (isEmpty()) {return null;}return this.data.removeByIndex(0);//  将第一个元素返回
    }
  7. 获取队首的元素

    @Override
    public T peek() {if (isEmpty()) {return null;}return this.data.getValueByIndex(0);//  获取队首的元素
    }
  8. 获取队列中实际存放元素的个数

    @Override
    public int getSize() {return this.data.getSize();//  获取队列中实际存放元素的个数
    }
  9. 判断队列是否为空

    @Override
    public boolean isEmpty() {return this.data.isEmpty();
    }

四、循环队列

1.创建一个以数组为底层的循环队列类

public class LoopArr<T> {}

2.定义全局变量

private T[] data;//  创建一个泛型数组 保存数据data
private int size;//  创建一个变量 数组中实际存放元素的个数size
private int front;//  指向队首
private int tail;//  指向队尾
private int capacity;//  创建一个变量 容积capacity

 3.构造函数

public LoopArr(int capacity) {//  判断容量,传入容量小于0if (capacity < 0) {//  将队列容量初始化为11this.capacity = 11;} else {//  将队列容量增加1个,可使队列判断队满及队空更加方便this.capacity = capacity + 1;}this.size = 0;//  初始化队列中实际存放元素个数this.front = this.tail = 0;//  初始化队列,将队头与队尾都置为0this.data = (T[]) (new Object[this.capacity + 1]);//  为泛型数组赋值
}

 4.向数组中添加元素

public void add(T item) {//判断数组是否满if ((this.tail + 1) % capacity == this.front) {// 扩容   resize  容积扩一倍resize((this.capacity - 1) * 2 + 1);}//  向指定位置添加元素this.data[this.tail] = item;this.tail = (this.tail + 1) % this.capacity;//更新this.sizethis.size++;
}

5.扩容

private void resize(int newCapacity) {System.out.println("resize:" + newCapacity);//  打印数组的新容量//  改变容量与容积this.data = Arrays.copyOf(data, newCapacity);this.capacity = newCapacity;//  将this.front置为零,this.tail=this.sizethis.front = 0;this.tail = this.size;
}

 6.移除队首元素

public T remove() {if (isEmpty()) {return null;}T delValue = this.data[this.front];//  获取要删除索引的值//  删除完之后,this.front向后移动this.front = (this.front + 1) % capacity;//  更新数组索引this.size--;//  判断是否缩容if (this.size < this.capacity / 4 && this.capacity / 2 > 0) {resize((this.capacity - 1) / 2 + 1);}return delValue;//  返回删除的值
}

7.创建循环队列

public class LoopQueue<T> implements Queue_1<T> {private LoopArr<T> data;//  容器public LoopQueue() {this.data = new LoopArr<>(100);}//  向循环队列中从队尾添加元素@Overridepublic void offer(T ele) {this.data.add(ele);}//  将队头元素从循环队列中移出@Overridepublic T pool() {return this.data.remove();}//  获取队头元素@Overridepublic T peek() {return this.data.getFirstVal();}//  获得循环队列的长度@Overridepublic int getSize() {return this.data.getSize();}//  判断循环队列是否为空@Overridepublic boolean isEmpty() {return this.data.isEmpty();}
}

五、双端队列

1.创建双端队列类

public class Dique {}

2.创建队列

//  普通队列
Queue<Integer> queue = new LinkedList<>();//  双端队列  linkedList
LinkedList<Integer> help = new LinkedList<>();

3.添加操作

public void offer(int ele) {this.queue.add(ele);//  判断双端队列中(从尾部开始比ele小的元素都要出队)while (!this.help.isEmpty() && this.help.peekFirst() < ele) {this.help.pollLast();//  LinkedList中特有的方法,将最后一个元素检索并删除}this.help.offerLast(ele);//  将元素从尾部添加
}

4.删除操作

public Integer remove() {//  队列为空,返回nullif (this.queue.isEmpty()) {return null;}//  队头与双端队列队头相同,双端环队列队头删除if (this.queue.peek() == this.help.peekFirst()) {this.help.pollFirst();}//  并将普通队列队头删除return this.queue.poll();
}

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

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

相关文章

Java安全 CC链1分析

Java安全之CC链1分析 什么是CC链环境搭建jdk下载idea配置创建项目 前置知识Transformer接口ConstantTransformer类invokerTransformer类ChainedTransformer类 构造CC链1CC链1核心demo1demo1分析 寻找如何触发CC链1核心TransformedMap类AbstractInputCheckedMapDecorator类readO…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例4-6 fieldset

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>fieldset</title> </head><body> <form action"#"><fieldset><legend>学生信息</legend>姓名&#xff1a;&…

2024PMP考试新考纲-【过程领域】近期典型真题和很详细解析(8)

华研荟继续为您分享【过程Process领域】的新考纲下的真题&#xff0c;今天来看几道关于风险方面的PMP真题&#xff0c;帮助大家体会和理解新考纲下PMP的考试特点和如何应用所学的知识和常识&#xff08;经验&#xff09;来解题&#xff0c;并且举一反三&#xff0c;一次性3A通过…

WordPress怎么去除jquery和CSS静态文件链接中的版本号?附2种方法

我们很多WordPress网站默认情况下所加载的jquery和CSS静态文件链接中都会带有相应的版本号&#xff0c;比如boke112百科使用的YIA主题&#xff0c;加载CSS文件时就会在链接地址后面加上?ver2.7&#xff0c;即是style.css?ver2.7 除了CSS文件会加上版本号外&#xff0c;加载主…

[小程序]样式与配置

一、外部样式导入 使用import加外部样式表的相对路径并以 ; 表示语句结束。 import "common.wxss"; 二、全局样式和局部样式 全局样式位于app.wxss中&#xff0c;会作用于整个项目中所有页面中。 局部样式位于对应的wxss文件中&#xff0c;仅作用于当前页面&#x…

【项目搭建三】SpringBoot引入redis

添加依赖 本文使用spring data redis访问和操作redis&#xff0c;pom文件中加入以下依赖&#xff1a; <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </depende…

python入门,文件的编码,读取,写入,追加

目录 1.文件的编码 2.文件的读取 1.open&#xff08;&#xff09;函数打开文件 2.rede&#xff08;&#xff09;读取文件 3.readlines&#xff08;&#xff09;方法 4.readline&#xff08;&#xff09;方法 5.for循环读取 3.文件的关闭 withopen语法 4.文件的写入 1.…

基于华为MRS3.2.0实时Flink消费Kafka落盘至HDFS的Hive外部表的调度方案

文章目录 1 Kafka1.1 Kerberos安全模式的认证与环境准备1.2 创建一个测试主题1.3 消费主题的接收测试 2 Flink1.1 Kerberos安全模式的认证与环境准备1.2 Flink任务的开发 3 HDFS与Hive3.1 Shell脚本的编写思路3.2 脚本测试方法 4 DolphinScheduler 该需求为实时接收对手Topic&a…

如何使用callable和future创建异步任务?在Java中如何管理依赖?

在Python中&#xff0c;可以使用concurrent.futures模块中的Callable和Future类来创建异步任务。以下是一个简单的例子&#xff1a; import concurrent.futures# 定义一个可调用对象&#xff08;Callable&#xff09;def long_running_task(n):return n * n# 创建一个线程池执行…

使用vscode在wsl2中配置clangd环境

在vscode中安装这三个插件&#xff08;clangd需要科学上网或者从VSIX安装&#xff09; 之后创建一个空目录并进去。 使用快捷键ctrlshiftp&#xff0c;输入命令 Cmake:Quick Start 根据步骤选择。注意在创建CMakeLists.txt这一步选择跳过&#xff0c;直接输入enter&#xff0c…

c# 释放所有嵌入资源, 到某个本地文件夹

版本号 .net 8 代码 using System.Reflection;namespace Demo;internal class Program {static void Main(string[] args){// 获取当前 执行exe 的目录 / 当前命令行所在的目录 var currentDir Directory.GetCurrentDirectory();Console.WriteLine(currentDir);Extract…

Linux 驱动开发基础知识——认识LED驱动程序 (二)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

Linux之进程间通信(管道)

目录 一、进程间通信 1、进程间通信的概念 2、进程间通信的目的 3、进程间通信的分类 二、管道 1、管道基本介绍 2、匿名管道 3、命名管道 一、进程间通信 1、进程间通信的概念 什么是进程间通信&#xff1f; 我们在学习了进程的相关知识后&#xff0c;知道&#xff…

2024 CKA 题库 | 12、查看 pod 日志

不等更新题库 文章目录 12、查看 pod 日志题目:考点&#xff1a;参考链接:解答:检查 12、查看 pod 日志 题目: 设置配置环境&#xff1a; [candidatenode-1] $ kubectl config use-context k8sTask 监控 pod foo 的日志并&#xff1a; 提取与错误 RLIMIT_NOFILE 相对应的日志…

SpringSecurity(07)——JWT整合

依赖配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency><groupId>org.springframework.boot</groupId><artifactId>s…

树的一些经典 Oj题 讲解

关于树的遍历 先序遍历 我们知道 树的遍历有 前序遍历 中序遍历 后序遍历 然后我们如果用递归的方式去解决&#xff0c;对我们来说应该是轻而易举的吧&#xff01;那我们今天要讲用迭代&#xff08;非递归&#xff09;实现 树的相关遍历 首先呢 我们得知道 迭代解法 本质上也…

C语言:函数指针的使用

在C语言中&#xff0c;函数指针是指向函数的指针变量。它可以存储函数的地址&#xff0c;使得可以通过该指针来调用函数。以下是函数指针的基本概念和用法&#xff1a; 一、基本概念&#xff1a; 声明函数指针&#xff1a; returnType (*pointerName)(parameterTypes); 这里 r…

13.1 一个简单的基类

们在类中添加新特性。 继承是种非常好的概念,其基本实现非常简单。但要对继承进行管理,使之在所有情况下都能正常 工作,则需要做…些调整。本章将介绍继承简单的一面和复杂的一面。 - 13.1 一个简单的基类 从个类派生出另一个类时,原始类称为基类,继承类称为派生类。为说明继…

浅析云服务oss/obs/cos对象存储安全攻防

文章目录 前言云存储服务1.1 初识对象存储1.2 腾讯云COS桶1.3 公开读取风险 对象存储桶风险2.1 Bucket Object遍历2.2 Bucket 名称的爆破2.3 Bucket ACL可读写2.4 任意写与文件覆盖2.5 Bucket 域名的接管 AccessKey凭证泄露3.1 行云管家接管主机3.2 Github泄露AK/SK3.3 客户端程…

【题目】2023年国赛信息安全管理与评估正式赛任务书-模块2

全国职业院校技能大赛 高等职业教育组 信息安全管理与评估 任务书 模块二 网络安全事件响应、数字取证调查、应用程序安全 比赛时间及注意事项 本阶段比赛时长为180分钟&#xff0c;时间为13:30-16:30。 【注意事项】 比赛结束&#xff0c;不得关机&#xff1b;选手首先…