数据结构——队列(Java)

一.基本概念

队列用来存储逻辑关系为“一对一”的数据,是一种“特殊”的线性存储结构。

特点:

•先进先出:队列中元素的添加(入队enqueue)和移除(出队dequeue)遵循先进先出的原
则。
•端点:队列有两个主要的端点——队头(front)和队尾(rear)。队头是队列中最先入队
的元素所在的位置,而队尾则是最后入队的元素所在的位置。

强调:队列不要混淆,栈是一端开口、另一端封口,元素入栈和出栈遵循“先进后出”原则;队列是两端都开口,但元素只能从一端进,从另一端出,且进出队列遵循“先进先出”的原则。

        实现方法:

        1.顺序表实现

        2.链表实现

以链表的方式为例子

二.链表实现队列

        队列的API设计

队列初始化

       

class Queue <T>
{//结点类class Node{public T data;//存储数据public Node next;//下一个结点public Node(T data , Node next){this.data = data;this.next = next;}}//创建首结点private Node head;//尾结点private Node last;//队列个数private int N;public Queue(){this.head =new Node(null,null);this.last =null;this.N =0;}

判断队列是否为空

思路分析:用布尔类型,直接返回数量

 //判断队列是否为空public boolean isEmpty(){return N == 0;}

获取队列个数

思路分析:直接返回数量

//返回队列元素个数public int size(){return N;}

插入元素

思路分析:

1.如果队列为空,将头结点指向新结点

2.创建变量1代替原先尾结点的数据

3.创建一个变量2当尾结点

4.将变量1的next引用指向变量2的值

 //插入元素public void enqueue(T data){//保存当前的尾结点Node oldLast = last;//创建新结点为新的尾结点last = new Node(data, null);//判断队列是否为空if(isEmpty()){head.next = last;}else{//将原先尾结点的next指向新结点oldLast.next = last;}N++;}

元素取出

思路分析:根据先进先出原则,我们需要更新头结点的next所指向的值

 //从队列拿出一个元素public T dequeue(){//为空,返回nullif(isEmpty()){return null;}//保存当前首结点Node oldFirst = head.next;//将首结点更新到下一个结点head.next = oldFirst.next;N--;//如果队列被删除完了,重置Last为nullif(isEmpty()){last = null;}return oldFirst.data;//返回取出元素}

三.用栈来实现队列

思路分析:

栈是后进先出(LIFO)的数据结构,队列是先进先出(FIFO)的数据结构。我们可以使用两个栈,一个用于入队操作(记为 inStack ),一个用于出队等操作(记为 outStack )。 

当执行 push 操作时,直接将元素压入 inStack 。因为 inStack 只负责接收新元素,就像队列的尾部接收新元素一样。 

当执行 pop 和 peek 操作时,需要先判断 outStack 是否为空。如果 outStack 为空,就将 inStack 中的所有元素依次弹出并压入 outStack ,此时 outStack 栈顶元素就是队列的开头元素(因为 inStack 中先进入的元素会在转移到 outStack 后处于栈顶)。然后再执行相应的 pop 或 peek 操作。 

执行 empty 操作时,只需判断 inStack 和 outStack 是否都为空。  

完整代码

import java.util.Stack;class MyQueue {private Stack<Integer> inStack; // 用于入队操作的栈private Stack<Integer> outStack; // 用于出队等操作的栈public MyQueue() {inStack = new Stack<>(); // 初始化入队栈outStack = new Stack<>(); // 初始化出队栈}public void push(int x) {inStack.push(x); // 将元素x压入入队栈,模拟队列的入队操作}public int pop() {if (outStack.isEmpty()) { // 如果出队栈为空while (!inStack.isEmpty()) { // 当入队栈不为空时outStack.push(inStack.pop()); // 将入队栈的元素依次弹出并压入出队栈}}return outStack.pop(); // 弹出并返回出队栈的栈顶元素,即队列开头的元素}public int peek() {if (outStack.isEmpty()) { // 如果出队栈为空while (!inStack.isEmpty()) { // 当入队栈不为空时outStack.push(inStack.pop()); // 将入队栈的元素依次弹出并压入出队栈}}return outStack.peek(); // 返回出队栈的栈顶元素,即队列开头的元素(不弹出)}public boolean empty() {return inStack.isEmpty() && outStack.isEmpty(); // 判断入队栈和出队栈是否都为空,都为空则队列空}
}
public class StudentMS4
{public static void main(String[] args){MyQueue myQueue = new MyQueue();//调用pushmyQueue.push(1);myQueue.push(2);//调用peekSystem.out.println("队列开头的元素是:"+myQueue.peek());//调用popSystem.out.println("移除并返回队列开头的元素:"+myQueue.pop());//调用empty方法System.out.println("队列是否为空:"+myQueue.empty());}
}

目录

一.基本概念

特点:

        实现方法:

二.链表实现队列

        队列的API设计

队列初始化

判断队列是否为空

获取队列个数

插入元素

元素取出

三.用栈来实现队列

思路分析:

完整代码


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

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

相关文章

【Go】:mac 环境下GoFrame安装开发工具 gf-cli——gf_darwin_arm64

当前主要是关于gf_darwin_arm64的安装步骤 如何快速给mac电脑安装gfgf是什么安装步骤方法1&#xff1a;去github下载gf-cli去git上下载对应电脑版本的gf-cli验证下载文件是否二进制文件授予该文件权限方法2&#xff1a;去goframe官网教你下载步骤验证gf是否安装成功可能遇到的问…

【新】ApiHug官方文档-ApiHug Spring Security 扩展-补充说明

概述 在上次说明中我们写了ApiHug 如何做授权的&#xff0c; 这里有个概念的混淆&#xff0c; 其实 apihug 不是在spring security 上做的安全扩展&#xff0c; 应该是 apihug spring, 安全设计框架&#xff0c; 和本身 spring security 没有半毛钱关系&#xff0c; 而如果你…

【Flask】测试平台开发,新增说明书编写和展示功能 第二十三篇

概述&#xff1a;本篇是接着上一篇&#xff0c;细分出说明书的编写部分&#xff0c;实现这个功能的需求&#xff0c;是内部很多同事反馈&#xff0c;需要有个地方存工具&#xff0c;并且可以写说明书&#xff0c;如果需要的人&#xff0c;那么可以在界面上直接下载工具和查看工…

Mac设置中的安全性缺少“任何来源”

问题&#xff1a;用Mac安装软件&#xff0c;隐私性与安全性&#xff0c;想切换“任何来源”用来下载网站的app&#xff0c;但是菜单栏找不到“任何来源”选项&#xff0c;无法安装dmg的文件终端中一行代码设置出来&#xff1a;sudo spctl --global-disable &#xff08;禁用Mac…

uniapp开发小程序,列表 点击后加载更多数据

一、需求 1.初始显示限制:将每页条数limit改为5,确保初始只显示5条数据 2.查看更多功能:添加了loadMore方法,点击"查看更多"时加载下一页数据 3.实现查看更多功能,点击后加载更多数据 4.添加loading状态防止重复请求 添加hasMore状态判断是否还有更多数据 …

Windows 部署 Gerrit 与 Apache24 配置

Windows 部署 Gerrit 与 Apache24 并配置反向代理 准备工作 下载并安装 Java JDK 确保配置 JAVA_HOME 环境变量博主这里安装openjdk21 https://jdk.java.net/archive/下载所需软件 Apache24&#xff1a;https://httpd.apache.org/download.cgi Gerrit&#xff1a;https://www.g…

从 Excel 趋势线到机器学习:拆解 AI 背后的核心框架​

引言&#xff1a;你其实早就 “玩转” 过机器学习&#xff1f;提到 “机器学习”&#xff0c;你是不是第一时间联想到复杂的代码、密密麻麻的公式&#xff0c;还有那些让人头晕的 “算法”“模型”“训练” 术语&#xff1f;仿佛它是高高在上的技术&#xff0c;离我们的日常无比…

Lenovo联想YOGA Pro 16 IAH10 2025款笔记本电脑(83L0)开箱状态预装OEM原厂Win11系统

适用机型(MTM)&#xff1a;【83L0】 链接&#xff1a;https://pan.baidu.com/s/1tDpeBb93t1u0XIgqAZ3edg?pwdqy2r 提取码&#xff1a;qy2r 联想原装系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office办公软件、联想浏览器、电脑管家、…

Android 开发 - 一些画板第三方库(DrawBoard、FingerPaintView、PaletteLib)

一、DrawBoard 1、Dependencies 模块级 build.gradle implementation com.github.jenly1314:drawboard:1.1.02、Test &#xff08;1&#xff09;Activity Layout activity_draw_board.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout …

捷多邦揭秘超厚铜板:从制造工艺到设计关键环节​

一、超厚铜板制造工艺要点超厚铜板&#xff08;3oz 及以上&#xff09;的制造工艺对精度和稳定性要求严苛&#xff0c;核心环节需突破多重技术壁垒。蚀刻工艺中&#xff0c;因铜箔厚度达 105μm 以上&#xff0c;需采用高浓度酸性蚀刻液&#xff08;氯化铜浓度控制在 180-220g/…

【MYSQL | 高级篇 MyCat实现分库分表】

摘要&#xff1a;本文围绕分库分表展开&#xff0c;先分析单库性能瓶颈&#xff0c;介绍垂直与水平拆分策略及实现技术&#xff0c;再详述 MyCat 中间件的概述、环境准备、目录结构&#xff0c;讲解其入门配置与测试&#xff0c;深入说明核心配置文件&#xff0c;最后演示垂直和…

Docker部署Drawnix开源白板工具

Drawnix简介 Drawnix 是一款开源的在线白板工具&#xff08;SaaS&#xff09;&#xff0c;集思维导图、流程图绘制、自由画图等多种功能于一体&#xff0c;支持协作与插件扩展&#xff0c;适用于个人创作、团队协作和远程办公场景。它完全免费且开源&#xff0c;提供丰富的编辑…

Griffin|增强现实数据集|无人机数据集

Griffin|增强现实数据集|无人机数据集 数据来源&#xff1a;huggingface 百度网盘 构建方式 Griffin数据集的构建采用了模块化架构&#xff0c;结合了CARLA和AirSim平台&#xff0c;通过模拟真实世界中的无人驾驶环境和无人机动态&#xff0c;收集了超过30,000帧图像数据&am…

力扣.1054距离相等的条形码力扣767.重构字符串力扣47.全排列II力扣980.不同路径III力扣509.斐波那契数列(记忆化搜索)

目录 力扣.1054距离相等的条形码 力扣767.重构字符串 力扣47.全排列II 力扣980.不同路径III 力扣509.斐波那契数列&#xff08;记忆化搜索) 力扣.1054距离相等的条形码 是否策略正确 但是假如 1 2 2 此时 1_2 此时中间只能填写2&#xff0c;但是就不对了&#xff0c;所…

「docker」二、3分钟快速理解docker核心要素

上一节中我们知道docker的作用&#xff0c;这节我们介绍一下docker的要素。 镜像 docker的核心要素里面有个叫镜像&#xff08;images&#xff09;的概念&#xff0c;镜像的作用就类似我们安装虚拟机用到的iso镜像文件。镜像里包含了我们要运行的应用&#xff0c;如&#xff…

搭建基于 Solon AI 的 Streamable MCP 服务并部署至阿里云百炼

一、快速搭建 Solon 项目&#xff0c;引入 Solon AI 1. 开发环境准备 JDK 8 或以上版本。Maven 3.8.6 或以上版本。通义千问 API Key&#xff08;用于模型调用&#xff09;。 2. 创建名为 mcp-server-demo 的项目 创建时选择 Archetype 为 Solon AI&#xff08;可以减少些活&am…

免费的SSL和付费SSL 证书差异

免费的 SSL 和付费的 SSL&#xff08;TLS 证书&#xff09;本质上提供的加密能力是一样的&#xff0c;因为 SSL/TLS 协议本身是开放标准&#xff0c;核心加密算法不会因为是否收费而不同。主要区别在于以下几个方面&#xff1a;&#x1f511; 1. 加密强度免费 SSL&#xff1a;一…

代码随想录算法训练营第六天 -- 字符串1 || 344.反转字符串I / 541.反转字符串II / kamacoder54.替换数字--第八期模拟笔试

代码随想录算法训练营第六天 -- 字符串1 || 344.反转字符串I / 541.反转字符串II / kamacoder54.替换数字--第八期模拟笔试344.反转字符串I思路541.反转字符串II题目理解解题思路边界细节reverse()函数的实现[kamacoder54.替换数字 -- 第八期模拟笔试](https://kamacoder.com/p…

计算机视觉——光流法

系列文章目录 本系列开篇文章&#xff0c;暂时没有目录啦&#xff5e; 文章目录系列文章目录前言一、问题假设二、方程推导三、计算Ix,Iy,ItI_x,I_y,I_tIx​,Iy​,It​四、计算光流u,vu,vu,v4.1 传统算法Lucas-Kanade算法五、孔径问题5.1 直观理解5.2 数学角度5.3 解决方法总结…

前端安全攻防:XSS, CSRF 等防范与检测

前端安全攻防&#xff1a;XSS, CSRF 等防范与检测在Web应用日益普及的今天&#xff0c;前端安全已经成为一个不容忽视的重要环节。随着攻击技术的不断演进&#xff0c;各种前端安全漏洞&#xff08;如跨站脚本攻击 XSS、跨站请求伪造 CSRF 等&#xff09;层出不穷&#xff0c;它…