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://xiahunao.cn/news/3250630.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

django中日志模块logging的配置和使用

一、文件的配置 settings.py文件中添加LOGGING块的配置&#xff0c;配置如下 # 日志记录 LOGGING {"version": 1,"disable_existing_loggers": False, # 用于确定在应用新的日志配置时是否禁用之前配置的日志器# 格式器"formatters": {"v…

自动化测试中如何应对网页弹窗的挑战!

在自动化测试中&#xff0c;网页弹窗的出现常常成为测试流程中的一个难点。无论是警告框、确认框、提示框&#xff0c;还是更复杂的模态对话框&#xff0c;都可能中断测试脚本的正常执行&#xff0c;导致测试结果的不确定性。本文将探讨几种有效的方法来应对网页弹窗的挑战&…

Android 视频亮度图标

源码 import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.view.View;import androidx.annotation.Nullable;public class VideoBrightness …

优雅的软件工程师

今天写算法的时候、通过两道题深深意识到了&#xff0c;什么是优雅的代码&#xff08;应该说不按套路出牌的代码&#xff09; 我被折服了 第一个就是141. 环形链表 - 力扣&#xff08;LeetCode&#xff09; 判断换环状链表 我的思路就是用快慢指针判断&#xff0c;非常平平无…

SAP MR21 和 MR22 区别

MR21和MR22用来调整库存金额的话&#xff0c;两者之间有什么区别呢 一个是直接修改金额 一个是在原来的基础上进行加减。 MR21改的是单个物料的价格。 MR22改的是库存总价值。 MR**是不能改标准价格的&#xff0c;即使改了也到PRD去了&#xff0c;只能改移动平均价 MR21 : 商品…

HTTP协议、Wireshark抓包工具、json解析、天气爬虫

HTTP超文本传输协议 HTTP&#xff08;Hyper Text Transfer Protocol&#xff09;&#xff1a; 全称超文本传输协议&#xff0c;是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。 HTTP 协议的重要特点&#xff1a; 一发一收…

简过网:备考25年国考的朋友,你的时间规划做好了吗?

备考25年国考的朋友&#xff0c;你的时间规划做好了吗&#xff1f; 根据以往考试时间&#xff0c;我们先预测一下25年的国考时间&#xff1a; 国考报名&#xff1a;24年10月中旬 国考笔试&#xff1a;24年11月底 省考报名&#xff1a;25年1-2月 省考笔试&#xff1a;25年3…

AnalyticsCloud 分析云 任意文件读取漏洞复现

0x01 产品简介 AnalyticsCloud 分析云集成了先进的数据分析技术和工具&#xff0c;能够处理来自各种数据源的数据&#xff0c;包括云数据、本地数据、传统数据和大数据等。它提供了从数据收集、整理、分析到应用的全链路解决方案&#xff0c;帮助企业更好地理解和利用数据&…

处理.git文件夹过大出现臃肿问题

1、问题背景 在软件开发过程中&#xff0c;版本控制是一个至关重要的环节。Git 作为一种流行的分布式版本控制系统&#xff0c;被广泛应用于各种项目中。然而&#xff0c;近期我们发现在进行项目发版时&#xff0c;Git 克隆项目的时间显著增加&#xff0c;严重影响了发版的效率…

深入理解Java并发编程:从synchronized到Lock的演进

目录 引言 一、synchronized关键字基础 二、Lock接口及其实现 三、ReentrantLock实战 1. 原子类&#xff08;Atomic Classes&#xff09; 2. 并发集合&#xff08;Concurrent Collections&#xff09; 3. 线程池&#xff08;ThreadPool&#xff09; 4. 并发工具类&…

四川赤橙宏海商务信息咨询有限公司真实可靠吗?

在当今数字化浪潮中&#xff0c;电商行业正以前所未有的速度蓬勃发展&#xff0c;而抖音作为短视频领域的佼佼者&#xff0c;其电商服务更是异军突起&#xff0c;成为众多商家争相入驻的新蓝海。四川赤橙宏海商务信息咨询有限公司&#xff0c;正是这一领域的佼佼者&#xff0c;…

【Git标签管理】理解标签 | 创建标签 | 查看标签 | 删除标签 | 推送标签

目录 1.理解标签 2.创建标签 3.查看标签 4.删除本地仓库的标签 5.推送标签 6.删除远程仓库的标签 1.理解标签 Git提供一个打标签的功能tag&#xff0c;对某一次事务/提交的表示&#xff08;作用/意义&#xff09;。标签 tag &#xff0c;可以简单的理解为是对某次 comm…

Python调用搜索引擎Meilisearch

文章目录 简介安装初试参考文献 简介 Meilisearch 是一个 Rust 语言编写的开源搜索引擎&#xff0c;用于快速构建全文搜索。2018 年发布&#xff0c;支持中文。 特点&#xff1a; 速度至上&#xff1a;50 毫秒返回结果。相关性优先&#xff1a;最相关的结果排在前面开发者友好…

request.getParameter()与request.getAttribute()的区别

request.getParameter&#xff08;&#xff09;与request.getAttribute&#xff08;&#xff09;的区别 1、数据来源2、使用范围3、数据类型4、使用场景 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、数据来源 getParameter()&#xf…

C#数字医学影像系统(RIS/PACS)源码,Oracle数据库,C/S架构,运行稳定

数字医学影像系统&#xff08;RIS/PACS&#xff09;源码&#xff0c;三甲以下的医院都能满足。PACS 系统全套成品源码。 开发技术&#xff1a;C/S架构&#xff0c;C#开发语言&#xff0c;数据库服务器采用Oracle数据库。 医学影像存储与传输系统&#xff0c;融合了医学信息化…

独立站外链如何影响搜索引擎排名?

独立站的外链对搜索引擎排名有着非常重要的影响。简单来说&#xff0c;外链就像是别的网站对你的网站投的信任票。每一条外链都告诉搜索引擎&#xff1a;“这个网站的内容是有价值的&#xff0c;值得推荐。”因此&#xff0c;外链的数量和质量直接影响你的网站在搜索引擎中的排…

力扣3202:找出有效子序列的最大长度||

class Solution { public:int maximumLength(vector<int>& nums, int k) {int res0;for(int m0;m<k;m){//假设子序列两数%k之后的结果为m 相当于枚举vector<int> v(k,0);for(auto num:nums){v[num%k]v[(m-num%kk)%k]1; //知道m之后可以知道需要的子序列当前…

换了那么多台电脑,这四款高质量软件,从不离身,装机必备

Windows 10退休&#xff0c;Windows 11接棒上阵。 不过&#xff0c;不管Windows系统怎么更新&#xff0c;换多少次电脑或重装系统&#xff0c;这些软件小编总是会第一时间下载回来。 sunlight studio 这款软件堪称DIY爱好者的福音&#xff0c;它将市面上众多出色的硬件工具集…

【echarts】存在左右Y轴,多个图例切换时,图宽度会缩短(没有右轴,图宽度正常。 高亮右轴,图宽度会变窄。)- 已解决

问题描述&#xff1a; 在绘制图表时&#xff0c;左侧 Y 轴有一条曲线&#xff0c;右侧 Y 轴有三条曲线。初始化时发现&#xff0c;图表的宽度变窄了&#xff0c;这在 PC 端不太明显&#xff0c;但在移动端特别明显。 没有右轴&#xff0c;图宽度正常。 高亮右轴&#xff0c;图…

安全防御2

实验要求&#xff1a; 实验过程&#xff1a; 7&#xff0c;办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换)&#xff1a; 新建电信区&#xff1a; 新建移动区&#xff1a; 将对应接口划归到各自区域&#xff1a; 新建…