当前位置: 首页 > news >正文

Stack详解(Java)

Stack

Java 中的 Stack 是一种基于后进先出(LIFO)原则的数据结构。Stack 类实现了一个标准的堆栈,它继承自 Vector 类,并提供了一些额外的方法来支持堆栈的操作。

下面是一些 Java Stack 类的详细解释:

  1. 构造方法:

    • Stack():创建一个空的堆栈。
  2. 核心方法:

    • push(E item):将元素压入堆栈的顶部。
    • pop():移除并返回堆栈顶部的元素。
    • peek():返回但不移除堆栈顶部的元素。
    • empty():检查堆栈是否为空。
    • search(Object o):在堆栈中搜索指定元素,并返回其相对于堆栈顶部的位置。
  3. 其他方法:

    • 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 的一端来模拟栈的行为。

具体实现方式如下:

  1. 使用 ArrayDeque 创建一个空的双端队列对象:ArrayDeque<String> stack = new ArrayDeque<>();
  2. 使用 push() 方法将元素压入队列的一端,即栈顶部的位置:stack.push("Java");
  3. 使用 pop() 方法从队列的一端移除并返回栈顶部的元素:String topElement = stack.pop();
  4. 使用 peek() 方法返回但不移除栈顶部的元素:String topElement = stack.peek();
  5. 使用 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 类似,只需要在链表的头部进行元素的插入和删除操作即可。具体实现方式如下:

  1. 使用 LinkedList 创建一个空链表对象:LinkedList<String> stack = new LinkedList<>();
  2. 使用 push() 方法将元素插入链表的头部,即栈顶部的位置:stack.push("Java");
  3. 使用 pop() 方法从链表的头部移除并返回栈顶部的元素:String topElement = stack.pop();
  4. 使用 peek() 方法返回但不移除栈顶部的元素:String topElement = stack.peek();
  5. 使用 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 是一种基于后进先出&#xff08;LIFO&#xff09;原则的数据结构。Stack 类实现了一个标准的堆栈&#xff0c;它继承自 Vector 类&#xff0c;并提供了一些额外的方法来支持堆栈的操作。 下面是一些 Java Stack 类的详细解释&#xff1a; 构造方法&…...

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(上)】

前言 最近在假期实训&#xff0c;但是实在水的不行&#xff0c;三天要学完SSM&#xff0c;实在一言难尽&#xff0c;浪费那时间干什么呢。SSM 之前学了一半&#xff0c;等后面忙完了&#xff0c;再去好好重学一遍&#xff0c;毕竟这玩意真是面试必会的东西。 今天开始学习 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环境的安装

本篇文章只做基本的流程概述&#xff0c;不阐述具体每个软件的详细安装流程&#xff0c;具体的流程网上教程已经非常丰富。主要是给出完整的安装流程&#xff0c;以供参考 环境很重要 一个好的算法环境往往能够帮助开发者事半功倍&#xff0c;入门学习的时候往往搭建好环境就已…...

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上传视频 示例图&#xff1a; 上传视频完整示例代码&#xff1a; 使用npm安装SDK开发包&#xff0c;安装命令为 npm install ali-oss --save accessKeyId 和 accessKeySecret 还有 bucket 替换成你的就行。 multipartUpload 的第一个入参是&#x…...

Linux第三次课后作业

1.使用while和until语句编写脚本程序&#xff0c;计算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站点&#xff0c;登录后台后可以在“仪表盘 – 概览”中看到包括多少篇文章、多少个页面、多少条评论和当前WordPress版本号及所使用的主题。具体如下图所示&#xff1a; 但是如果我们的WordPress站点还有自定义文章类型&#xff0c;也想在概览中显示出来应该…...

.Net6使用SignalR实现前后端实时通信

代码部分 后端代码 &#xff08;Asp.net core web api&#xff0c;用的.net6&#xff09;Program.cs 代码运行逻辑&#xff1a; ​1. 通过 WebApplication.CreateBuilder(args) 创建一个 ASP.NET Core 应用程序建造器。 2. 使用 builder.Services.AddControllers() 添加 MVC 控…...

基于SpringBoot+Vue的时装服饰商城购物系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…...

近4w字吐血整理!只要你认真看完【C++编程核心知识】分分钟吊打面试官(包含:内存、函数、引用、类与对象、文件操作)

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;C从基础到进阶 &#x1f3c6;&#x1f3c6;关注博主&#xff0c;随时获取更多关于C的优质内容&#xff01;&#x1f3c6;&#x1f3c6; C核心编程&#x1f30f;1 内存分区模型&#x1f384…...

pytest学习和使用-pytest如何进行分布式测试?(pytest-xdist)

1 什么是分布式测试&#xff1f; 在进行本文之前&#xff0c;先了解些基础知识&#xff0c;什么是分布式测试&#xff1f;分布式测试&#xff1a;是指通过局域网和Internet&#xff0c;把分布于不同地点、独立完成特定功能的测试计算机连接起来&#xff0c;以达到测试资源共享…...

虚拟ip可以解决所有的安全问题吗

虚拟IP&#xff08;Virtual IP&#xff09;是一种网络技术&#xff0c;可以把多台物理服务器或设备组合成一个逻辑集群&#xff0c;并且使用同一个IP地址对外提供服务。虚拟IP具有负载均衡、故障切换和高可用性等优势&#xff0c;同时还可以作为一种安全措施来增加系统的抗攻击…...

【数据库原理】(27)数据库恢复

在数据库系统中&#xff0c;恢复是指在发生某种故障导致数据库数据不再正确时&#xff0c;将数据库恢复到已知正确的某一状态的过程。数据库故障可能由多种原因引起&#xff0c;包括硬件故障、软件错误、操作员失误以及恶意破坏。为了确保数据库的安全性和完整性&#xff0c;数…...

施工企业工程管理信息化、智能化需求分析

一、引言 随着科技的飞速发展&#xff0c;信息化、智能化技术正在逐步改变各行各业的工作方式。对于施工企业而言&#xff0c;传统的工程管理方式已难以满足现代工程项目的复杂需求。为了提高效率、降低成本并确保工程的安全与质量&#xff0c;施工企业工程管理迫切需要进入信…...

Centos7 安装与卸载mysql

卸载 ps ajx | grep mysql &#xff1a; 查看当前服务器是否有mysql 没有的话就不需要卸载咯。 centos7 通过yum下载安装包通常是以.rpm为后缀&#xff0c;rpm -qa 可以查看当前服务器上所有的安装包&#xff1a; rpm -qa | grep mysql | xargs yum -y remove :将查询到的mysql…...

ASP.NET Core 的 Web Api 实现限流 中间件

Microsoft.AspNetCore.RateLimiting 中间件提供速率限制&#xff08;限流&#xff09;中间件。 它是.NET 7 以上版本才支持的中间件&#xff0c;刚看了一下&#xff0c;确实挺好用&#xff0c;下面给大家简单介绍一下&#xff1a; RateLimiterOptionsExtensions 类提供下列用…...

Mysql字段的各种时间类型

DATE: 特点&#xff1a;存储日期&#xff0c;不包含时间。示例&#xff1a; CREATE TABLE example_date (id INT PRIMARY KEY, event_date DATE ); INSERT INTO example_date (id, event_date) VALUES (1, 2023-01-11); TIME: 特点&#xff1a;存储时间&#xff0c;不包含日…...

Armv8-R AArch32 architecture概念学习

提示 该博客主要为个人学习&#xff0c;通过阅读官网手册整理而来&#xff08;个人觉得阅读官网的英文文档非常有助于理解各个IP特性&#xff09;。若有不对之处请参考参考文档&#xff0c;以官网文档为准。阅读该文章&#xff0c;可以先查看AArch64 Exception Model学习&…...

Cursor Pro破解工具:如何通过开源技术方案实现AI编程助手无限制使用?

Cursor Pro破解工具&#xff1a;如何通过开源技术方案实现AI编程助手无限制使用&#xff1f; 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能…...

[Windows 驱动] 深入解析进程名获取的多种内核方法

1. Windows驱动开发中的进程名获取基础 在Windows内核驱动开发中&#xff0c;获取进程名是最基础但至关重要的操作之一。想象一下&#xff0c;你正在开发一个安全监控驱动&#xff0c;需要实时检查哪些进程正在运行&#xff1b;或者你在开发一个性能优化工具&#xff0c;需要针…...

Leather Dress Collection 企业级参数调优指南:平衡响应速度与生成质量

Leather Dress Collection 企业级参数调优指南&#xff1a;平衡响应速度与生成质量 如果你正在考虑把Leather Dress Collection这类大模型服务搬到公司的生产环境里&#xff0c;那你肯定遇到过这样的纠结&#xff1a;调快了&#xff0c;生成的内容质量好像会打折扣&#xff1b…...

uniapp集成腾讯地图:从marker点聚合到轨迹回放的跨端实战与性能调优

1. uniapp集成腾讯地图SDK的核心步骤 第一次在uniapp里用腾讯地图SDK时&#xff0c;我踩了个大坑——直接在H5端跑代码发现地图出不来。后来才明白&#xff0c;腾讯地图在H5端需要单独配置安全域名。具体操作是在腾讯地图开放平台申请key时&#xff0c;必须把H5的域名加入白名单…...

Qwen3-VL:30B开源可部署优势展示:无需License、无调用限制、全链路私有化保障

Qwen3-VL:30B开源可部署优势展示&#xff1a;无需License、无调用限制、全链路私有化保障 1. 为什么你需要一个私有化的多模态大模型&#xff1f; 想象一下这个场景&#xff1a;你的团队需要处理大量产品图片&#xff0c;并生成对应的营销文案。你打开某个在线AI工具&#xf…...

【AI知识点】交叉注意力机制:连接不同世界的“信息桥梁”

1. 从"信息桥梁"理解交叉注意力机制 想象你正在同时阅读一本英文书和它的中文翻译版。当你遇到一个不太理解的英文句子时&#xff0c;会自然地在中文版本中寻找对应的段落来帮助理解——这个过程就像交叉注意力机制在神经网络中的工作方式。它就像是架设在两个不同世…...

卡证检测矫正模型中小企业降本:替代万元级专用证件扫描仪方案

卡证检测矫正模型&#xff1a;中小企业降本利器&#xff0c;替代万元级专用证件扫描仪方案 1. 引言&#xff1a;一个被忽视的降本痛点 如果你在中小企业负责行政、人事或财务&#xff0c;一定对下面这个场景不陌生&#xff1a;每天要处理一堆身份证、护照、驾照的复印件或扫描…...

墨语灵犀助力软件测试:智能测试用例生成与缺陷报告分析

墨语灵犀助力软件测试&#xff1a;智能测试用例生成与缺陷报告分析 作为一名在软件测试领域摸爬滚打多年的工程师&#xff0c;我深知这份工作的“痛”与“乐”。痛的是&#xff0c;面对动辄几十上百页的需求文档&#xff0c;手动编写测试用例的枯燥与耗时&#xff1b;乐的是&a…...

Whisper语音识别镜像快速部署:5分钟搭建多语言客服转写服务

Whisper语音识别镜像快速部署&#xff1a;5分钟搭建多语言客服转写服务 1. 引言&#xff1a;语音识别在客服场景的挑战 在全球化的商业环境中&#xff0c;客服中心面临着多语言支持的巨大挑战。传统语音识别系统往往需要为每种语言单独部署模型&#xff0c;不仅成本高昂&…...

如何通过手机号快速查询QQ号:3分钟解决账号遗忘难题

如何通过手机号快速查询QQ号&#xff1a;3分钟解决账号遗忘难题 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 在数字时代&#xff0c;QQ账号作为重要的社交和工作工具&#xff0c;其安全性与可访问性至关重要。然而&#xff0c;更…...