Java 数据结构:栈和队列

Java 数据结构:栈和队列

在软件开发中,数据结构是组织和管理数据的基础。掌握常见的数据结构如栈(Stack)和队列(Queue),能够帮助我们编写出更高效且结构清晰的代码。本文将深入探讨这两种数据结构,并展示如何在Java中实现和使用它们。

栈(Stack)

什么是栈?

栈是一种遵循后进先出(LIFO, Last In First Out)原则的数据结构。想象一个叠放的盘子堆,你只能从顶部添加或移除盘子。栈的操作也类似,元素从栈顶添加(压栈)和移除(弹栈)。

栈的基本操作

  • push: 将元素压入栈顶。
  • pop: 移除并返回栈顶元素。
  • peek: 返回栈顶元素但不移除它。
  • isEmpty: 检查栈是否为空。
  • size: 返回栈中的元素个数。

Java 中的栈实现

在Java中,java.util.Stack类提供了栈的数据结构。下面是一个简单的例子:

import java.util.Stack;public class StackExample {public static void main(String[] args) {Stack<Integer> stack = new Stack<>();// push 操作stack.push(1);stack.push(2);stack.push(3);// peek 操作System.out.println("栈顶元素: " + stack.peek()); // 输出 3// pop 操作System.out.println("弹出元素: " + stack.pop()); // 输出 3// 当前栈顶元素System.out.println("新的栈顶元素: " + stack.peek()); // 输出 2// 栈是否为空System.out.println("栈是否为空: " + stack.isEmpty()); // 输出 false// 栈的大小System.out.println("栈的大小: " + stack.size()); // 输出 2}
}

队列(Queue)

什么是队列?

队列是一种遵循先进先出(FIFO, First In First Out)原则的数据结构。队列就像排队买票,先到的人先买票。队列的操作分别在两端进行:一端用于添加元素(入队),另一端用于移除元素(出队)。

队列的基本操作

  • offer: 将元素添加到队列尾部。
  • poll: 移除并返回队列头部的元素。
  • peek: 返回队列头部的元素但不移除它。
  • isEmpty: 检查队列是否为空。
  • size: 返回队列中的元素个数。

Java 中的队列实现

在Java中,我们通常通过java.util.Queue接口及其实现类(如LinkedList)来实现队列。以下是一个示例:

import java.util.LinkedList;
import java.util.Queue;public class QueueExample {public static void main(String[] args) {Queue<Integer> queue = new LinkedList<>();// offer 操作queue.offer(1);queue.offer(2);queue.offer(3);// peek 操作System.out.println("队列头部元素: " + queue.peek()); // 输出 1// poll 操作System.out.println("移除的元素: " + queue.poll()); // 输出 1// 当前队列头部元素System.out.println("新的队列头部元素: " + queue.peek()); // 输出 2// 队列是否为空System.out.println("队列是否为空: " + queue.isEmpty()); // 输出 false// 队列的大小System.out.println("队列的大小: " + queue.size()); // 输出 2}
}

栈与队列的应用场景

栈的应用

  • 函数调用栈: 在程序执行期间,用于保存函数调用信息。
  • 表达式求值: 用于解析和计算中缀表达式、后缀表达式。
  • 括号匹配: 用于检查括号是否匹配。

队列的应用

  • 任务调度: 用于管理任务执行顺序。
  • 广度优先搜索(BFS): 在图算法中用于按层次遍历节点。
  • 消息队列: 用于异步消息

栈的应用

  • 浏览器历史记录: 用栈来存储用户访问的页面,用户点击“后退”按钮时,弹出栈顶页面并显示。
  • 撤销操作(Undo): 在文本编辑器中,用栈来记录用户的操作,用户点击“撤销”按钮时,弹出上一个操作并恢复。

队列的应用

  • 打印队列: 打印任务按顺序加入队列,按顺序执行。
  • 网络流量管理: 数据包按顺序进入队列,按顺序处理以确保流量控制。
  • 生产者-消费者问题: 用队列在生产者和消费者之间传递数据。

栈与队列的选择

在实际开发中,选择栈还是队列取决于具体的应用需求:

  • 如果需要后进先出的处理机制,应选择栈。
  • 如果需要先进先出的处理机制,应选择队列。

Java 中栈和队列的高级实现

除了基本的StackLinkedList,Java还提供了一些高级的数据结构来实现栈和队列,以满足更复杂的需求。

双端队列(Deque)

双端队列(Deque, Double Ended Queue)是允许在两端进行插入和删除操作的队列。Java中的ArrayDeque类是Deque接口的一个实现。

import java.util.ArrayDeque;
import java.util.Deque;public class DequeExample {public static void main(String[] args) {Deque<Integer> deque = new ArrayDeque<>();// 在队列头部和尾部添加元素deque.addFirst(1);deque.addLast(2);// 在队列头部和尾部移除元素System.out.println("移除头部元素: " + deque.removeFirst()); // 输出 1System.out.println("移除尾部元素: " + deque.removeLast()); // 输出 2}
}

并发队列(Concurrent Queue)

在多线程环境中,使用普通的队列实现可能会导致数据不一致或竞争问题。Java 提供了线程安全的并发队列,如ConcurrentLinkedQueueBlockingQueue

import java.util.concurrent.ConcurrentLinkedQueue;public class ConcurrentQueueExample {public static void main(String[] args) {ConcurrentLinkedQueue<Integer> queue = new ConcurrentLinkedQueue<>();// 添加元素queue.offer(1);queue.offer(2);// 移除并返回队列头部的元素System.out.println("移除的元素: " + queue.poll()); // 输出 1}
}

总结

在Java中,我们可以利用Stack类、Queue接口及其各种实现类(如LinkedListArrayDequeConcurrentLinkedQueue)来满足不同的需求。

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

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

相关文章

c++_0基础_讲解3 输入 输出

cin与cout C是一种通用的编程语言&#xff0c;支持面向对象编程。它是由Bjarne Stroustrup在1983年创建的&#xff0c;是C语言的一个扩展&#xff0c;为程序员提供了更多的功能和更高的抽象级别。 在C中&#xff0c;输入和输出是非常重要的操作&#xff0c;常用的输入操作是使…

车票信息的请求与显示

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 1 发送与分析车票信息的查询请求 得到了获取车票信息的网络请求地址&#xff0c;然后又分析出请求地址的必要参数以及车站名称转换的文件&#xff…

如何用Windows api查找标题相似的所有窗口句柄VB6

在 VB6 中&#xff0c;可以使用 FindWindow API 函数来查找窗口句柄。这个函数接受两个参数&#xff0c;一个是窗口类名&#xff0c;另一个是窗口标题。如果你只知道窗口标题的一部分或者想查找标题相似的所有窗口&#xff0c;可以使用通配符来进行模糊匹配。 在 VB6 中&#…

《软件测试52讲》——测试基础知识篇

1 你真的懂测试吗&#xff1f;从“用户登录”测试谈起 从“用户登录”测试谈起&#xff0c;“用户登录”功能作为测试对象 作为测试工程师&#xff0c;你的目标是要保证系统在各种应用场景下的功能是符合设计要求的&#xff0c;所以你需要考虑的测试用例就需要更多、更全面。 …

2078.两栋颜色不同且距离最远的房子

街上有 n 栋房子整齐地排成一列&#xff0c;每栋房子都粉刷上了漂亮的颜色。给你一个下标从 0 开始且长度为 n 的整数数组 colors &#xff0c;其中 colors[i] 表示第 i 栋房子的颜色。 返回 两栋 颜色 不同 房子之间的 最大 距离。 第 i 栋房子和第 j 栋房子之间的距离是 a…

Linux应用编程 - i2c-dev操作I2C

嵌入式Linux操作I2C设备&#xff0c;我们一般会在内核态编写I2C驱动程序。另外还能在用户空间编写I2C程序&#xff0c;下面介绍相关代码的实现。 i2c-dev框架在内核中封装了I2C通信所需要的所有通信细节&#xff0c;I2C适配器会在/dev目录下创建字符设备&#xff0c;例如&#…

kettle从入门到精通 第七十课 ETL之kettle kettle数据校验,脏数据清洗轻松拿捏

场景&#xff1a;输入在指定的错误(错误应涵盖数据类型不匹配的情况)行数内&#xff0c;trans不报错&#xff0c;但通过错误处理步骤捕捉&#xff0c;并记入文件&#xff0c;整个数据管线正常完成直至处理完最后一个输入行。 解决方案&#xff1a;使用步骤【数据检验】进行处理…

C# —— 算数运算符

算术运算符: 用于数值类型进行变量计算的运算符 他的返回结果是数值 赋值运算符 : 先看右侧 再看 左侧 将右侧的数据赋值给左侧的变量 int num 5; string name "老王"; float myHeight 187.5f; 加 先计算 再赋值 // 进行数据的加法…

本周MoonBit新增Wasm1引用计数支持、语法即将添加错误恢复机制

MoonBit更新 【Wasm MVP】Wasm1 后端添加基于 Perceus 算法的引用计数支持 【语法】throw raise try catch 均被保留为关键字 为了即将添加的错误处理机制 【Core】List与sorted_map被移动至core/immut下 List被移动至core/immut/list包中&#xff0c;并被移除内置类型支持 …

快速解决Windows和Linux文件格式转换

来源&#xff1a; “码农不会写诗”公众号 链接&#xff1a;快速解决Windows和Linux文件格式转换 文章目录 01 安装02 使用 NOTE-dos2uninx dos2unix是将Dos(Windows)格式文件转换为Linux格式的命令&#xff1b; unix2dos是将Linux格式文件转换为Dos(Windows)格式的命令。 Dos…

哈希表、递归在二叉树中的应用-1372. 二叉树中的最长交错路径

题目链接及描述 1372. 二叉树中的最长交错路径 - 力扣&#xff08;LeetCode&#xff09; 题目分析 题目所述&#xff0c;计算在二叉树中交替遍历的最大深度【左->右->左】【右->左->右】&#xff0c;例如对于从当前根节点root出发&#xff0c;则此时遍历方向有两个…

今日成果2024-6-7 TrustZone TEE安全SDK开发指南

Rockchip Vendor Storage Application Note.pdf OK 开机下&#xff0c;可以实现Vendor Storage的读写。 0ms时同步RTC时间 OK Rockchip_Developer_Guide_TEE_SDK_CN.pdf 什么是TrustZone 此系统方法意味着可以保护安全内存、加密块、键盘和屏幕等外设&#xff0c;从而可确…

视频剪辑可以赚钱吗 快速学会视频剪辑的方法

由于视频剪辑的需求不断增长&#xff0c;学会视频剪辑成为一项自媒体必备的技能&#xff0c;这个技能可以为个人带来收入和职业发展带来机会。无论是作为自由职业者还是在公司工作&#xff0c;掌握视频剪辑技能都可以为你提供更多的工作机会和竞争优势。这篇文章将讲解视频剪辑…

springboot事务管理的机制是什么

SpringBoot的事务管理机制实质上是基于Spring框架的事务处理机制。其主要目的是确保一系列数据库操作要么全部成功&#xff0c;要么全部失败&#xff08;回滚&#xff09;&#xff0c;从而维护数据的完整性和一致性。 SpringBoot事务管理遵循ACID四大特性&#xff1a; 1、原子…

VBA,VB6 LIKE 运算符有哪些转义符?

在 VB6 中&#xff0c;LIKE 运算符主要使用以下转义符&#xff1a; *&#xff1a;表示匹配任意字符序列&#xff08;包括空字符序列&#xff09;。 ?&#xff1a;表示匹配任意单个字符。 [ ]&#xff1a;用于表示字符范围。例如&#xff0c;[a-z] 表示匹配从小写字母 a 到 z …

前端将Markdown文本转换为富文本显示/编辑,并保存为word文件

参考&#xff1a;https://www.wangeditor.com/ https://blog.csdn.net/weixin_43797577/article/details/138854324 插件&#xff1a; markdown-it traptitech/markdown-it-katex markdown-it-link-attributes highlight.js wangeditor/editor wangeditor/editor-for-vue html…

2.深度学习-线性回归

文章目录 环境配置&#xff08;必看&#xff09;线性回归代码工程运行结果1.对比图2.运行结果 环境配置&#xff08;必看&#xff09; Anaconda-创建虚拟环境的手把手教程相关环境配置看此篇文章&#xff0c;本专栏深度学习相关的版本和配置&#xff0c;均按照此篇文章进行安装…

Carsim高级开发:VS Connect通讯开发指南

文章目录 前言一、VS Connect 概念引入二、VS Connect 通讯框架三、Carsim 工程配置1、车辆模型配置2、procedure配置3、Run Control配置4、受控车辆名称配置 四、VS Connect Server代码1、打开Sln工程2、代码修改 五、VS Connect Client代码1、函数的调用关系2、carsim_variab…

目录深度探索

目录 文件控制块和索引节点 索引节点&#xff08;Inode&#xff09; 结构比较 简单文件目录 目录和文件控制块 线性结构的目录 优点和缺点 使用场景 树形目录 树形目录的基本概念 树形目录的优势 树形目录的具体应用 案例分析&#xff1a;多层次目录结构 无环图目…

MySQL 8.0开始引入了开窗函数,使得SQL语句能够以更复杂的方式操作数据集。

在MySQL中使用ROW_NUMBER()函数时&#xff0c;可以通过一个简单的图表来帮助理解它是如何工作的。以下是对ROW_NUMBER()函数的图解说明&#xff1a; 假设我们有一个名为employees的表&#xff0c;其中包含以下列&#xff1a;employee_id&#xff08;员工ID&#xff09;&#x…