当前位置: 首页 > 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学习&…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...

Matlab实现任意伪彩色图像可视化显示

Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中&#xff0c;如何展示好看的实验结果图像非常重要&#xff01;&#xff01;&#xff01; 1、灰度原始图像 灰度图像每个像素点只有一个数值&#xff0c;代表该点的​​亮度&#xff08;或…...