1.概念

队列 : 只允许在一段进行插入数据操操作 , 在另一端进行删除数据操作的特殊线性表 ; 队列先进先出

入队列 : 进行插入操作的一端称为队尾

出队列 : 进行删除操作的一端称为对头

2.队列的使用

在Java中 , Queue 是一个接口 , 底层通过链表实现的

方法

行为

说明

add(E e)

添加元素到队尾(若队列已满,抛出 IllegalStateException

推荐使用 offer()

offer(E e)

添加元素到队尾(队列满时返回 false

更安全的插入方式

remove()

移除并返回队头元素(队列空时抛出NoSuchElementException

推荐使用 poll()

poll()

移除并返回队头元素(队列空时返回 null

安全的移除方式

element()

查看队头元素(不删除,队列空时抛出异常)

推荐使用 peek()

peek()

查看队头元素(不删除,队列空时返回 null

安全的查看方式

public static void main(String[] args) {Queue<Integer> queue = new LinkedList<>();queue.offer(11);//添加元素到队尾queue.offer(12);queue.offer(13);queue.offer(14);queue.offer(15);System.out.println(queue);//打印队列  [11, 12, 13, 14, 15]int a1 = queue.poll();//移除头元素,并返回System.out.println(a1);//11System.out.println(queue);//[12, 13, 14, 15]int a2 = queue.peek();//获取队头元素System.out.println(a2);//12
}

3.队列的模拟实现

①实现队列

public class MyQueue {public static class ListNode{public int val;public ListNode prev;public ListNode next;public ListNode(int val){this.val = val;}}public int usedSize = 0;public ListNode head = null;public ListNode last = null;public boolean isEmpty(){//检查是否为空return usedSize == 0;//如果是空的 , usedSize为0 返回true}public void offer(int val){//入队列,采用的是尾插法ListNode node = new ListNode(val);if(isEmpty()){head = last =  node;//把node节点赋值给head和lastusedSize++;}else {last.next = node;node.prev = last;last = node;usedSize++;}}public int poll(){//相应的出队列应该采用,头删法if(isEmpty()) {return -1;}int vall = head.val;head = head.next;if(head != null){head.prev = null;}usedSize--;return vall;}public int size(){//返回大小return usedSize;}}

②测试

public static void main(String[] args) {MyQueue myQueue = new MyQueue();myQueue.offer(11);//添加元素到队尾myQueue.offer(12);myQueue.offer(13);myQueue.offer(14);myQueue.offer(15);System.out.println(myQueue.poll());
}

4.循环队列

  • 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”
  • 循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间
  • 但是使用循环队列,我们能使用这些空间去存储新的值

方法名

描述

参数

返回值

特殊说明

MyCircularQueue(k)

构造器,初始化队列,设置队列容量为 k

int k(队列容量)

内部实际使用 k+1 的空间来区分空满状态

Front()

获取队首元素

int(队首元素值)

队列为空时返回 - 1

Rear()

获取队尾元素

int(队尾元素值)

队列为空时返回 - 1

enQueue(value)

向队列插入元素

int value(待插入元素)

boolean(插入成功返回 true,队列满则返回 false)

插入后队尾指针循环后移

deQueue()

从队列删除队首元素

boolean(删除成功返回 true,队列为空则返回 false)

删除后队首指针循环后移

isEmpty()

检查队列是否为空

boolean(为空返回 true,否则返回 false)

当 front == rear 时队列空

isFull()

检查队列是否已满

boolean(已满返回 true,否则返回 false)

当 (rear+1) % 容量 == front 时队列满

class MyCircularQueue {public int front;public int rear;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是一个接口, 使用时 必须创建LinkedList对象

Deque的接口比较多 , 栈和队列均可以实现该接口

public static void main(String[] args) {Deque<Integer> stack = new LinkedList<>();//双端队列的链式实现Deque<Integer> queue = new ArrayDeque<>();//双端队列的线性实现
}

6.用队列实现栈

  1. 模拟的入栈操作 : 将元素放到不为空的队列中
  2. 模拟的出栈操作 : 把不为空的队列中的size-1个元素放到另一个队列中 ; 最后剩下的就是模拟栈中的顶层元素
import java.util.LinkedList;
import java.util.Queue;class MyStackUseQueue {public Queue<Integer> qu1;public Queue<Integer> qu2;public MyStackUseQueue() {qu1 = new LinkedList<>();qu2 = new LinkedList<>();}public void push(int x) {if(!qu1.isEmpty()) {qu1.offer(x);}else if(!qu2.isEmpty()) {qu2.offer(x);}else {qu1.offer(x);}}public int pop() {if(empty()) {return -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();}}public int top() {if(empty()) {return -1;}if(!qu1.isEmpty()) {int size = qu1.size();int val = 0;for(int i = 0;i < size;i++) {val = qu1.poll();qu2.offer(val);}return val;}else  {int size = qu2.size();int val = 0;for(int i = 0;i < size;i++) {val = qu2.poll();qu1.offer(val);}return val;}}public boolean empty() {return qu1.isEmpty() && qu2.isEmpty();}
}

7.用栈实现队列

  1. 模拟入队操作 : 放到第一个栈中
  2. 模拟出队操作 : 判断第二个栈是否为空 ?

如果为空 : 需要把第一个栈中的所有元素都放到第二个栈里 , 取出第二个栈中的顶层元素

如果不为空 : 直接取出第二个栈中的顶层元素

import java.util.ArrayDeque;class MyQueueUseStack {public ArrayDeque<Integer> stack1;public ArrayDeque<Integer> stack2;public MyQueueUseStack() {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.pswp.cn/news/923721.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/923721.shtml
英文地址,请注明出处:http://en.pswp.cn/news/923721.shtml

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

相关文章

从原始数据到高效模型:基础特征工程的系统指南

基础特征工程全解析&#xff1a;从原始数据到模型提效的关键步骤 在机器学习项目中&#xff0c;有一句被反复提及的话&#xff1a;“数据和特征决定了机器学习的上限&#xff0c;而模型和算法只是逼近这个上限。” 这句话的核心就是在强调 特征工程&#xff08;Feature Enginee…

4-1〔O҉S҉C҉P҉ ◈ 研记〕❘ WEB应用攻击▸目录遍历漏洞-A

郑重声明&#xff1a; 本文所有安全知识与技术&#xff0c;仅用于探讨、研究及学习&#xff0c;严禁用于违反国家法律法规的非法活动。对于因不当使用相关内容造成的任何损失或法律责任&#xff0c;本人不承担任何责任。 如需转载&#xff0c;请注明出处且不得用于商业盈利。 …

【Linux】归档、压缩、用户管理

1.归档tar(tape archiving program)&#xff0c;最早是一个磁盘归档程序。tar命令用于文件的打包&#xff08;归档&#xff09;&#xff0c;可以将若干&#x1f608;文件或者目录&#x1f608;打包成一个文件&#xff0c;既利于文件管理&#xff0c;也方便压缩和文件的网络传输…

9.18 丑数|换根dp

lc854 偶数之间的奇数个数 差值/2 先都变成偶数 把整个范围包起来&#xff0c;反正偶数不做数class Solution {public int countOdds(int low, int high) {if(low % 2 1){--low;}if(high % 2 1){high;}return (high - low) / 2;} }lc17.10摩尔投票class Solution { public:i…

PHP通过命令行调用Ghostscript把pdf转换成图片集

1.使用命令行在服务器上安装Ghostscript&#xff0c;网上教程很多按步骤操作就行。2.使用php执行命令行。/*** 使用Ghostscript命令行转换PDF为图片** param string $pdfUrl PDF文件URL* param string $folderName 存储目录名 (默认值&#xff1a;wenjianming)** return ar…

Spring Boot `@Service` 互相调用全攻略:`@Autowired` vs `@Resource`

Spring Boot Service 互相调用全攻略&#xff1a;Autowired vs Resource 在日常写 Spring Boot 项目的时候&#xff0c;经常会遇到一个问题&#xff1a;多个 Service 之间需要互相调用&#xff0c;到底该怎么写才优雅&#xff1f;用 Autowired&#xff1f;用 Resource&#xf…

c过渡c++应知应会(2)

c过渡c应知应会&#xff08;2&#xff09;1.缺省参数2.函数重载3.引用4.inline1.缺省参数 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时&#xff0c;如果没有指定实参&#xff0c;则采用该形参的缺省值&#xff0c;否则使用指定的实参&#xff0c;缺…

SSH连接排故排查

文章目录SSH连接排故排查案例1&#xff1a;解决思路排故过程故障模拟SSH连接排故排查 案例1&#xff1a; 你是某在线教育公司的运维工程师&#xff0c;负责维护 3 台应用服务器。今日上午 9 点&#xff0c;开发团队反馈无法通过 SSH 连接 10.1.8.10 服务器部署代码。该服务器…

Python爬虫实战——使用NetNut网页解锁器获取亚马逊电商数据的入门指南

摘要在当今数字化时代&#xff0c;电商数据蕴含着巨大的商业价值。亚马逊作为全球知名的电商平台&#xff0c;其上的商品信息、用户评价等数据对于市场分析、竞品研究等具有重要意义。然而&#xff0c;由于反爬虫机制的存在&#xff0c;直接获取亚马逊电商数据并非易事。本文将…

汽车多核架构中内存系统故障检测的改进算法

摘要随着半导体行业向纳米级方向发展&#xff0c;多核架构已成为主流趋势。然而&#xff0c;这一趋势也使得多核处理器面临诸多挑战&#xff0c;在一定程度上限制了其性能发挥。目前&#xff0c;汽车行业中的混合安全关键型系统普遍采用多核处理器。为满足新兴自动驾驶等级的需…

VastBase数据库Crash后使用gdb收集coredump信息

VastBase数据库Crash后使用gdb收集coredump信息&#x1f418; 数据库版本&#xff1a;VastBase G100 V3.0.8检查数据库崩溃后生成的core文件&#xff1a; [vbdbadbhost vastbase]$ ll -h core* -rw------- 1 vbdba vbdba 62G Aug 20 20:02 core-vastbase-162199-2025_08_20_19_…

【LeetCode 每日一题】2749. 得到整数零需要执行的最少操作数

Problem: 2749. 得到整数零需要执行的最少操作数 文章目录整体思路完整代码时空复杂度时间复杂度&#xff1a;O(1)空间复杂度&#xff1a;O(1)整体思路 这段代码旨在解决一个具有数学和位运算性质的问题&#xff1a;给定两个整数 num1 和 num2&#xff0c;找到最小的正整数 k&…

安卓开发工程师中高级知识点 —— 系统底层安全方向

一、AIDL 通信 Android Interface Definition Language 基于 Binder 实现跨进程通信&#xff08;IPC&#xff09;&#xff0c;核心是通过定义接口生成代理类&#xff0c;屏蔽底层 Binder 通信细节 适用于跨进程服务调用&#xff08;如系统服务、多App协作&#xff09;。常见于后…

动环监控系统-机房高效运维

动环监控系统&#xff08;全称为动力环境监控系统&#xff09;是机房高效运维的核心工具&#xff0c;通过集成动力、环境、安防、IT设备等模块&#xff0c;结合智能告警、AI分析、3D可视化等技术&#xff0c;实现机房的全方位监控与管理。动力系统监控供电设备&#xff1a;实时…

知微传感Dkam系列3D相机SDK例程篇:CSharp设置相机工作模式

设置3D相机触发模式 写在前面 本人从事机器视觉细分的3D相机行业。编写此系列文章主要目的有&#xff1a; 1、便利他人应用3D相机&#xff0c;本系列文章包含公司所出售相机的SDK的使用例程及详细注释&#xff1b;2、促进行业发展及交流。设置触发模式及API说明 触发模式说明 知…

PHP 常用函数及用法

文章目录PHP 常用函数及用法一、字符串处理函数1. 字符串基础操作2. 字符串查找与替换3. 字符串分割与连接4. 字符串大小写转换5. 字符串格式化二、数组操作函数1. 数组基础操作2. 数组遍历与查找3. 数组修改与排序4. 数组过滤与合并三、文件操作函数1. 文件读写2. 文件和目录信…

yum命令--obsoletes与--allowerasing两者的区别

在 YUM&#xff08;Yellowdog Updater Modified&#xff09;包管理工具中&#xff0c;–obsoletes 和 --allowerasing 是两个与包升级 / 安装相关的选项&#xff0c;它们的功能和使用场景有明显区别&#xff1a; 1. --obsoletes&#xff08;默认启用&#xff09;作用&#xff1…

Day24_【深度学习(3)—PyTorch使用(1)—张量的创建和类型转换】

一、创建张量1.张量基本创建方式torch.tensor 根据指定数据创建张量 &#xff08;最重要&#xff09;torch.Tensor 根据形状创建张量, 其也可用来创建指定数据的张量torch.IntTensor、torch.FloatTensor、torch.DoubleTensor 创建指定类型的张量1.1 torch.tensor# 方式一&…

阿里云图像编辑大模型开发部署

与阿里云一起轻松实现数智化让算力成为公共服务&#xff1a;用大规模的通用计算&#xff0c;帮助客户做从前不能做的事情&#xff0c;做从前做不到的规模。让数据成为生产资料&#xff1a;用数据的实时在线&#xff0c;帮助客户以数据为中心改变生产生活方式创造新的价值。图像…

查看磁盘分区并新建一个分区,挂载分区

linux系统磁盘df -h查看文件系统的磁盘的空间占用情况&#xff0c;常用于快速检查磁盘使用率&#xff1a;df -h-h是说把磁盘空间以G位单位&#xff0c;如果直接用df也是可以的&#xff0c;只不过单位是块&#xff0c;看的不明显du -sh /home/查看/home目录下总共占用了多大的空…