Java(二十二)---队列

文章目录

  • 前言
  • 1.队列(Queue)的概念
  • 2.Queue的使用
  • 3.队列的模拟实现
  • 4.循环队列
  • 5.双端队列
  • 6.面试题
    • [1. 用队列实现栈](https://leetcode.cn/problems/implement-stack-using-queues/description/)
    • [2. 用栈实现队列](https://leetcode.cn/problems/implement-queue-using-stacks/description/)


前言

上一篇我们学习了栈(Stack) ,现在讲队列(Queue)。


1.队列(Queue)的概念

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾(Tail/Rear) 出队列:进行删除操作的一端称为队头(Head/Front)
在这里插入图片描述


2.Queue的使用

在Java中,Queue是个接口,底层是通过链表实现的。
在这里插入图片描述

在这里插入图片描述

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

3.队列的模拟实现

队列中既然可以存储元素,那底层肯定要有能够保存元素的空间,通过前面线性表的学习了解到常见的空间类型有两种:顺序结构链式结构。思考下:队列的实现使用顺序结构还是链式结构好?
在这里插入图片描述

public class MyQueue {static class ListNode{public int val;public ListNode prev;public ListNode next;public ListNode(int val) {this.val = val;}}public ListNode first;public ListNode last;public int usedSize = 0;public void offer(int data){ListNode node = new ListNode(data);if (isEmpty()){first = last = node;}else {last.next = node;node.prev = last;last = node;}this.usedSize++;}public int poll(){if (isEmpty()){return -1;}int val = first.val;first = first.next;if (first!=null){first.prev = null;}this.usedSize--;return val;}public int peek(){if (isEmpty()){return -1;}return first.val;}public boolean isEmpty(){return usedSize == 0;}
}

4.循环队列

如何使用顺序表来模拟队列?
使用循环队列
实际中我们有时还会使用一种队列叫循环队列。如操作系统课程讲解生产者消费者模型时可以就会使用循环队列。环形队列通常使用数组实现。

在这里插入图片描述
有下面三个问题需要先解决:

  1. 怎么判断数组已经满了?
  2. 怎么判断数组是空的?
  3. 如何使数组下标进行循环?

在这里插入图片描述

在这我们使用方案二进行操作。
设计循环队列

class MyCircularQueue {public int rear;public int front;public int[]elem;public MyCircularQueue(int k) {elem = new int[k+1];}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];}public boolean isEmpty() {return rear == front;}public boolean isFull() {return (rear+1)%elem.length == front;}
}

5.双端队列

双端队列(deque)是指允许两端都可以进行入队和出队操作的队列,deque 是 “double ended queue” 的简称。
那就说明元素可以从队头出队和入队,也可以从队尾出队和入队。

在这里插入图片描述
Deque是一个接口,使用时必须创建LinkedList的对象。

在实际工程中,使用Deque接口是比较多的,栈和队列均可以使用该接口

Deque< Integer > stack = new ArrayDeque<>();//双端队列的线性实现
Deque< Integer > queue = new LinkedList<>();//双端队列的链式实现

6.面试题

1. 用队列实现栈

在这里插入图片描述
在这里插入图片描述

class MyStack {public Queue<Integer> queue1;public Queue<Integer> queue2;public MyStack() {queue1 = new LinkedList();queue2 = new LinkedList();}public void push(int x) {if (!queue1.isEmpty()){queue1.offer(x);}else if (!queue2.isEmpty()){queue2.offer(x);}else{queue1.offer(x);}}public int pop() {if (empty()){return -1;}if (!queue1.isEmpty()){int size = queue1.size();for (int i=0;i<size-1;i++){queue2.offer(queue1.poll());}return queue1.poll();}else{int size = queue2.size();for(int i = 0;i<size-1;i++){queue1.offer(queue2.poll());}return queue2.poll();}}public int top() {if (empty()){return -1;}if (!queue1.isEmpty()){int size = queue1.size();int val = 0;for (int i = 0; i< size;i++){val = queue1.poll();queue2.offer(val);}return val;}else{int size = queue2.size();int val = 0;for(int i = 0;i<size;i++){val = queue2.poll();queue1.offer(val);}return val;}}public boolean empty() {return queue1.isEmpty()&&queue2.isEmpty();}
}

2. 用栈实现队列

在这里插入图片描述

在这里插入图片描述

class MyQueue {public ArrayDeque<Integer> stack1;public ArrayDeque<Integer> stack2;public MyQueue() {stack1 = new ArrayDeque();stack2 = new ArrayDeque();}public void push(int x) {stack1.push(x);        }public int pop() {if (empty()){return -1;}if (stack2.isEmpty()){while(!stack1.isEmpty()){stack2.push(stack1.pop());}}return stack2.pop();}public int peek() {if (empty()){return -1;}if (stack2.isEmpty()){while(!stack1.isEmpty()){stack2.push(stack1.pop());}}return stack2.peek();}public boolean empty() {return stack1.isEmpty()&&stack2.isEmpty();}
}

下一篇便要进入现阶段比较难的二叉树的部分,大家做好准备,开干!

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

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

相关文章

人工智能导论-机器学习

机器学习概述 概述 本章主要介绍的机器学习的概念、发展历程、发展趋势、相关应用&#xff0c;着重拓展机监督学习和无监督学习的相关知识。 重点&#xff1a;机器学习的定义和应用&#xff1b; 难点&#xff1a;机器学习算法及分类。 机器学习 - 重要性 MachineLeaning出…

<数据集>钢板缺陷检测数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;1986张 标注数量(xml文件个数)&#xff1a;1986 标注数量(txt文件个数)&#xff1a;1986 标注类别数&#xff1a;7 标注类别名称&#xff1a;[crescent gap, silk spot, water spot, weld line, oil spot, punchin…

工业圆点定位激光器主要应用场景有哪些?

在现代工业生产的各个领域&#xff0c;精确定位和高效操作已成为提升生产效率和产品质量的关键。其中&#xff0c;工业圆点定位激光器以其高精度、高效率的特性&#xff0c;成为了众多工业应用中的核心工具。接下来我们就跟着鑫优威一起来深入了解一下关于工业圆点定位激光器的…

抖音/快手/小红书私信卡片在线制作

W外链平台&#xff0c;作为现代网络营销领域的一颗璀璨明星&#xff0c;其强大的功能和独特的优势已经吸引了无数企业和个人的目光。在如今这个信息爆炸的时代&#xff0c;如何有效地将自己的网站、产品、服务推广出去&#xff0c;成为了每个营销人员都在思考的问题。而W外链平…

CentOS 7报错:yum命令报错 “ Cannot find a valid baseurl for repo: base/7/x86_6 ”

参考连接&#xff1a; 【linux】CentOS 7报错&#xff1a;yum命令报错 “ Cannot find a valid baseurl for repo: base/7/x86_6 ”_centos linux yum search ifconfig cannot find a val-CSDN博客 Centos7出现问题Cannot find a valid baseurl for repo: base/7/x86_64&…

uniapp 微信默认地图选点功能实现

效果图 配置项 微信公众平台-小程序配置 uniapp配置 上代码 <template><view class"content"><button click"toMap">请选择位置</button></view> </template><script setup lang"ts">function toMa…

Flink HA

目录 Flink HA集群规划 环境变量配置 masters配置 flink-conf.yaml配置 测试 Flink HA集群规划 FLink HA集群规划如下&#xff1a; IP地址主机名称Flink角色ZooKeeper角色192.168.128.111bigdata111masterQuorumPeerMain192.168.128.112bigdata112worker、masterQuorumPee…

Leetcode1929. 数组串联

问题描述&#xff1a; 给你一个长度为 n 的整数数组 nums 。请你构建一个长度为 2n 的答案数组 ans &#xff0c;数组下标 从 0 开始计数 &#xff0c;对于所有 0 < i < n 的 i &#xff0c;满足下述所有要求&#xff1a; ans[i] nums[i]ans[i n] nums[i] 具体而言…

Unity 导入MRTK,使用URP 升级材质,MRTK的材质还是洋红色

控制台显示信息 ToggleBackground material was not upgraded. There’s no upgrader to convert Mixed Reality Toolkit/Standard shader to selected pipeline UnityEditor.Rendering.Universal.UniversalRenderPipelineMaterialUpgrader:UpgradeProjectMaterials() (at 点击…

独立游戏《星尘异变》UE5 C++程序开发日志6——实现存档和基础设置系统

目录 一、存档类 1.创建一个SaveGame类 2.存储关卡内数据 3.加载关卡数据 4.关于定时器 5.存储全局数据 6.加载全局数据 二、存档栏 1.存档栏的数据结构 2.创建新存档 3.覆盖已有存档 4.删除存档 三、游戏的基础设置 1.存储游戏设置的数据结构 2.初始化设置 3.…

在国产芯片上实现YOLOv5/v8图像AI识别-【1.3】YOLOv5的介绍及使用(训练、导出)更多内容见视频

本专栏主要是提供一种国产化图像识别的解决方案&#xff0c;专栏中实现了YOLOv5/v8在国产化芯片上的使用部署&#xff0c;并可以实现网页端实时查看。根据自己的具体需求可以直接产品化部署使用。 B站配套视频&#xff1a;https://www.bilibili.com/video/BV1or421T74f 数据…

5.5 软件工程-系统测试

系统测试 - 意义和目的 系统测试 - 原则 系统测试 - 测试过程 系统测试 - 测试策略 系统测试 - 测试方法 真题 系统测试 - 测试用例设计 黑盒测试 白盒测试 真题 系统测试 - 调试 系统测试 - 软件度量 真题

vue 实现打字机效果

打字机效果组件&#xff0c;支持像打字机一样模仿键入文本。支持vue 插值语法和表格等打印 ps: 灵感来着于vue-type-writer 但是 这个组件过于简单 就自己整了一个 一、预览 二、代码 组件&#xff1a; <template><div :style"{ visibility: visibility }&qu…

AI 模型本地推理 - YYPOLOE - Python - Windows - GPU - 吸烟检测(目标检测)- 有配套资源直接上手实现

Python 运行 - GPU 推理 - windows 环境准备python 代码 环境准备 FastDeploy预编译库下载 conda config --add channels conda-forge && conda install cudatoolkit11.2 cudnn8.2 pip install fastdeploy_gpu_python-0.0.0-cp38-cp38-win_amd64.whlpython 代码 impo…

虚拟机的状态更新

文章目录 虚拟机的更新一、检查虚拟机的配置1.已连接状态2. 保证镜像源挂载 二、进行更新三、其余事项 虚拟机的更新 虚拟机的更新是确保系统软件包和库的更新&#xff0c;以获得最新的修复和改进&#xff1b;如果长期没有打开单机或者集群&#xff0c;可以考虑先进行一次更新…

Artix7系列FPGA实现SDI视频编解码,基于GTP高速接口,提供3套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案在Xilinx--Kintex系列FPGA上的应用本方案在Xilinx--Zynq系列FPGA上的应用 3、详细设计方案设计原理框图SDI 输入设备Gv8601a 均衡器GTP 高速接口-->解串与串化SMPTE SD/HD/3G SDI IP核BT1120转…

Docker容器下安装Matlab,无需挂载

Matlab的安装需要这些文件 传入ubuntu后&#xff0c;改过相关的文件权限后&#xff0c;发现还是无法挂载 这有可能是docker的安全管理策略导致容器不能挂载&#xff0c;因此采用不挂载形式&#xff0c;直接解压的方式安装Matlab 1.将iso改成zip&#xff0c;并解压 2.解压rar文件…

电机泵盖机器人打磨去毛刺,选德国进口高精度主轴

机器人打磨去毛刺该如何选择主轴呢&#xff1f;首先我们需要考虑的是工件的材质&#xff0c;电机泵盖通常使用铸铁、不锈钢、合金钢等金属材质&#xff0c;因此这类保持的硬度较高&#xff0c;一般会选择功率、扭矩较大的德国进口高精度主轴Kasite 4060 ER-S。 Kasite 4060 ER-…

设计分享—国外网站设计赏析

今天还是给大家分享一些国外的网站设计案例&#xff5e; 蓝蓝设计是一家专注而深入的界面设计公司&#xff0c;为期望卓越的国内外企业提供卓越的大数据可视化界面设计、B端界面设计、桌面端界面设计、APP界面设计、图标定制、用户体验设计、交互设计、UI咨询、高端网站设计、平…

JVM和类加载机制-01[JVM底层架构和JVM调优]

JVM底层 Java虚拟机内存模型JVM组成部分五大内存区域各自的作用虚拟机栈(线程栈)栈帧内存区域 本地方法栈程序计数器为什么jvm要设计程序计数器&#xff1f; 堆方法区 JVM优化-堆详解JVM底层垃圾回收机制jvm调优工具jvisualvm.exeArthas工具使用 Java虚拟机内存模型 JVM跨平台原…