Java - 数据结构,队列
一、什么是队列
普通队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(FirstIn First Out) 入队列:进行插入操作的一端称为队尾(Tail/Rear) 出队列:进行删除操作的一端称为队头(Head/Front)

双端队列:可以在对头或者队尾进行插入或者删除操作。

普通队列和双端队列

从上面知道双向列表可以当普通队列使用,也可以当双端队列使用,也可以当栈使用。
二、队列常用的方法
2.1、Queue

注意add函数和offer函数

public static void main(String[] args) {Queue<Integer> queue = new LinkedList<>();queue.add(1);//添加元素queue.add(2);//添加元素queue.add(3);//添加元素queue.offer(4);//添加元素queue.offer(5);//添加元素queue.offer(6);//添加元素System.out.println(queue.peek());//获取对头元素,但是不删除System.out.println(queue.element());//获取对头元素,但是不删除System.out.println(queue.poll());//获取对头元素,并且删除对头元素System.out.println(queue.remove());//获取对头元素,并且删除对头元素}
2.2、Deque

public static void main(String[] args) {Deque<Integer> deque = new LinkedList<>();deque.add(1);//默认在队尾添加元素deque.addFirst(2);//在对头添加元素deque.addLast(3);//在队尾添加元素deque.offer(4);//在队尾添加元素deque.offerLast(5);//在队尾添加元素deque.offerFirst(6);//在队头添加元素System.out.println(deque);System.out.println(deque.peek());//获取元素,但是不删除System.out.println(deque.peekFirst());//获取队头元素,但是不删除System.out.println(deque.peekLast());//获取队尾元素,但是不删除System.out.println(deque.poll());//获取队头元素,并且删除System.out.println(deque.pollFirst());//获取队头元素,并且删除System.out.println(deque);}
三、单链表模拟实现队列

单链表可以实现队列,那双向链表也可以实现队列
使用单链表第三种方式实现队列
offer()- 在队列里面添加元素
/*** 在队列里面添加元素,实际上就是尾插法* @param val*/public void offer(int val){//要插入节点,那就要先创造一个节点Node node = new Node(val);//这时候就要分两种情况:1、如果是第一次插入 2、不是第一次插入if(head == null){//head == null说明是第一次插入head = node;last = node;}else {last.next = node;last = last.next;}}

poll() - 出队列
/*** 出队列,并且删除元素* @return*/public int poll(){//出队列就是删除头结点,但是如果链表里面没有节点那就不能删除if(isEmpty()){throw new RuntimeException("队列为空!");}int oldVal = head.val;head = head.next;return oldVal;}/*** 判断队列是否为空,如果队列为空那就返回true,否则返回FALSE* @return*/public boolean isEmpty(){return this.head == null;}
使用的单链表实现简单的队列
//使用单链表实现队列,首先就要定义节点
class Node{//值域public int val;//指针域public Node next;public Node(int val){this.val = val ;}
}
public class MyQueue {//单链表实现队列,那就要加上一个尾指针public Node head;//头结点public Node last;//尾巴节点/*** 在队列里面添加元素,实际上就是尾插法* @param val*/public void offer(int val){//要插入节点,那就要先创造一个节点Node node = new Node(val);//这时候就要分两种情况:1、如果是第一次插入 2、不是第一次插入if(head == null){//head == null说明是第一次插入head = node;last = node;}else {last.next = node;last = last.next;}}/*** 出队列,并且删除元素* @return*/public int poll(){//出队列就是删除头结点,但是如果链表里面没有节点那就不能删除if(isEmpty()){throw new RuntimeException("队列为空!");}int oldVal = head.val;head = head.next;return oldVal;}/*** 判断队列是否为空,如果队列为空那就返回true,否则返回FALSE* @return*/public boolean isEmpty(){return this.head == null;}/*** 获取对头的元素* @return*/public int peek(){//出队列就是删除头结点,但是如果链表里面没有节点那就不能删除if(isEmpty()){throw new RuntimeException("队列为空!");}return head.val;}
}
四、循环队列
我们说了可以利用链表实现队列,那能不能利用数组实现队列???

上图转载于:https://blog.csdn.net/DarkAndGrey/article/details/122511544
队列面试题
设计循环队列


上图转载于:https://blog.csdn.net/DarkAndGrey/article/details/122511544
代码如下:
public class MyCircularQueue {//我们知道循环队列是有数组实现的,所以要创建一个数组,并且还有表示对头和队尾的下标public int[] elem;public int front;//对头的下标public int rear;//队尾的下标/*** 构造方法,初始化数组的大小* @param k*/public MyCircularQueue(int k) {this.elem = new int[k+1];}/*** 入队列* @param value* @return*/public boolean enQueue(int value) {//在入队列的时候先判断队列是否满,满了不能入if(isFull()){return false;}elem[rear] = value;rear = (rear+1) % elem.length;return true;}/*** 出队列* @return*/public boolean deQueue() {if(isEmpty()){return false;}front = (front+1) % elem.length;return true;}/*** 返回对头下标的元素* @return*/public int Front() {if(isEmpty()){return -1;}return elem[front];}/*** 获取队尾元素* @return*/public int Rear() {if(isEmpty()){return -1;}int index = 0;if(rear == 0){index = elem.length - 1;}else{index = rear - 1;}return elem[index];}public boolean isEmpty() {//front的下一个是rear,那就说明空了return front == rear;}/*** 判断队列是否满* @return*/public boolean isFull() {//rear的下一个如果是front,那这个队列就满了if((rear+1) % elem.length == front){return true;}return false;}
}
用队列实现栈


代码如下:
class MyStack {private Queue<Integer> qu1;private Queue<Integer> qu2;public MyStack() {qu1 = new LinkedList<>();qu2 = new LinkedList<>();}/*** 添加元素,将要添加的元素放入不为空的栈里面* @param x*/public void push(int x) {if(!qu1.isEmpty()){//如果qu1不为空,那就插入元素qu1.offer(x);}else if(!qu2.isEmpty()){//如果qu2不为空,那就插入元素qu2.offer(x);}else{//第一次插入的时候,两个都为空的时候,那就指定队列插入元素qu1.offer(x);}}/*** 弹出元素* @return*/public int pop() {if (empty()){return -1;}if(!qu1.isEmpty()){int size = qu1.size();for (int i = 0; i < size - 1; i++) {int val = qu1.poll();qu2.offer(val);}return qu1.poll();}if(!qu2.isEmpty()){int size = qu2.size();for (int i = 0; i < size - 1; i++) {int val = qu2.poll();qu1.offer(val);}return qu2.poll();}return -1;}public int top() {if (empty()){return -1;}if(!qu1.isEmpty()){int val = 0;//要记录这个size ,不然当出一个元素的时候这个函数都会变化,得到的值也会变化int size = qu1.size();for (int i = 0; i < size; i++) {val = qu1.poll();qu2.offer(val);}return val;}if(!qu2.isEmpty()){int val = 0;int size = qu2.size();for (int i = 0; i < size; i++) {val = qu2.poll();qu1.offer(val);}return val;}return -1;}public boolean empty() {return qu1.isEmpty() && qu2.isEmpty();}
}
用栈实现队列

栈 的特性是:先进后出。也就是说第一个入栈的数据,将是最后一个出栈,我们利用两个栈来实现这题。

代码如下:
class MyQueue {Stack<Integer> stack1;Stack<Integer> stack2;public MyQueue() {stack1 = new Stack<>();stack2 = new Stack<>();}public void push(int x) {stack1.push(x);}public int pop() {if(stack2.isEmpty()){while(!stack1.isEmpty()){stack2.push(stack1.pop());}}return stack2.pop();}public int peek() {// 防止 别人一开始 就调用 peek,所以 peek 也需要 写 stack1 导入 stack2 的程序if(stack2.isEmpty()){while(!stack1.isEmpty()){stack2.push(stack1.pop());}}return stack2.peek();}public boolean empty() {// 如果模拟的队列 将全部数据出队,那么 stack1 和 stack2 都为空return stack1.isEmpty() && stack2.isEmpty();}
}
相关文章:
Java - 数据结构,队列
一、什么是队列 普通队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(FirstIn First Out) 入队列:进行插入操作的一端称为队尾(Tail/Rear) 出队列…...
ccc-pytorch-感知机算法(3)
文章目录单一输出感知机多输出感知机MLP反向传播单一输出感知机 内容解释: w001w^1_{00}w001:输入标号1连接标号0(第一层)x00x_0^0x00:第0层的标号为0的值O11O_1^1O11:第一层的标号为0的输出值t:真实…...
LeetCode 225.用队列实现栈
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。实现 MyStack 类:void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元素。int top() …...
【面试】spring控制反转IOC
目录一.说明二.ioc的概念和作用三.优点四.实现机制五.IOC和DI的区别六.设计原则一.说明 1.ioc的概念2.ioc的作用3.ioc的优点4.ioc的实现机制 二.ioc的概念和作用 1.全称Inversion of Control2.控制:创建对象的控制权3.反转:以前对象是程序员主动去new…...
Spring 事务管理详解及使用
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
LeetCode 232.用栈实现队列
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元…...
go面向对象思想封装继承多态
go貌似都没有听说过继承,当然这个继承不像c中通过class类的方式去继承,还是通过struct的方式,所以go严格来说不是面向对象编程的语言,c和java才是,不过还是可以基于自身的一些的特性实现面向对象的功能,面向…...
【网络原理9】HTTP响应篇
在前两篇文章当中,已经分别介绍了HTTP是什么,以及常见的请求头当中的属性。【网络原理7】认识HTTP_革凡成圣211的博客-CSDN博客HTTP抓包,Fiddler的使用https://blog.csdn.net/weixin_56738054/article/details/129148515?spm1001.2014.3001.…...
SpringCloud之Seata(二)
4.Seata如何应用于项目? 安装seata及修改配置 4.1 官网下载Seata安装包 4.2 修改seata/config.txt 4.2.1 修改存储方式 store.db.dbTypemysql store.db.driverClassNamecom.mysql.jdbc.Driver store.db.urljdbc:mysql://你的IP:3306/seata?useUnicodetrue sto…...
【Redis-入门阶段】基本数据结构
Redis支持多种数据结构,包括字符串、列表、哈希、集合和有序集合。这些数据结构在Redis中被称为键值对,其中键是一个字符串,值可以是一个字符串、列表、哈希、集合或有序集合。接下来,我们将详细介绍这些数据结构的使用方法。字符…...
BACnet协议详解————MS/TP物理层,数据链路层和网络层
文章目录写在前面1 物理层2 数据链路层MSTP的流程如下noteMS/TP帧格式3 网络层写在前面 这周加更一篇,来弥补一下之前落下的进度。简单的说两句,之前讲应用层的时候,只是跟官方的手册来同步一下,但是从个人理解来说,自…...
Tomcat
Tomcat 1 简介 1.1 什么是Web服务器 Web服务器是一个应用程序(软件),对HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作,让Web开发更加便捷。主要功能是"提供网上信息浏览服务"。 Web服务器是安…...
创客匠人直播:构建公域到私域的用户增长模型
进入知识付费直播带货时代,很多拥有知识技能经验的老师和培训机构吃到了流量红利。通过知识付费直播,老师们可以轻松实现引流、变现,还可以突破时间、地域的限制,为全国各地的学员带来优质的教学服务,因此越来越受到教…...
机试指南
文章目录零、绪论和IDE安装int取值范围常犯的编程小错误一、枚举和模拟 (暴力求解)(一) 枚举1.Reverse函数 求 反序数2.程序出错的原因1.编译错误 (compile):基本语法错误2.链接错误 (link):函数名写错了3.运行错误 (run):结果与预期不符&…...
Android CTA认证设定首选网络类型
需求 硬件只支持4G,过CTA认证时打网络电话,会出现3G网络的选择,会导致过不了,需要禁用3G网络选择功能。 Android 8.1.0 分析 可adb命令查看当前的网络类型 getprop | grep “network” 打印如下: [gsm.network.type]: [LTE,LTE] [ro.telephony.default_network]: [9] …...
Android 动态切换应用图标方案
经常听到大家讨论类似的需求,怀疑大厂是不是用了此方案,据我个人了解,多数头部 app 其实都是发版来更新节假日的 icon。当然本方案也是一种可选的方案,以前我也调研过,存在问题和作者所述差不多,此外原文链…...
SMART PLC斜坡函数功能块(梯形图代码)
斜坡函数Ramp的具体应用可以参看下面的文章链接: PID优化系列之给定值斜坡函数(PLC代码+Simulink仿真测试)_RXXW_Dor的博客-CSDN博客很多变频器里的工艺PID,都有"PID给定值变化时间"这个参数,这里的给定值变化时间我们可以利用斜坡函数实现,当然也可以利用PT1…...
不那么认真的linux复习
这是个不那么认真的linux总结,可能有一些错误 1、linuxkernel(内核)shell(外壳)fs(文件系统)pro/uti/tol(应用程序) 2、ls(列出文件) -a…...
Redis系列文章总纲
跟着老万学Redis 前言 从事开发工作这么久,很多核心技术其实都还只是局限在满足日常开发工作中的基础使用,并没有完整的总结研究。今年的目标之一是完成几个技术栈的系列博客,系统的总结一下知识体系,目前计划是从Redis开始。 Re…...
更新丨三大模块升级,助力高效交付商业项目!
功能更新!本文将介绍最新升级的步进漫游、行业方案、VR漫游三个模块,让您更快更好的了解系统能力,为您带来更加便捷、高效的使用体验。步进漫游 离线导出步进式漫游系统,是基于全景图自动生成三维建模的解决方案,实现大…...
实战指南:在Cortex-A53/A57平台上配置与调试AMBA AXI/ACE总线
Cortex-A53/A57平台AMBA总线实战:从寄存器配置到性能调优 1. AMBA总线架构与Cortex-A系列核心的深度适配 在嵌入式系统开发领域,AMBA总线作为ARM处理器生态的核心互联架构,其性能表现直接决定了SoC整体效能。Cortex-A53/A57作为经典的big.LIT…...
CW32F003与CW32F030国产MCU深度对比:从选型到项目实战全解析
1. 项目概述与核心价值最近在整理手头的开发板,翻出了两块来自武汉芯源的CW32F003和CW32F030。这两款芯片和对应的开发板,在国产MCU的入门级市场里,算得上是“老朋友”了,尤其是对于成本敏感、需要快速验证方案的工程师和学生来说…...
智慧果园黄瓜识别分割数据集labelme格式1002张1类别
数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件)图片数量(jpg文件个数):1002标注数量(json文件个数):1002标注类别数:1标注类别名称:["cucumber"]每个类别标注的框数:c…...
如何实现百度网盘效率革命?BaiduPanFilesTransfers智能管理工具深度解析
如何实现百度网盘效率革命?BaiduPanFilesTransfers智能管理工具深度解析 【免费下载链接】BaiduPanFilesTransfers 百度网盘批量转存、分享和检测工具 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduPanFilesTransfers 还在为海量网盘资源的手动整理而消…...
告别Wi-Fi卡顿!手把手教你读懂802.11ax的BSR机制,优化家庭网络上行体验
告别Wi-Fi卡顿!手把手教你读懂802.11ax的BSR机制,优化家庭网络上行体验 你是否经历过这样的场景:视频会议时画面突然卡成马赛克,游戏团战时操作延迟飙升,或是上传文件进度条像蜗牛爬行?这些恼人的问题往往源…...
【为风光储一体化系统注入精准“心跳”的隐形力量】
在“双碳”战略目标的宏伟蓝图下,构建以新能源为主体的新型电力系统已成为时代命题。风光储一体化,作为平滑新能源波动、提升电网消纳能力的关键路径,正迎来前所未有的发展机遇。在这一变革性的能源体系中,每一处精密的控制与高效…...
华住房态检查表
...
硬件知识 allegro16.6 3D 模型导入与其问题笔记
1. 嘉立创获取3D 模型(注意:网页版不行,需要现在专业版) 2. freecad 去去除 PCB 的封装。(这个过程可能额会导致 出现一个文件里面有两个相同的元器件,需要删掉一个,自己检查) 3. …...
禾赛季报图解:营收6.8亿 新业务今年将贡献1亿收入 拿下奔驰大单
雷递网 雷建平 5月20日禾赛科技(纳斯达克:HSAI;港交所:2525)日前公布其截至2026年3月31日止三个月的未经审计财务业绩。财报显示,禾赛2026年第一季度实现营收6.8亿,同比增长29.6%。禾赛本季度宣…...
SpringBoot 2.7项目里,用Knife4j 4.3.0给API文档换个‘高级脸’(OpenAPI3实战)
SpringBoot 2.7项目里,用Knife4j 4.3.0给API文档换个‘高级脸’(OpenAPI3实战) 当你的SpringBoot项目已经完成了基础的API文档集成,接下来要思考的是如何让这份文档从"能用"变成"好用且好看"。Knife4j作为Swa…...
