Stack详解(Java)
Stack
Java 中的 Stack 是一种基于后进先出(LIFO)原则的数据结构。Stack 类实现了一个标准的堆栈,它继承自 Vector 类,并提供了一些额外的方法来支持堆栈的操作。
下面是一些 Java Stack 类的详细解释:
-
构造方法:
Stack():创建一个空的堆栈。
-
核心方法:
push(E item):将元素压入堆栈的顶部。pop():移除并返回堆栈顶部的元素。peek():返回但不移除堆栈顶部的元素。empty():检查堆栈是否为空。search(Object o):在堆栈中搜索指定元素,并返回其相对于堆栈顶部的位置。
-
其他方法:
isEmpty():检查堆栈是否为空。size():返回堆栈中的元素数量。
Stack 类提供了一个方便的方式来实现堆栈的行为。它使用向量(Vector)作为底层数据结构,因此可以动态调整大小以适应存储元素的需求。
Tips:Vector 是一种动态数组,它可以根据需要自动调整大小以容纳元素。
Vector 的特点包括:
- Vector 是一个可变大小的数组,可以在运行时添加或删除元素。
- Vector 保持元素的顺序,即元素的插入和删除操作会影响到其他元素的索引。
- Vector 支持随机访问,可以通过索引来获取元素。
- Vector 是线程安全的,即多线程环境下也可以安全地访问和修改。
由于 Stack 类继承自 Vector 类,所以 Stack 类内部使用 Vector 来存储堆栈中的元素。这意味着在 Stack 中可以使用 Vector 提供的方法和功能来操作堆栈。
然而,需要注意的是,虽然 Vector 是线程安全的,但在单线程环境下,使用 ArrayDeque 作为替代可能更好。ArrayDeque 是 Java 提供的另一种实现堆栈的类,它在性能上比 Vector 更高效。
1. ArrayDeque
ArrayDeque 是一个双端队列(deque)的实现,它可以在队列的两端进行元素的插入和删除操作。由于栈是一种只能在一端进行插入和删除的数据结构,因此可以使用 ArrayDeque 的一端来模拟栈的行为。
具体实现方式如下:
- 使用 ArrayDeque 创建一个空的双端队列对象:
ArrayDeque<String> stack = new ArrayDeque<>(); - 使用
push()方法将元素压入队列的一端,即栈顶部的位置:stack.push("Java"); - 使用
pop()方法从队列的一端移除并返回栈顶部的元素:String topElement = stack.pop(); - 使用
peek()方法返回但不移除栈顶部的元素:String topElement = stack.peek(); - 使用
isEmpty()方法检查队列是否为空:boolean isEmpty = stack.isEmpty();
在 ArrayDeque 中,元素的插入和删除操作都是在同一端进行的,这样就满足了栈的后进先出(LIFO)的特性。
需要注意的是,由于 ArrayDeque 没有像 Stack 那样继承自 Vector,所以在性能上更高效,推荐在单线程环境中使用。
示例代码:
import java.util.ArrayDeque;public class Main {public static void main(String[] args) {ArrayDeque<String> stack = new ArrayDeque<>();// 压入元素stack.push("Java");stack.push("Python");stack.push("C++");// 弹出并打印元素while (!stack.isEmpty()) {System.out.println(stack.pop());}}
}
2. LinkedList
LinkedList 是 Java 集合框架中的一种双向链表实现, 也可以被用作栈的实现方式,其原理与 ArrayDeque 类似,只需要在链表的头部进行元素的插入和删除操作即可。具体实现方式如下:
- 使用 LinkedList 创建一个空链表对象:
LinkedList<String> stack = new LinkedList<>(); - 使用
push()方法将元素插入链表的头部,即栈顶部的位置:stack.push("Java"); - 使用
pop()方法从链表的头部移除并返回栈顶部的元素:String topElement = stack.pop(); - 使用
peek()方法返回但不移除栈顶部的元素:String topElement = stack.peek(); - 使用
isEmpty()方法检查链表是否为空:boolean isEmpty = stack.isEmpty();
同样地,由于 LinkedList 没有像 Stack 那样继承自 Vector,因此在性能上更高效,推荐在单线程环境中使用。
在 LinkedList 中,元素的插入和删除操作都是在链表的头部进行的,这样就满足了栈的后进先出(LIFO)的特性。
需要注意的是,在多线程环境下,LinkedList 并不是线程安全的,所以需要在多线程情况下使用时进行适当的同步处理。
示例代码:
import java.util.LinkedList;public class Main {public static void main(String[] args) {LinkedList<String> stack = new LinkedList<>();// 压入元素stack.push("Java");stack.push("Python");stack.push("C++");// 弹出并打印元素while (!stack.isEmpty()) {System.out.println(stack.pop());}}
}
3. 数组实现
数组也可以用来实现栈,使用一个数组来存储栈元素,同时记录一个指向栈顶的指针。在入栈和出栈操作时,更新指针位置即可。
示例代码:
public class Stack {int[] data;int top;public Stack(int size) {data = new int[size];top = -1;}public void push(int value) {if (top == data.length - 1) {System.out.println("Stack is full");return;}data[++top] = value;}public int pop() {if (top < 0) {System.out.println("Stack is empty");return -1;}return data[top--];}public boolean isEmpty() {return top < 0;}public static void main(String[] args) {Stack stack = new Stack(3);// 压入元素stack.push(1);stack.push(2);stack.push(3);// 弹出并打印元素while (!stack.isEmpty()) {System.out.println(stack.pop());}}
}
以上是常见的栈实现方式。具体选择哪种实现方式取决于你的需求和偏好。需要注意的是,在单线程环境下,使用 ArrayDeque 或 LinkedList 可能会比使用 Stack 更高效。
在使用 Stack 时,需要注意以下事项:
- 在调用
pop()或peek()方法之前,应先使用empty()方法检查堆栈是否为空,以避免异常。 - Stack 是线程安全的,可以在多线程环境下使用。不过,在单线程环境中,建议使用 ArrayDeque 作为替代,因为 ArrayDeque 的性能更高。
相关文章:
Stack详解(Java)
Stack Java 中的 Stack 是一种基于后进先出(LIFO)原则的数据结构。Stack 类实现了一个标准的堆栈,它继承自 Vector 类,并提供了一些额外的方法来支持堆栈的操作。 下面是一些 Java Stack 类的详细解释: 构造方法&…...
Qt框架学习 --- CTK编译(Qt5.15.2+vs2019+cmake)
系列文章目录 第二章 CTK的测试demo https://blog.csdn.net/yonug1107716573/article/details/135527289 文章目录 系列文章目录前言一、准备工作二、编译步骤1.修改文件2.编译CTK2.1 准备2.2 cmake界面配置2.3 配置编译器2.4 编译的配置设置2.5 选择需要编译的模块2.6 生成2.…...
Flink(十三)【Flink SQL(上)】
前言 最近在假期实训,但是实在水的不行,三天要学完SSM,实在一言难尽,浪费那时间干什么呢。SSM 之前学了一半,等后面忙完了,再去好好重学一遍,毕竟这玩意真是面试必会的东西。 今天开始学习 Flin…...
linux nginx配置链接访问图片
nginx 安装 sudo apt update sudo apt install nginxnginx 启动命令 sudo systemctl restart nginx # 重启 sudo systemctl start nginx #开启 sudo systemctl stop nginx # 关闭 sudo systemctl status nginx # 状态 sudo systemctl restart nginx.service #重启nginx安装成…...
深度学习笔记(二)——Tensorflow环境的安装
本篇文章只做基本的流程概述,不阐述具体每个软件的详细安装流程,具体的流程网上教程已经非常丰富。主要是给出完整的安装流程,以供参考 环境很重要 一个好的算法环境往往能够帮助开发者事半功倍,入门学习的时候往往搭建好环境就已…...
Java实现在线编辑预览office文档
文章目录 1 在线编辑1.1 PageOffice简介1.2 前端项目1.2.1 配置1.2.2 页面部分 1.3 后端项目1.3.1 pom.xml1.3.2 添加配置1.3.3 controller 2 在线预览2.1 引言2.2 市面上现有的文件预览服务2.2.1 微软2.2.2 Google Drive查看器2.2.3 阿里云 IMM2.2.4 XDOC 文档预览2.2.5 Offic…...
阿里云OSS上传视频,可分片上传
uniappH5实现 阿里云OSS上传视频 示例图: 上传视频完整示例代码: 使用npm安装SDK开发包,安装命令为 npm install ali-oss --save accessKeyId 和 accessKeySecret 还有 bucket 替换成你的就行。 multipartUpload 的第一个入参是&#x…...
Linux第三次课后作业
1.使用while和until语句编写脚本程序,计算1到100的和。 i1 s0 while(i<100) {sii} echo(s)sum0 i0 until test $num -eq 101 do #下面两个均为反斜杠 sumexpr $sum $i iexpr $num 1 done echo "the result is $sum"2.编写脚本程序备份用户指定的文件…...
WordPress后台仪表盘自定义添加删除概览项目插件Glance That
成功搭建WordPress站点,登录后台后可以在“仪表盘 – 概览”中看到包括多少篇文章、多少个页面、多少条评论和当前WordPress版本号及所使用的主题。具体如下图所示: 但是如果我们的WordPress站点还有自定义文章类型,也想在概览中显示出来应该…...
.Net6使用SignalR实现前后端实时通信
代码部分 后端代码 (Asp.net core web api,用的.net6)Program.cs 代码运行逻辑: 1. 通过 WebApplication.CreateBuilder(args) 创建一个 ASP.NET Core 应用程序建造器。 2. 使用 builder.Services.AddControllers() 添加 MVC 控…...
基于SpringBoot+Vue的时装服饰商城购物系统
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
近4w字吐血整理!只要你认真看完【C++编程核心知识】分分钟吊打面试官(包含:内存、函数、引用、类与对象、文件操作)
🌈个人主页:godspeed_lucip 🔥 系列专栏:C从基础到进阶 🏆🏆关注博主,随时获取更多关于C的优质内容!🏆🏆 C核心编程🌏1 内存分区模型🎄…...
pytest学习和使用-pytest如何进行分布式测试?(pytest-xdist)
1 什么是分布式测试? 在进行本文之前,先了解些基础知识,什么是分布式测试?分布式测试:是指通过局域网和Internet,把分布于不同地点、独立完成特定功能的测试计算机连接起来,以达到测试资源共享…...
虚拟ip可以解决所有的安全问题吗
虚拟IP(Virtual IP)是一种网络技术,可以把多台物理服务器或设备组合成一个逻辑集群,并且使用同一个IP地址对外提供服务。虚拟IP具有负载均衡、故障切换和高可用性等优势,同时还可以作为一种安全措施来增加系统的抗攻击…...
【数据库原理】(27)数据库恢复
在数据库系统中,恢复是指在发生某种故障导致数据库数据不再正确时,将数据库恢复到已知正确的某一状态的过程。数据库故障可能由多种原因引起,包括硬件故障、软件错误、操作员失误以及恶意破坏。为了确保数据库的安全性和完整性,数…...
施工企业工程管理信息化、智能化需求分析
一、引言 随着科技的飞速发展,信息化、智能化技术正在逐步改变各行各业的工作方式。对于施工企业而言,传统的工程管理方式已难以满足现代工程项目的复杂需求。为了提高效率、降低成本并确保工程的安全与质量,施工企业工程管理迫切需要进入信…...
Centos7 安装与卸载mysql
卸载 ps ajx | grep mysql : 查看当前服务器是否有mysql 没有的话就不需要卸载咯。 centos7 通过yum下载安装包通常是以.rpm为后缀,rpm -qa 可以查看当前服务器上所有的安装包: rpm -qa | grep mysql | xargs yum -y remove :将查询到的mysql…...
ASP.NET Core 的 Web Api 实现限流 中间件
Microsoft.AspNetCore.RateLimiting 中间件提供速率限制(限流)中间件。 它是.NET 7 以上版本才支持的中间件,刚看了一下,确实挺好用,下面给大家简单介绍一下: RateLimiterOptionsExtensions 类提供下列用…...
Mysql字段的各种时间类型
DATE: 特点:存储日期,不包含时间。示例: CREATE TABLE example_date (id INT PRIMARY KEY, event_date DATE ); INSERT INTO example_date (id, event_date) VALUES (1, 2023-01-11); TIME: 特点:存储时间,不包含日…...
Armv8-R AArch32 architecture概念学习
提示 该博客主要为个人学习,通过阅读官网手册整理而来(个人觉得阅读官网的英文文档非常有助于理解各个IP特性)。若有不对之处请参考参考文档,以官网文档为准。阅读该文章,可以先查看AArch64 Exception Model学习&…...
Three.js可视化开发:用辅助类打造交互式3D教学演示
Three.js可视化开发:用辅助类打造交互式3D教学演示 在数字化教育蓬勃发展的今天,3D可视化技术正在彻底改变传统教学模式。想象一下,当学生能够亲手旋转分子结构、观察物理碰撞的实时模拟,或是探索历史建筑的立体空间关系时&#x…...
开箱即用:BAAI/bge-m3镜像,一键启动语义相似度分析WebUI
开箱即用:BAAI/bge-m3镜像,一键启动语义相似度分析WebUI 1. 快速上手:从零到一的十分钟体验 你是不是也遇到过这样的场景?手头有两段文字,想知道它们说的是不是一回事,或者想快速验证一下自己构建的AI知识…...
零基础玩转RetinaFace:一键部署人脸检测,合影/监控都能精准识别
零基础玩转RetinaFace:一键部署人脸检测,合影/监控都能精准识别 1. 为什么选择RetinaFace人脸检测 在当今数字时代,人脸检测技术已经成为众多应用的基础功能。无论是社交媒体上的自动标记、安防监控系统的人脸识别,还是手机相册…...
SmolVLA长序列建模效果剖析:对比LSTM在时序预测任务中的表现
SmolVLA长序列建模效果剖析:对比LSTM在时序预测任务中的表现 最近在时间序列预测这个老生常谈的领域里,总有人问我:现在各种基于Transformer的新模型层出不穷,它们真的比LSTM这种“老将”强很多吗?尤其是在处理长序列…...
OpenClaw故障自愈方案:百川2-13B模型异常日志分析与重试机制
OpenClaw故障自愈方案:百川2-13B模型异常日志分析与重试机制 1. 问题背景与需求场景 上周我在用OpenClaw对接百川2-13B模型处理夜间自动化任务时,遇到了一个典型问题:凌晨3点突然收到飞书告警,显示"模型响应超时"。当…...
快速集成A2A Agent
面我们提到可以将MCP服务也封装为一个Tool(AIFunction)让Agent调用,这里A2A Agent也是一样的道理。 这样做的好处是:让MAF中的Agent像调用本地函数一样调用远程A2A Agent 或 MCP Server。 下面的代码展示了在MAF中将A2A Card转换…...
OpenClaw+Qwen3-32B自动化办公:会议纪要生成与飞书同步实战
OpenClawQwen3-32B自动化办公:会议纪要生成与飞书同步实战 1. 为什么需要自动化会议纪要 每次开完会最痛苦的事情是什么?对我来说就是整理会议纪要。作为技术负责人,每周要参加5-6个不同主题的会议,会后需要花大量时间回听录音、…...
DanKoe 视频笔记:生产力提升:战术压力与深度工作策略
在本节课中,我们将学习一种结合了“战术压力”与“深度工作”的策略。这套方法帮助一位自称拖延症患者的人在30天内创造了70万美元的收入。我们将拆解其核心原理与具体执行步骤,让初学者也能理解并应用。 概述 拖延常被视为缺点,但本教程提…...
阻抗匹配原理与工程实践指南
1. 阻抗匹配基础理论1.1 阻抗的定义与组成在电路系统中,阻抗(Impedance)是对电流阻碍作用的统称,用复数形式表示为:Z R j(ωL - 1/ωC)其中:R为电阻分量(实部)j(ωL - 1/ωC)为电抗…...
开源工具KeyboardChatterBlocker:机械键盘连击问题的智能解决方案
开源工具KeyboardChatterBlocker:机械键盘连击问题的智能解决方案 【免费下载链接】KeyboardChatterBlocker A handy quick tool for blocking mechanical keyboard chatter. 项目地址: https://gitcode.com/gh_mirrors/ke/KeyboardChatterBlocker 机械键盘以…...
