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.rhkb.cn/news/275860.html

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

相关文章

ElasticSearch深度分页问题如何解决

文章目录 概述解决方法深度分页方式from size深度分页之scrollsearch_after 三种分页方式比较 概述 Elasticsearch 的深度分页问题是指在大数据集上进行大量分页查询时可能导致的性能下降和资源消耗增加的情况。这种情况通常发生在需要访问大量数据的情形下&#xff0c;比如用…

算法空间复杂度计算

目录 空间复杂度定义 影响空间复杂度的因素 算法在运行过程中临时占用的存储空间讲解 例子 斐波那契数列递归算法的性能分析 二分法&#xff08;递归实现&#xff09;的性能分析 空间复杂度定义 空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大…

PHP序列化基础知识储备

一、序列化与反序列化 1、概念 PHP中的序列化是指将复杂的数据类型转换为可存储或可传输的字符串&#xff0c;而反序列化则是将这些字符串重新转换回原来的数据类型。 序列化通常使用 serialize() 函数完成&#xff0c;它可以将数组、对象、字符串等复杂数据类型压缩到一个字…

uniapp发行H5获取当前页面query

阅读uni的文档大致可得通过 onLoad与 onShow()的形参都能获取页面传递的参数&#xff0c;例如在开发时鼠标移动到方法上可以看到此方法的简短介绍 实际这里说的是打开当前页面的参数&#xff0c;在小程序端的时候测试并无问题&#xff0c;但是发行到H5时首页加载会造成参数获取…

vscode setting.json 全局设置 工作区设置 位置 优先级

vscode中setting.json有两种配置权限 一、全局配置&#xff1a;setting.json文件位于C:\Users\Administrator\AppData\Roaming\Code\User\settings.json 二、工作区配置&#xff1a;setting.json文件位于工作区的.vscode\settings.json 当两种配置同时存在时&#xff0c;工作区…

什么是测试自动化平台?为什么需要测试自动化平台?如何选择平台

什么是测试自动化平台&#xff1f; 测试自动化平台是一种软件工具或框架&#xff0c;可帮助软件开发团队实现测试流程的自动化。它集成了多种功能和工具&#xff0c;使测试人员能够更高效地进行测试计划、用例设计、测试执行和结果分析。 为什么需要测试自动化平台&#xff1f…

qiankun:vite/webpack项目配置

相关博文&#xff1a; https://juejin.cn/post/7216536069285429285?searchId202403091501088BACFF113F980BA3B5F3 https://www.bilibili.com/video/BV12T411q7dq/?spm_id_from333.337.search-card.all.click qiankun结构&#xff1a; 主应用base&#xff1a;vue3historyv…

Python环境搭建 -- Python与PyCharm安装

一、Python安装 我们先找到Python的官方网站&#xff0c;在浏览器中搜索Python即可&#xff0c;然后进入Python官网 点击Downloads&#xff0c;选择对应匹配的操作系统 点进去之后&#xff0c;Python的版本分为稳定的版本和前置版本&#xff0c;前置的版本就是还没有发行的版本…

爬虫练习:获取某网站的房价信息

一、相关网站 二、相关代码 import requests from lxml import etree import csv with open(房天下数据.csv, w, newline, encodingutf-8) as csvfile:fieldnames [名称, 地点,价格,总价,联系电话]writer csv.DictWriter(csvfile, fieldnamesfieldnames)writer.writeheader…

力扣串题:字符串中的第二大数字

此题的精妙之处在于char类型到int类型的转化&#xff0c;需要运算来解决 int secondHighest(char * s) {int max1-1;int max2-1;int szstrlen(s);int i 0 ;for(i0;i<sz;i){if(s[i]>0&&s[i]<9){if((s[i]-0)>max1){max2max1;max1s[i]-0;}else if((s[i]-0)&l…

西井科技参与IATA全球货运大会 以AI绿动能引领智慧空港新未来

3月12日至14日&#xff0c;由国际航空运输协会IATA主办的全球货运大会&#xff08;World Cargo Symposium&#xff09;在中国香港成功举办&#xff0c;这是全球航空货运领域最大规模与影响力的年度盛会。作为大物流领域全球领先的“智能化与新能源化”综合解决方案提供商&#…

NLP:HanLP的下载与使用

昨天说到要做一个自定义的训练模型&#xff0c;但是很快这个想法就被扑灭了&#xff0c;因为这个手工标记的成本太大&#xff0c;而且我的上级并不是想要我做这个场景&#xff0c;而是希望我通过这个场景展示出可以接下最终需求的能力。换句话来说&#xff1a;可以&#xff0c;…

C语言之文件操作(万字详解)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a; 我要学编程(ಥ_ಥ)-CSDN博客 目录 前言 文件的打开和关闭 流和标准流 文件指针 文件的打开和关闭 文件的顺序读写 顺序读写函数介绍 fputc的使用 fgetc的使用 fput…

嵌入式常用5种通信协议

简介&#xff1a; 嵌入式常用五种通信协议为&#xff1a;UART、RS232、RS485、IIC、SPI。 由于这几种通信协议十分相似又有区别&#xff0c;所以分组记忆&#xff0c;红色的为一组&#xff0c;蓝色的为一组。 ①组都有两条线&#xff0c;且都是异步通信没得时钟线&#xff0c…

C#快速入门基础

本篇文章从最基础的C#编程开始学习&#xff0c;经过非常优秀的面向对象编程思想和方法的学习&#xff0c;为C#编程打下基础。 第 01 章 C#开发环境之VS使用和.NET平台基础 1.1 Visual Studio 开发环境 1.1.1 硬件环境 i5CPUi5CPU&#xff08;建议 4核 4线程或以上 &#xff0…

【保姆级爬虫】微博关键词搜索并获取博文和评论内容(python+selenium+chorme)

微博爬虫记录 写这个主要是为了防止自己忘记以及之后的组内工作交接&#xff0c;至于代码美不美观&#xff0c;写的好不好&#xff0c;统统不考虑&#xff0c;我只能说&#xff0c;能跑就不错了&#xff0c;上学压根没学过python好吧&#xff0c;基本上是crtlc&ctrlv丝滑小…

Linux CentOS系统安装Spug并结合内网穿透实现远程访问本地运维平台

目录 前言 1. Docker安装Spug 2 . 本地访问测试 3. Linux 安装cpolar 4. 配置Spug公网访问地址 5. 公网远程访问Spug管理界面 6. 固定Spug公网地址 结语 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊Linux CentOS系统安装Spug并结合…

Nodejs 第五十四章(net)

net模块是Node.js的核心模块之一&#xff0c;它提供了用于创建基于网络的应用程序的API。net模块主要用于创建TCP服务器和TCP客户端&#xff0c;以及处理网络通信。 TCP&#xff08;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的传输协议&#xff0c;用于…

重塑语言智能未来:掌握Transformer,驱动AI与NLP创新实战

Transformer模型 Transformer是自然语言理解(Natural Language Understanding&#xff0c;NLU)的游戏规则改变者&#xff0c;NLU 是自然语言处理(Natural Language Processing&#xff0c;NLP)的一个子集。NLU已成为全球数字经济中AI 的支柱之一。 Transformer 模型标志着AI 新…

【学一点RISC-V】RISC-V IMSIC

IMSIC RISC-V AIA 文档 第三章 Incoming MSI Controller (IMSIC) 传入 MSI 控制器&#xff08;IMSIC&#xff09;是一个可选的 RISC-V 硬件组件&#xff0c;与 hart 紧密相连&#xff0c;每个 hart 有一个 IMSIC。IMSIC 接收并记录 Hart 的传入消息信号中断 (MSI)&#xff0c;并…