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

数据结构-Stack和栈

1.栈

1.1什么是栈

栈是一种特殊的线性表,只允许在固定的一段进行插入和删除操作,进行插入和删除操作的一段称为栈顶,另一端称为栈底。

栈中的数据元素遵顼后进先出LIFO(Last In First Out)的原则,就像一叠盘子,只能在顶部添加或移除盘子。

压栈:栈的插入操作叫做压栈/进栈/入栈,新插入的元素在栈顶。

出战:栈的删除操作叫做出栈,要删除的 元素在栈顶。

从图上观察发现:无论是插入还是删除操作,栈底的位置不发生变化,但是栈顶的位置会随插入或删除操作而发生变化。

1.2栈的常用方法

在Java标准库中提供了java.util.Stack(栈的实现类),此处的常用方法指的是Stack的常用方法。

Stack的常用方法如下表所示:

方法解释
Stack()构造方法,构造一个空的栈
E push(E,e)将元素e入栈,并返回e
E pop()将栈顶元素出栈并返回
E peek()获取栈顶元素
int size()获取栈中有效元素的个数
boolean empty()检验栈是否为空

注意:

pop()是删除元素,并返回删除(删除前的栈顶元素)的元素

peek()是获取栈顶元素并返回,不进行出栈操作

常用方法的代码演示:

public class Test {public static void main(String[] args) {Stack<String> stack=new Stack<>();//入栈stack.push("My");stack.push("name");stack.push("is");stack.push("hajimi");//获取栈中有效元素的个数-->4System.out.println(stack.size());//获取栈顶元素-->hajimi  遵循后进先出System.out.println(stack.peek());//peek方法不会改变栈中的元素个数System.out.println(stack.size());//出栈String deleteElem=stack.pop();//获取栈中有效元素的个数-->3System.out.println(stack.size());//判断栈是否为空-->falseSystem.out.println(stack.isEmpty());}
}

2.Stack

2.1什么是Stack 

Java提供了多种方式来实现栈,包括使用java.util.Stack类,使用Deque接口,或者手动实现栈。

java.util.Stack是Java标准库中提供的一个栈实现类。它继承自Vector类,是一个线程安全的栈实现。


 2.2 Stack的特点

1.线程安全:

由于Stack继承自Vector,它的所有方法都是同步的(线程安全的)。

2.动态扩容:

Stack的底层是Vector,它会根据需要进行动态扩容。

这是Vector的动态扩容方法的原码:

2.3 Stack的局限性

虽然Stack提供了很方便的栈操作,但仍存在一些局限性:

1.继承自Vector:Stack继承自Vector,意味着它继承了一些与栈无关的方法,可能会导致误用

2.性能问题:由于Stack是线程安全的,它的同步机制可能会导致性能的下降,尤其是单线程环境中

2.4实现一个Stack

Stack的底层是Vector,而Vector的底层是数组,接下来我们来编写自己的"Stack"。

代码编写:

package datastructure;import java.util.Arrays;public class MyStack2 {//用来存放栈中的元素private int[] elem;//计算栈中有效元素的个数private int usedSize;//默认初始容量private static final int DEFAULT_SIZE=10;public MyStack2(){this.elem=new int[DEFAULT_SIZE];}//判断栈是否已满private boolean isFull(){return elem.length==usedSize;}//判断栈是否为空private boolean isEmpty(){return usedSize==0;}//元素入栈方法public void push(int val){//判断栈是否已满,如果已满进行扩容if(isFull()){Arrays.copyOf(elem,2*elem.length);}//将元素压入,并将有效元素的个数加一elem[usedSize++]=val;}//元素出栈操作public int pop(){if(isEmpty()){System.out.println("栈中没有元素,无法进行出栈操作");return Integer.MAX_VALUE;}//获取栈顶元素,即要删除的元素int deleteElem=elem[usedSize-1];usedSize--;return deleteElem;}//获取栈顶元素public int peek(){if(isEmpty()){System.out.println("栈为空,无法获取栈顶元素");return Integer.MAX_VALUE;}return elem[usedSize-1];}//计算栈中元素的个数public int size(){return usedSize;}
}

对上述的代码进行运行测试:

public class Test {public static void main(String[] args) {MyStack2 myStack2=new MyStack2();myStack2.push(1);myStack2.push(2);myStack2.push(3);myStack2.push(4);myStack2.push(5);System.out.println("当前栈中元素的个数:"+myStack2.size());System.out.println("获取栈顶元素:"+myStack2.peek());System.out.println("进行出栈:"+myStack2.pop());System.out.println("当前栈中元素的个数:"+myStack2.size());System.out.println("获取栈顶元素:"+myStack2.peek());}
}

运行结果:

3.栈,虚拟机栈,栈帧

概念区分:栈,虚拟机栈和栈帧  

栈:一种数据结构,遵循后进先出(LIFO)的原则,允许在栈顶进行元素的插入和删除操作,常用于括号匹配,表达式求值,深度优先搜索等场景。

虚拟机栈:Java虚拟机(JVM)运行时数据区的一部分,用于存储方法调用,局部变量。每个线程都具有一个自己的虚拟机栈,虚拟机栈中存储的是栈帧

栈帧:是虚拟机栈中的一个条目,用于存储方法调用的相关信息。每个方法调用都会创建一个栈帧,并将其压入虚拟机栈,方法结束后,栈帧会被弹出。

4.栈的应用-逆波兰表达式求值

4.1 什么是逆波兰表达式

逆波兰表达式,也称后缀表达式,是一种特殊的算数表达式表示方式。在逆波兰表达式中,操作符位于操作数之后,这种表达方式的优点式不需要括号来表示操作的优先级,从而简化了表达式的解析和计算

4.2 逆波兰表达式的特点

1.操作符在操作数之后:例如,普通的表达式 (中缀表达式)5 - 2 在逆波兰表达式中表示为 5 2 -

2.无需括号:由于操作符位置明确,不需要括号来表示优先级

3.易于计算:可以使用栈这种数据结构计算表达式的值

4.3 如何用栈解决逆波兰表达式求值

我们知道栈遵循后入先出(Last In First Out)的原则,逆波兰表达式中操作符位于操作数之后,我们可以根据这两个特点对元素进行出栈和入栈操作。

1.先初始化一个空栈

2.从左向右扫描表达式,如果遇到操作数就将其压入栈中,如果遇到操作符,就从栈中弹出两个元素,进行计算,并将计算的结果压入栈中

3.表达式扫描完成后,栈顶元素即为计算的结果

假设传递的参数是一个数组:tokens=["2","1","+","3","*"]

将其转为中缀表达式:(2+1)*3=9

代码编写:

public int evalRPN(String[] tokens) {Stack<Integer> stack = new Stack();for (int i = 0; i < tokens.length; i++) {String token = tokens[i];if (isNumber(token)) {stack.push(Integer.parseInt(token));} else {int num2 = stack.pop();int num1 = stack.pop();switch (token) {case "+":stack.push(num1 + num2);break;case "-":stack.push(num1 - num2);break;case "*":stack.push(num1 * num2);break;case "/":stack.push(num1 / num2);break;default:}}}return stack.pop();
}
public boolean isNumber(String token) {return !("+".equals(token) || "-".equals(token) || "*".equals(token) || "/".equals(token));
}

相关文章:

数据结构-Stack和栈

1.栈 1.1什么是栈 栈是一种特殊的线性表&#xff0c;只允许在固定的一段进行插入和删除操作&#xff0c;进行插入和删除操作的一段称为栈顶&#xff0c;另一端称为栈底。 栈中的数据元素遵顼后进先出LIFO&#xff08;Last In First Out&#xff09;的原则&#xff0c;就像一…...

使用vhd虚拟磁盘安装两个win10系统

使用vhd虚拟磁盘安装两个win10系统 前言vhd虚拟磁盘技术简介准备工具开始动手实践1.winX选择磁盘管理2.选择“操作”--“创建VHD”3.自定义一个位置&#xff0c;输入虚拟磁盘大小4.右键初始化磁盘5.选择GPT分区表格式6.右键新建简单卷7.给卷起个名字&#xff0c;用于区分8.打开…...

代码随想录34 动态规划

1.经典问题&#xff1a; 背包问题 打家劫舍 斐波那契数列 爬楼梯问题 股票问题 2.dp数组以及下标的含义 3.递推公式 3.dp数组初始化 4.遍历顺序 5.打印数组 leetcode509.斐波那契数列 1.确定dp[i]含义 dp[i]第i个斐波那契数的值为dp[i] 2.递推公式&#xff1a;dp[…...

【2025年最新版】Java JDK安装、环境配置教程 (图文非常详细)

文章目录 【2025年最新版】Java JDK安装、环境配置教程 &#xff08;图文非常详细&#xff09;1. JDK介绍2. 下载 JDK3. 安装 JDK4. 配置环境变量5. 验证安装6. 创建并测试简单的 Java 程序6.1 创建 Java 程序&#xff1a;6.2 编译和运行程序&#xff1a;6.3 在显示或更改文件的…...

Shell特殊状态变量以及常用内置变量总结

目录 1. 特殊的状态变量 1.1 $?&#xff08;上一个命令的退出状态&#xff09; 1.2 $$&#xff08;当前进程的 PID&#xff09; 1.3 $!&#xff08;后台进程的 PID&#xff09; 1.4 $_&#xff08;上一条命令的最后一个参数&#xff09; 2.常用shell内置变量 2.1 echo&…...

【4Day创客实践入门教程】Day4 迈向高手之路——进一步学习!

Day4 迈向高手之路——进一步学习&#xff01; 目录 Day4 迈向高手之路——进一步学习&#xff01;更多的开发板外壳制作 Day0 创想启程——课程与项目预览Day1 工具箱构建——开发环境的构建Day2 探秘微控制器——单片机与MicroPython初步Day3 实战演练——桌面迷你番茄钟Day4…...

EtherCAT-快速搭建

EtherCAT-快速搭建 快速简介 快速简介 EtherCAT现场总线协议是由德国倍福公司在2003年提出的&#xff0c;该通讯协议拓扑结构十分灵活&#xff0c;数据传输速度快&#xff0c;同步特性好&#xff0c;可以形成各种网络拓扑结构。倍福公司推出了自己的ASIC专用芯片有ET1100和ET1…...

【设计测试用例自动化测试性能测试 实战篇】

&#x1f308;个人主页&#xff1a;努力学编程’ ⛅个人推荐&#xff1a; c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构&#xff0c;刷题刻不容缓&#xff1a;点击一起刷题 &#x1f319;心灵鸡汤&#xff1a;总有人要赢&#xff0c;为什么不能是我呢 设计测试用例…...

DBeaver连接MySQL提示Access denied for user ‘‘@‘ip‘ (using password: YES)的解决方法

在使用DBeaver连接MySQL数据库时&#xff0c;如果遇到“Access denied for user ip (using password: YES)”的错误提示&#xff0c;说明用户认证失败。此问题通常与数据库用户权限、配置错误或网络设置有关。本文将详细介绍解决此问题的步骤。 一、检查用户名和密码 首先&am…...

【MySQL — 数据库增删改查操作】深入解析MySQL的 Update 和 Delete 操作

1. 测试数据 mysql> select* from exam1; ----------------------------------------- | id | name | Chinese | Math | English | ----------------------------------------- | 1 | 唐三藏 | 67.0 | 98.0 | 56.0 | | 2 | 孙悟空 | 87.0 | 78.…...

04树 + 堆 + 优先队列 + 图(D1_树(D1_基本介绍))

目录 一、什么是树&#xff1f; 二、相关术语 根结点 边 叶子结点 兄弟结点 祖先结点 结点的大小 树的层 结点的深度 结点的高度 树的高度 斜树 一、什么是树&#xff1f; 树是一种类似于链表的数据结构&#xff0c;不过链表的结点是以线性方式简单地指向其后继结…...

【Proteus仿真】【51单片机】多功能计算器系统设计

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 联系作者 一、主要功能 1、LCD1602液晶显示 2、矩阵按键​ 3、加减乘除&#xff0c;开方运算 4、带符号运算 5、最大 999*999 二、使用步骤 基于51单片机多功能计算器 包含&#xff1a;程序&…...

Solon Cloud Gateway 开发:Route 的配置与注册方式

路由的配置与注册有三种方式&#xff1a;手动配置&#xff1b;自动发现配置&#xff1b;代码注册。 1、手动配置方式 solon.cloud.gateway:routes: #!必选- id: demotarget: "http://localhost:8080" # 或 "lb://user-service"predicates: #?可选- &quo…...

jstat命令详解

jstat 用于监视虚拟机运行时状态信息的命令&#xff0c;它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT 编译等运行数据。 命令的使用格式如下。 jstat [option] LVMID [interval] [count]各个参数详解&#xff1a; option&#xff1a;操作参数LVMID&#xff1a;本…...

[Collection与数据结构] B树与B+树

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…...

Ubuntu 24.04 安装 NVIDIA Container Toolkit 全指南:让Docker拥抱GPU

Ubuntu 24.04 安装 NVIDIA Container Toolkit 全指南&#xff1a;让Docker拥抱GPU 前言一、环境准备1.1 验证驱动状态 二、安装NVIDIA Container Toolkit2.1 添加官方仓库2.2 执行安装 三、配置Docker运行时3.1 更新Docker配置 四、验证安装结果4.1 运行测试容器 五、实战应用 …...

17.Word:李楠-学术期刊❗【29】

目录 题目​ NO1.2.3.4.5 NO6.7.8 NO9.10.11 NO12.13.14.15 NO16 题目 NO1.2.3.4.5 另存为手动/F12Fn光标来到开头位置处→插入→封面→选择花丝→根据样例图片&#xff0c;对应位置填入对应文字 (手动调整即可&#xff09;复制样式&#xff1a;开始→样式对话框→管理…...

图漾相机——C++语言属性设置

文章目录 前言1.SDK API功能介绍1.1 Device组件下的API测试1.1.1 相机工作模式设置&#xff08;TY_TRIGGER_PARAM_EX&#xff09;1.1.2 TY_INT_FRAME_PER_TRIGGER1.1.3 TY_INT_PACKET_DELAY1.1.4 TY_INT_PACKET_SIZE1.1.5 TY_BOOL_GVSP_RESEND1.1.6 TY_BOOL_TRIGGER_OUT_IO1.1.…...

【性能优化专题系列】利用CompletableFuture优化多接口调用场景下的性能

背景说明 在实际的软件开发中&#xff0c;我们经常会遇到需要批量调用接口的场景。例如&#xff0c;电商系统在生成商品详情页时&#xff0c;需要同时调用多个服务接口来获取商品的基本信息、库存信息、价格信息、用户评价等。 传统的依次调用方式存在性能问题 面对上述场景…...

docker安装emqx

emqx安装 拉取emqx镜像 docker pull emqx/emqx:v4.1.0 运行docker容器 docker run -tid --name emqx -p 1883:1883 -p 8083:8083 -p 8081:8081 -p 8883:8883 -p 8084:8084 -p 18083:18083 emqx/emqx:v4.1.0 放行端口 1、如果要是自己的虚拟机&#xff0c;并且关闭了防火墙&a…...

DeepSeek超越ChatGPT的能力及部分核心原理

DeepSeek超越ChatGPT的能力及部分核心原理 目录 DeepSeek超越ChatGPT的能力及部分核心原理超越ChatGPT的能力核心原理超越ChatGPT的能力 推理计算能力更强:在复杂的数学计算、法律文件审查等任务中,DeepSeek的推理能力可媲美甚至超越部分国际顶尖AI模型,包括ChatGPT。例如在…...

Leetcode 3434. Maximum Frequency After Subarray Operation

Leetcode 3434. Maximum Frequency After Subarray Operation 1. 解题思路2. 代码实现 题目链接&#xff1a;3434. Maximum Frequency After Subarray Operation 1. 解题思路 这一题的话我们只需要考察所有的数 i i i转换为 k k k时所能够形成的最大的值。 而对于这个问题&…...

《DeepSeek-R1 问世,智能搜索领域迎来新变革》

DeepSeek-R1是由DeepSeek公司开发的一款创新型人工智能模型&#xff0c;自2024年5月7日发布以来&#xff0c;迅速在AI领域引起广泛关注。该模型凭借其卓越的语言理解能力、高效的数据处理能力、自适应学习能力、高安全性与可靠性以及广泛的应用场景与拓展性&#xff0c;在众多人…...

GEE | 植被总初级生产力GPP的时间变化特征

同学们好&#xff0c;这期我们分享的是植被总初级生产力GPP的日、月、生长季和年变化趋势代码。我们选用的数据集是MODIS/061/MOD17A2HGF&#xff0c;该产品时间跨度为2000-至今&#xff0c;空间分辨率500米&#xff0c;时间分辨率8天。 其中我们把生长季时间设置为了5-9月份&…...

安卓(android)饭堂广播【Android移动开发基础案例教程(第2版)黑马程序员】

一、实验目的&#xff08;如果代码有错漏&#xff0c;可查看源码&#xff09; 1.熟悉广播机制的实现流程。 2.掌握广播接收者的创建方式。 3.掌握广播的类型以及自定义官博的创建。 二、实验条件 熟悉广播机制、广播接收者的概念、广播接收者的创建方式、自定广播实现方式以及有…...

本地部署DeepSeek

1、打开ollama,点击“Download” Ollamahttps://ollama.com/ 2、下载完成后&#xff0c;安装ollama.exe 3、安装完成后&#xff0c;按"windowsR",输入"cmd” 4、输入“ollama -v”&#xff0c;查看版本&#xff0c;表示安装成功 5、返回ollama网页&#xff0c…...

赛博算卦之周易六十四卦JAVA实现:六幺算尽天下事,梅花化解天下苦。

佬们过年好呀~新年第一篇博客让我们来场赛博算命吧&#xff01; 更多文章&#xff1a;个人主页 系列文章&#xff1a;JAVA专栏 欢迎各位大佬来访哦~互三必回&#xff01;&#xff01;&#xff01; 文章目录 #一、文化背景概述1.文化起源2.起卦步骤 #二、卦象解读#三、just do i…...

Hive:窗口函数(1)

窗口函数 窗口函数OVER()用于定义一个窗口&#xff0c;该窗口指定了函数应用的数据范围 对窗口数据进行分区 partition by 必须和over () 一起使用, distribute by经常和sort by 一起使用,可以不和over() 一起使用.DISTRIBUTE BY决定了数据如何分布到不同的Reducer上&#xf…...

docker安装nacos2.2.4详解(含:nacos容器启动参数、环境变量、常见问题整理)

一、镜像下载 1、在线下载 在一台能连外网的linux上执行docker镜像拉取命令 docker pull nacos:2.2.4 2、离线包下载 两种方式&#xff1a; 方式一&#xff1a; -&#xff09;在一台能连外网的linux上安装docker执行第一步的命令下载镜像 -&#xff09;导出 # 导出镜像到…...

基于PLC的变频调速系统设计

摘要 现代科技发展迅速&#xff0c;特别是通讯技术的发展&#xff0c;工业现场提供了便捷的数据交互和控制的手段&#xff0c;将工业现场的仪表、驱动器、控制器以及上位机之间进行通讯连接&#xff0c;进行相互信息交互&#xff0c;数据准确高效的传送&#xff0c;并且对现场的…...