Java数据结构队列

队列(Queue)
 

概念

队列的使用

注意:Queue是个接口,在实例化时必须实例化LinkedList的对象,因为LinkedList实现了Queue接口。

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

队列的模拟实现

队列中既然可以存储元素,那底层肯定要有能够保存元素的空间,通过前面线性表的学习了解到常见的空间类型有两种:顺序结构(数组) 和 链式结构

队列的实现使用顺序结构还是链式结构好?

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;node.prev = last;last = last.next;}}//头删public int poll() {if (head == null) {return -1;}int ret = head.val;if (head.next == null) {head = null;last = null;} else {head = head.next;head.prev = null;}return ret;}public int peek() {if (head == null) {return -1;}int ret = head.val;return ret;}
}

循环队列

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

如何区分空与满

1. 通过添加 size 属性记录

空:size=0    满:us=数组长度

2. 保留一个位置(浪费一个空间)(下面的设计循环队列用的就是此方法)

相遇就是空 满:last的下一个是first
3. 使用标记

Boolean flag

数组下标循环的小技巧

1. 下标最后再往后(offset 小于 array.length): index = (index + offset) % array.length

 

2. 下标最前再往前(offset 小于 array.length): index = (index + array.length - offset) % array.length

设计循环队列

class MyCircularQueue {public int[] elem;public int first;public int last;public MyCircularQueue(int k) {elem = new int[k];}public boolean enQueue(int value) {if (isFull()) {return false;}elem[last] = value;last = (last + 1) % elem.length;return true;}public boolean deQueue() {if (isEmpty()) {return false;}first = (first + 1) % elem.length;return true;}//得到队头元素public int Front() {if (isEmpty()) {return -1;}return elem[first];}//得到队尾元素public int Rear() {if (isEmpty()) {return -1;}int index = (last == 0) ? elem.length - 1 : last - 1;return elem[index];}public boolean isEmpty() {return first == last;}public boolean isFull() {return (last + 1) % elem.length == first;}
}/*** Your MyCircularQueue object will be instantiated and called as such:* MyCircularQueue obj = new MyCircularQueue(k);* boolean param_1 = obj.enQueue(value);* boolean param_2 = obj.deQueue();* int param_3 = obj.Front();* int param_4 = obj.Rear();* boolean param_5 = obj.isEmpty();* boolean param_6 = obj.isFull();*/

将elem = new int[k];改为elem = new int[k+1];即可

双端队列

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

Deque是一个接口,使用时必须创建LinkedList的对象。

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

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

面试题

1.用队列实现栈

import java.util.LinkedList;
import java.util.Queue;class MyStack {public Queue<Integer> queue1;public Queue<Integer> queue2;public MyStack() {queue1 = new LinkedList<>();queue2 = new LinkedList<>();}public void push(int x) {if (empty()) {queue1.offer(x);return;}if (!queue1.isEmpty()) {queue1.offer(x);} else {queue2.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 ret = -1;for (int i = 0; i < size; i++) {ret = queue1.poll();queue2.offer(ret);}return ret;} else {int size = queue2.size();int ret = -1;for (int i = 0; i < size; i++) {ret = queue2.poll();queue1.offer(ret);}return ret;}}public boolean empty() {return queue1.isEmpty() && queue2.isEmpty();}
}/*** Your MyStack object will be instantiated and called as such:* MyStack obj = new MyStack();* obj.push(x);* int param_2 = obj.pop();* int param_3 = obj.top();* boolean param_4 = obj.empty();*/

2.用栈实现队列

import java.util.Stack;class MyQueue {public Stack<Integer> s1;public Stack<Integer> s2;public MyQueue() {s1 = new Stack<>();s2 = new Stack<>();}public void push(int x) {s1.push(x);}public int pop() {// 两个栈都是空 意味着 队列为空if (empty()) {return -1;}if (s2.empty()) {while (!s1.empty()) {s2.push(s1.pop());}}return s2.pop();}public int peek() {if (empty()) {return -1;}if (s2.empty()) {while (!s1.empty()) {s2.push(s1.pop());}}return s2.peek();}// 判断模拟实现的队列是否为空public boolean empty() {return s1.empty() && s2.empty();}
}/*** Your MyQueue object will be instantiated and called as such:* MyQueue obj = new MyQueue();* obj.push(x);* int param_2 = obj.pop();* int param_3 = obj.peek();* boolean param_4 = obj.empty();*/

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

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

相关文章

【事务注解✈️✈️】@Transactional注解在不同参数配置下的功能实现

目录 前言 使用场景 1.单个方法层面 2.类级别使用 3.指定异常回滚 4.跨方法调用事务管理 5.只读事务 ​ 6.设置超时时间&#xff0c;超时则自动回滚 7.隔离级别设置 章末 前言 小伙伴们大家好&#xff0c;ACID&#xff08;原子性&#xff0c;一致性&#xff0c;隔离…

用递归方法求n!(n的值最好小于13,int型数据分配4个字节,能表示的最大数为2147483647)

#include <stdio.h> // 主函数&#xff1a;计算并输出给定整数的阶乘 int main(){ // 声明阶乘函数 int fac(int n); int n, y; // 输入一个整型数字 printf("请输入一个整型数字:"); scanf("%d", &n); …

网络安全 | 什么是单点登录SSO?

关注WX&#xff1a;CodingTechWork SSO-概念 单点登录 (SSO) 是一种身份认证方法&#xff0c;用户一次可通过一组登录凭证登入会话&#xff0c;在该次会话期间无需再次登录&#xff0c;即可安全访问多个相关的应用和服务。SSO 通常用于管理一些环境中的身份验证&#xff0c;包…

Arcade 作用力

这个程序展示了简单的变换反馈的应用。变换反馈类似于渲染&#xff0c;但是输出的是一个缓冲区而不是帧缓冲区/屏幕。 这个例子展示了一个常见的ping-pong技术&#xff0c;即在两个缓冲区之间对具有位置和速度的点进行变换&#xff0c;这样我们就始终在前一状态上工作。 初始…

c++算法学习笔记 (21) STL

1.vector: 变长数组&#xff0c;倍增的思想 size()返回元素个数 empty()返回是否为空 clear()清空 front()/back()元素 push_back()/pop_back() begin()/end()迭代器 [] 支持比较运算 2.pair<int,int>: first:第一个元素 second:第二个元素 支持比较运算&#xff0c;先比…

基于Python近红外光谱分析与机器学、深度学习方法融合技术应用

郁磊副教授&#xff0c;主要从事MATLAB 编程、机器学习与数据挖掘、数据可视化和软件开发、人工智能近红外光谱分析、生物医学系统建模与仿真&#xff0c;具有丰富的实战应用经验&#xff0c;主编《MATLAB智能算法30个案例分析》、《MATLAB神经网络43个案例分析》相关著作。已发…

基于Spark中随机森林模型的天气预测系统

基于Spark中随机森林模型的天气预测系统 在这篇文章中&#xff0c;我们将探讨如何使用Apache Spark和随机森林算法来构建一个天气预测系统。该系统将利用历史天气数据&#xff0c;通过机器学习模型预测未来的天气情况&#xff0c;特别是针对是否下雨的二元分类问题。 简介 Ap…

【游戏分析】逆向数组结构分析

追背包数组 用物品数量当突破口 首先CE扫描目标地址 很简单 找到目标地址 对物品数量地址下写入断&#xff0c;然后吃药 OD中追踪其来源 来源 ecx14 根据堆栈情况 判断此处不是函数头部 但是上面就是retn 那么只能是其他位置跳转而来 在上面发现了跳转来的代码 获得便宜…

github本地仓库push到远程仓库

1.从远程仓库clone到本地 2.生成SSH秘钥&#xff0c;为push做准备 在Ubuntu命令行输入一下内容 [rootlocalhost ~]# ssh-keygen -t rsa < 建立密钥对&#xff0c;-t代表类型&#xff0c;有RSA和DSA两种 Generating public/private rsa key pair. Enter file in whi…

ES6的new Set()方法有什么用法

Set 是什么&#xff1f; Set是es6新增的数据结构&#xff0c;类似于数组&#xff0c;但它的一大特性就是所有元素都是唯一的&#xff0c;没有重复的值&#xff0c;我们一般称为集合。Set本身是一个构造函数&#xff0c;用来生成 Set 数据结构。Set函数可以接受一个数组作为参数…

数字化赋能乡村:开启乡村发展新纪元

随着信息技术的迅猛发展和数字化浪潮的席卷&#xff0c;乡村发展正迎来前所未有的机遇与挑战。数字化赋能乡村&#xff0c;不仅是推动农业现代化、提升农村治理水平的必由之路&#xff0c;更是开启乡村发展新纪元的关键所在。本文将围绕数字化赋能乡村这一主题&#xff0c;探讨…

好物视频素材哪里找?8个视频素材库免费网址大全

在这个数字化的时代&#xff0c;高清视频已经成为了一种强大的沟通工具&#xff0c;无论是个人分享、教育培训还是商业广告&#xff0c;高质量的视频内容都能够有效地吸引观众的注意力。为了帮助你轻松找到理想的无水印视频素材&#xff0c;下面我为你精心挑选了一系列全球视频…

可以写进简历的软件测试电商项目,不进来get一下?

前言 说实话&#xff0c;在找项目的过程中&#xff0c;我下载过&#xff08;甚至付费下载过&#xff09;N多个项目、联系过很多项目的作者&#xff0c;但是绝大部分项目&#xff0c;在我看来&#xff0c;并不适合你拿来练习&#xff0c;它们或多或少都存在着“问题”&#xff…

[挖坟]如何安装Shizuku和LSPatch并安装模块(不需要Root,非Magisk)

2023年12月13日&#xff0c;LSPatch 停止维护 2024年1月8日&#xff0c;LSPosed 停止维护 2024年1月8日&#xff0c;ZygiskNext 停止维护 2024年1月9日&#xff0c;KernelSU 停止维护 这里使用 ColorOS 14 演示&#xff0c;其他品牌手机类似 安装 Shizuku 官网: https://shiz…

网络安全 | 什么是攻击面管理?

关注WX: CodingTechWork 介绍 攻击面管理 (Attack Suface Management, ASM) 可以持续发现、分析、修复和监控构成组织攻击面的网络安全漏洞和潜在攻击媒介。ASM可以识别目标&#xff0c;并根据其暴露给恶意攻击者的可能性来评估风险&#xff0c;获得攻击者的视角&#xff0c;…

【模糊逻辑】Type-1 Fuzzy Systems的设计方法和应用-1

【模糊逻辑】Type-1 Fuzzy Systems的设计方法和应用 4.1 时间序列预测4.2 提取规则的方法4.2.1 One-pass method&#xff08;一次性方法&#xff09;4.2.1.1数据赋值法例子1 4.2.1.1 WM方法 4.2.2 最小二乘法4.2.3 基于导数的方法4.2.4 SVD-QR方法4.2.6 迭代法 4.1 时间序列预测…

Oracle的物理结构解析

这些图是我自己画的&#xff0c;我也会在我的公众号【会用数据库】解析。理解起来非常简单&#xff0c;而且非常好记。不用死记硬背&#xff0c;有兴趣可以来公众号看呀。

matrix-breakout-2-morpheus

信息收集&#xff1a; 1.nmap存活探测&#xff1a; nmap -sn -r 192.168.10.1/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-06 12:13 CST Nmap scan report for 192.168.10.1 Host is up (0.00056s latency). MAC Address: 00:50:56:C0:00:08 (VMware) Nmap…

TDengine 使用爬坑

TDengine 安装 爬坑 使用安装包立即开始 | TDengine 文档 | 涛思数据 (taosdata.com) linux 服务端版本 TDengine-server-3.2.3.0-Linux-x64.rpm (61.2 M) taosTools-2.5.2-Linux-x64-comp3.rpm (0.2 M) windows 客户端版本 TDengine-client-3.2.3.0-Windows-x64.exe (9.…

高级排序算法-快速排序

高级排序算法-快速排序 这个方法的代码参考leecode平台的大佬——liweiwei1419的文章&#xff0c;原文出处&#xff1a;https://leetcode.cn/leetbook/read/learning-algorithms-with-leetcode/55szu2/ 本文语言用的是C&#xff1a; 快速排序实现一&#xff08;大放过&#…