JAVA队列

devtools/2024/10/19 22:13:24/

目录

1. 队列(Queue)

2.1 概念

2.2 队列的使用

​编辑

​编辑

后入后出

和栈类似 队列同样有 size() 和 empty()方法

2.3 队列模拟实现

3. 出队列


1. 队列(Queue)

1.1 概念

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO

 入队列:进行插入操作的一端称为队尾(Tail/Rear

出队列:进行删除操作的一端称为队头 Head/Front

1.2 队列的使用

在Java中,Queue是个接口,底层是通过链表实现的。

注意:Queue是个接口,在实例化时必须实例化LinkedList的对象,因为LinkedList实现了Queue接口。

1.入队列

java">public static void main(String[] args) {
Queue<Integer> q = new LinkedList<>();
q.offer(1);
q.offer(2);
q.offer(3);
q.offer(4);
q.offer(5); // 从队尾入队列
System.out.println(q.size());
System.out.println(q.peek()); // 获取队头元素
q.poll();
System.out.println(q.poll()); // 从队头出队列,并将删除的元素返回
if(q.isEmpty()){
System.out.println("队列空");
}else{
System.out.println(q.size());
}
}

从中我们看到了先入的进入 队头 ,后入的进入 队尾

2.出队列

java">class Test2 {public static void main(String[] args) {Queue<Integer> q= new LinkedList<>();q.offer(1);q.offer(2);q.offer(3);q.offer(4);System.out.println("=========入队列=========");System.out.println(q.poll());System.out.println(q.poll());System.out.println(q.poll());System.out.println(q.poll());}
}

后入后出

java">
public class TestStudentSpeak {public static void main(String[] args) {Queue<Integer> q= new LinkedList<>();q.offer(1);q.offer(2);q.offer(3);q.offer(4);System.out.println("=========出队列=========");System.out.println(q.poll());System.out.println(q.poll());System.out.println("=========获取对头元素========");System.out.println(q.peek());System.out.println(q.peek());}}

3.查找队头元素

java">public class TestStudentSpeak {public static void main(String[] args) {Queue<Integer> q= new LinkedList<>();q.offer(1);q.offer(2);q.offer(3);q.offer(4);System.out.println("=========出队列=========");System.out.println(q.poll());System.out.println(q.poll());System.out.println("=========获取对头元素========");System.out.println(q.peek());System.out.println(q.peek());  System.out.println("======获取队列大小=======");System.out.println(q.size());System.out.println("=======判断队列是否为空=======");if (q.isEmpty()) {System.out.println("队列为空!");} else {System.out.println("队列不为空!");}}}

和栈类似 队列同样有 size() 和 empty()方法

1.3 队列模拟实现


队列中既然可以存储元素,那底层肯定要有能够保存元素的空间,通过前面线性表的学习了解到常见的空间类型有
两种:顺序结构 和 链式结构。

那队列的实现使用顺序结构还是链式结构好?

java">public class MyQueue implements IQueue {List<Integer> queue;public MyQueue() {queue= new LinkedList<>();}
}

用链表删除头节点的时间复杂度是 O(1)

顺序表 删除头数据的,由于要扭动数据,所以时间复杂度达到了 O(N)

java">queue= new LinkedList<>();

所以建议选择链表

1.入队列

java">public boolean offer(int val) {queue.add(val);return true;
}

采用了双向链表的尾插功能

2. 出队列

java"> @Overridepublic int remove() {return queue.remove(0);}

采用双向链表 的 头删 功能

java">@Overridepublic int peek() {return queue.get(0);}

3.查找

这里利用到 链表 的获取第一个元素的功能

java">@Override
public int size() {return queue.size();
}public boolean isEmpty() {return queue.isEmpty();
}

4.判空和判断大小

利用 链表的 size() 和 isEmpty() 两个方法爱实现我们的队列

java">public class Queue {
// 双向链表节点
public static class ListNode{
ListNode next;
ListNode prev;
int value;
ListNode(int value){
this.value = value;
}
}
ListNode first; // 队头
ListNode last; // 队尾
int size = 0;
// 入队列---向双向链表位置插入新节点
public void offer(int e){
ListNode newNode = new ListNode(e);
if(first == null){
first = newNode;
// last = newNode;
}else{
last.next = newNode;
newNode.prev = last;
// last = newNode;
}
last = newNode;
int value = 0;
if(first == null){
return null;
}else if(first == last){
last = null;
first = null;
}else{
value = first.value;
first = first.next;
first.prev.next = null;
first.prev = null;
}
--size;
return value;
}
// 获取队头元素---获取链表中第一个节点的值域
public int peek(){
if(first == null){
return null;
}
return first.value;
}
public int size() {
return size;
}
public boolean isEmpty(){
return first == null;
}
}

到这里,竹竹零就要和大家说再见了🍕🍕🍕

如果您觉得有失偏颇请您在评论区指正,如果您觉得不错的话留个好评再走吧!!

您的鼓励就是对我最大的支持!  ! !


http://www.ppmy.cn/devtools/127111.html

相关文章

【Vue进阶】第一章——熟悉Vue常用指令:从文本插值到表单绑定

目录 内容主要包含 1.Vue 常用指令介绍 目标 内容讲解 内容小结 2.文本插值v-html 目标 内容讲解 内容小结 3.绑定属性 v-bind:属性名或者 :属性名 (重点) 目标 内容讲解 内容小结 4.条件渲染v-if 目标 内容讲解 内容小结 5.条件渲染v-show 目标 内容讲解…

JavaWeb 19 AJAX

目录 一、什么是AJAX 同步交互和异步交互 同步交互 异步交互 Ajax工作原理 Ajax实现方式 原生JavaScript方式进行ajax(了解)&#xff1a; "我就是希望你好&#xff0c;就像很多人希望我好一样&#xff0c;特别简单&#xff0c;特别真挚。也不为了什么&#xff0c;就是希望…

CST软件超表面--- 偏振片- 线圆极化转换,Floquet端口,S参数算轴比AR

这期我们看一个超表面极化分析&#xff0c;用到Floquet端口模数&#xff0c;S参数读出极化和轴比&#xff0c;还有平面波散射截面等技巧。 使用模板&#xff0c;频率0-25GHz&#xff0c;电场监视器8.06GHz: 画一片PEC&#xff1a; 画第二片PEC&#xff0c;insert到第一片里面&…

ECU 安全启动和安全刷写的技术实现演示案例

场景: 诊断仪将新的应用程序软件下载到ECU中。 假设条件: ECU硬件支持CAN通信。ECU已安装Bootloader软件。诊断仪支持UDS协议和所需的诊断服务。应用程序软件已打包成HEX格式文件。 流程步骤: 预编程步骤: STP1_a: 切换扩展会话 诊断仪发送: $10 03 (功能寻址)ECU响应: $5…

网络空间安全之一个WH的超前沿全栈技术深入学习之路(一:渗透测试行业术语扫盲)作者——LJS

欢迎各位彦祖与热巴畅游本人专栏与博客 你的三连是我最大的动力 以下图片仅代表专栏特色 [点击箭头指向的专栏名即可闪现] 专栏跑道一 ➡️网络空间安全——全栈前沿技术持续深入学习 专栏跑道二➡️ 24 Network Security -LJS ​ ​ ​ 专栏跑道三 ➡️ MYSQL REDIS Advanc…

RabbitMQ 入门(六)SpringAMQP五种消息类型(Direct Exchange)

一、发布订阅-DirectExchange&#xff08;路由模式&#xff09; 在Fanout模式中&#xff0c;一条消息&#xff0c;会被所有订阅的队列都消费。但是&#xff0c;在某些场景下&#xff0c;我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。 Direct Exchan…

git基础操作

“git” 文章目录 文章有误敬请斧正 不胜感恩&#xff01; Git分布式版本控制工具1.目标:2.概述:3.git3.1git基本操作:常用命令配置git环境&#xff1a;git config --global创建本地空仓库&#xff1a;新建文件添加到本地仓库&#xff1a;git add、git commit -m添加到暂存区提…

区块链技术的应用场景和优势

区块链技术的应用场景和优势非常广泛。以下是一些常见的应用场景和优势&#xff1a; 1. 金融服务&#xff1a;区块链技术可以提供更安全、更高效、更透明的金融交易。它可以用于支付和结算、股票交易、贷款和借款、智能合约等金融服务领域。 2. 物联网&#xff08;IoT&#x…