Java初阶数据结构队列的实现

1.队列的概念

1.队列就是相当于排队打饭

2.在排队的时候就有一个队头一个队尾。

3.从队尾进对头出

4.所以他的特点就是先进先出

所以我们可以用链表来实现

单链表实现要队尾进队头出{要有last 尾插头删}

双向链表实现效率高:不管从哪个地方当作队列都是可以的,所以Linklist是神大拇指高高竖起,

所以队列是很简单的,只要写一个头删和尾部删除很简单

2.队列的代码实现 

2.1普通队列的实现

我们用双向链表来队队列进行实现

很简单就不细说了,想更好了解的到链表那边去看一看。

(1)定义一个基本的双向链表

 (2)用双向链表来实现入队

自己看把比较简单看过链表文章都会

package queuedemo;public class MyQueue {static class ListNode{public int val ;public  ListNode prev;public ListNode next;public  ListNode(int val){this.val = val;}}public ListNode head;public ListNode last;public void offer(int val){ListNode node =new ListNode(val);if (head == null){head = last = node;}else{last.next = node;last = node;}}public void poll(){if (head == null){return;}head = head.next;head.prev = null;}public boolean Empty(){return head == null;}public int peek(){if (head == null){return -1;}return head.val;}
}

3.双端多了Deque是双端队列,两边都可以进出java包中有

2.2.循环数组(循环队列的实现原理)

1.可以保证空间不被浪费

2.定义一个front rear 这两个用来标记数据,然后rear再清零再循环到0位置继续往后,就变成循环队列了

3.这个有点抽象我们用 一个圆盘图来讲解(卷起来的数组)

开始rear和front斗士在0位置

现在有12 23 34 45 67 78 89

放一个往后面rear走一个,当rear和front相遇的时候就满了

(1)rear和front相遇有空的和满的情况

(2)如果放完下一个是front就是满的(浪费一个空间)

(3)定义一个usedSized来计数,没rear走一次就加一如果和数组长度一样了那么就是满的

(4)加一个标记第一次相遇时true 第二次就是满这样解决。

        其中rear和front满足一个关系就是,通过这个关系可以来更好的实现

         rear = (rear+1)%|len|

                          

我们通过牛客上面一个题来队循环队列来进行实现

. - 力扣(LeetCode)//这是网址自己进去练习

这里我会在idea中演示代码

出队就是front往后面走,入队就是rear往后面走,记得要判断队列是否都满了控了。

代码实现

package queuedemo;class MyCircularQueue {public int[] elem;public int front;public int rear;public MyCircularQueue(int k) {elem = new int[k];}//入队操作public boolean enQueue(int value) {if(isFull()) {return false;}elem[rear] = value;rear = (rear+1) % elem.length;return true;}//删除队头元素public boolean deQueue() {if(isEmpty()) {return false;}front = (front + 1) % elem.length;return true;}//得到队头元素 不删除public int Front() {if(isEmpty()) {return -1;}return elem[front];}//得到队尾元素 不删除public int Rear() {if(isEmpty()) {return -1;}int index = (rear == 0) ? elem.length-1 : rear-1;return elem[index];}//判空 front和rear相遇public boolean isEmpty() {return front == rear;}public boolean isFull() {return (rear+1) % elem.length == front;}
}

 2.3双端队列

双端队列指的时两边都可以进出

实现代码是这样

Deque stack = new ArrayDeque<>();//双端队列的线性实现//意味着你不仅可以当作队列也可以当作栈来使用,所以stack不唯一

Deque queue = new LinkedList<>();//双端队列的链式实现 比特就

2.4队列实现栈

两个队列才能实现栈

当两个队列都是空的时候,放到第一个队列,

再次入栈的时候方到不为空的队列

出栈的时候出刀到不为空的队列出size-1个元素

剩下的就是我要出栈的元素

. - 力扣(LeetCode)题目这个就是队列实现栈

代码实现

package testdemo;import java.util.LinkedList;
import java.util.Queue;class MyStack {private Queue<Integer> qu1;private Queue<Integer> qu2;public MyStack() {qu1 = new LinkedList<>();qu2 = new LinkedList<>();}public void push(int x) {if(empty()) {qu1.offer(x);return;}if(!qu1.isEmpty()) {qu1.offer(x);}else {qu2.offer(x);}}public int pop() {if(empty()) {return -1;}//找到不为空的队列 出size-1个元素if(!qu1.isEmpty()) {int size = qu1.size();for (int i = 0; i < size-1; i++) {qu2.offer(qu1.poll());}return qu1.poll();}else {int size = qu2.size();for (int i = 0; i < size-1; i++) {qu1.offer(qu2.poll());}return qu2.poll();}}//peekpublic int top() {if(empty()) {return -1;}//找到不为空的队列 出size-1个元素if(!qu1.isEmpty()) {int size = qu1.size();int tmp = -1;for (int i = 0; i < size; i++) {tmp = qu1.poll();qu2.offer(tmp);}return tmp;}else {int size = qu2.size();int tmp = -1;for (int i = 0; i < size; i++) {tmp = qu2.poll();qu1.offer(tmp);}return tmp;}}public boolean empty() {return qu1.isEmpty() && qu2.isEmpty();}
}

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

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

相关文章

OpenMP 编程模型

OpenMP 内存模型 共享内存模型&#xff1a; OpenMP 专为多处理器/核心、共享内存机器设计&#xff0c;底层架构可以是共享内存UMA或NUM OpenMP 执行模型 基于线程的并行&#xff1a; OpenMP 程序基于多线程来实现并行&#xff0c; 线程是操作系统可以调度的最小执行单元。 …

react 综合题-旧版

一、组件基础 1. React 事件机制 javascript 复制代码<div onClick{this.handleClick.bind(this)}>点我</div> React并不是将click事件绑定到了div的真实DOM上&#xff0c;而是在document处监听了所有的事件&#xff0c;当事件发生并且冒泡到document处的时候&a…

Facebook:连接世界的社交巨人

在当今数字化时代&#xff0c;Facebook作为全球最大的社交媒体平台之一&#xff0c;扮演着连接世界的重要角色。它不仅仅是一个社交网站&#xff0c;更是一个数字化的社交生态系统&#xff0c;影响着全球数十亿用户的生活和交流方式。本文将深入探讨Facebook的起源、用户规模和…

uniapp——第1篇:基于vue语法的、比原生开发屌的小程序开发

前提&#xff0c;建议先学会前端几大基础&#xff1a;HTML、CSS、JS、Ajax&#xff0c;还有一定要会Vue!&#xff08;Vue2\Vue3&#xff09;都要会&#xff01;&#xff01;&#xff01;不然不好懂 博主作为大二前端小白&#xff0c;刚刚接触前端微信小程序开发时选择的是基于“…

electron + vtkjs加载模型异常,界面显示类似于图片加载失败的图标

electron vtkjs加载模型显示异常&#xff0c;类似于图片加载失败的效果&#xff0c;如上图。 electron开发版本&#xff1a;13。 解决方法&#xff1a;升级electron版本号。 注意&#xff1a;win7最高兼容electron 22版本。

多维时序 | Matlab实现VMD-CNN-GRU变分模态分解结合卷积神经网络门控循环单元多变量时间序列预测

多维时序 | Matlab实现VMD-CNN-GRU变分模态分解结合卷积神经网络门控循环单元多变量时间序列预测 目录 多维时序 | Matlab实现VMD-CNN-GRU变分模态分解结合卷积神经网络门控循环单元多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现VMD-CN…

c++指针的定义和使用

1、定义一个指针 int a10; //定义指针的语法&#xff1a;数据类型 * 指针变量名&#xff1a;int * p&#xff1b; //让指针记录变量a的地址&#xff1a;p &a; int a 10;int* p; p &a; cout << "a的地址为&#xff1a;" << &a <<…

第二十二节 Java 流(Stream)、文件(File)和IO

Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。 Java.io 包中的流支持很多种格式&#xff0c;比如&#xff1a;基本类型、对象、本地化字符集等等。 一个流可以理解为一个数据的序列。输入流表示从一个源读取数据&#xff0c;输出流…

社区居民医疗健康系统 微信小程序

设计原则 本社区健康医疗APP采用 Hbuildex技术&#xff0c;使用Java语言开发&#xff0c;充分保证了系统稳定性、完整性。 社区健康医疗APP的设计与实现的设计思想如下&#xff1a; &#xff08;1&#xff09;操作简单方便、系统界面安全良好、简单明了的页面布局、方便查询相…

GPT-4.5 Turbo意外曝光,最快明天发布?OpenAI终于要放大招了!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

【计算机网络篇】计算机网络的定义和分类

文章目录 &#x1f354;什么是计算机网络&#x1f5c3;️计算机网络的分类⭐按交换方式分类⭐按使用者分类⭐按传输介质分类⭐按覆盖范围分类⭐按拓扑结构分类 &#x1f6f8;小结 &#x1f354;什么是计算机网络 计算机网络是指将多台计算机或其他网络设备通过通信链路连接起来…

汇编语言程序设计 第2章:8086指令系统简介及寻址方式

文章目录 1. 指针的分类及格式1.1 指令的分类1.2 指令格式 2. 寻址方式MOV指令简介2.1 立即寻址2.2 寄存器寻址2.3 直接寻址2.4 寄存器间接寻址2.5 寄存器相对寻址2.6 基址变址寻址2.7 相对基址变址寻址 3. 数据传送指令3.1 通用数据传送指令3.2 地址传送指令&#xff08;LEA、…

C语言黑魔法第三弹——动态内存管理

本文由于排版问题&#xff0c;可能稍显枯燥&#xff0c;但里面知识点非常详细&#xff0c;建议耐心阅读&#xff0c;帮助你更好的理解动态内存管理这一C语言大杀器 进阶C语言中有三个知识点尤为重要&#xff1a;指针、结构体、动态内存管理&#xff0c;这三个知识点决定了我们…

手把手教你打造研究生个人简历模板|轻松驾驭简历设计

在简历设计中&#xff0c;如何展现自己的学历优势&#xff0c;是很多学生困扰的问题。 下面&#xff0c;我们首先从即时设计中分享一些不同风格的研究生简历模板。 风格多样的免费简历设计模板https://js.design/community?categorysearch&search%E7%AE%80%E5%8E%86&…

使用STM32+ESP8266(ESP-01S)+点灯科技(手机端Blinker)实现远程控制智能家居

硬件准备&#xff1a;STM32单片机、ESP8266&#xff08;ESP-01S&#xff09;、CH340C下载烧录器 软件准备&#xff1a;STM32CubeMX、Keil uVision5、Arduino IDE、 点灯科技&#xff08;手机端APP Blinker&#xff09;点灯科技 (diandeng.tech)点击进入 值得注意的是&#x…

【EfficientNetV2】《EfficientNetV2: Smaller Models and Faster Training》

google ICML-2021 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method4. 1 Understanding Training Efficiency4.2 Training-Aware NAS and Scaling4.3 Progressive learning 5 Experiments5.1 Datasets and Metrics5.2 ImageNet ILSVR…

力扣654 最大二叉树 Java版本

文章目录 题目描述解题思路代码 题目描述 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀上…

【Python】新手入门学习:详细介绍单一职责原则(SRP)及其作用、代码示例

【Python】新手入门学习&#xff1a;详细介绍单一职责原则&#xff08;SRP&#xff09;及其作用、代码示例 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyT…

力扣106 从中序与后续遍历序列构造二叉树

文章目录 题目描述解题思路代码 题目描述 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], …

海豚调度系列之:认识海豚调度

海豚调度系列之&#xff1a;认识海豚调度 一、海豚调度二、特性三、建议配置四、名次解释 一、海豚调度 Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景&#xff0c;提供了一个可视化操作任务、工作流和全生命周期数据处理过…