常用的数据结构——栈
目录
1、入栈
2、出栈
3、获取栈顶的元素
4、从栈中查找元素
栈是一种常见的数据结构,栈的特点是后进先出,就像我们叠盘子,拿走上面的盘子才能拿到下一个。java中的栈java.util.Stack是通过java.util.Vector实现的,所以底层都是数组,并且是线程安全的。
接下来,我们通过数组来实现一个简单的栈
首先,栈Stack中应该有以下几个方法:
- 入栈(压栈):push()
- 出栈:pop()
- 取栈顶元素:peek()
- 从栈中查找某个元素:search()
首先我们先描绘一下栈的基本结构,使用一个数组保存栈中所有对象,还要保存数组的长度。
package stack;import java.util.Arrays;/*** @author heyunlin* @version 1.0*/
public class Stack<E> {private E[] data;private int length;public Stack() {}public boolean isEmpty() {return data == null || data.length == 0;}@Overridepublic String toString() {return Arrays.toString(data);}}
1、入栈
入栈就是把元素放到栈中,然后要让栈的长度+1,初始时栈为空,需要实例化。
但是这个过程中,遇到一点问题,因为栈的元素类型E需要运行时才能确定,不能直接通过new E[]的方式实例化。这时候想到:所有自定义的类都默认继承自我们的顶级超类java.lang.Object,那就可以创建一个Object类型的空数组,再强转成E[]类型,这样就相当于创建了一个E类型的空数组。实现的代码如下
public synchronized E push(E e) {if (isEmpty()) {Object[] array = new Object[1];data = (E[]) array;data[0] = e;length = 1;} else {length ++;// 数组扩容data = Arrays.copyOf(data, length);// 把元素放到数组最后一个下标的位置data[length - 1] = e;}return data[length - 1];
}
2、出栈
出栈,就是删除并返回栈顶的元素
这个比较简单,直接贴上代码
public synchronized E pop() {if (isEmpty()) {throw new RuntimeException("出栈失败,当前栈为空~");}// 取栈顶元素E top = data[length - 1];length --;// 数组长度减1data = Arrays.copyOf(data, length);return top;
}
3、获取栈顶的元素
这个方法最简单,直接获取数组中最后一个元素就行了
public E peek() {if (isEmpty()) {throw new RuntimeException("获取栈顶元素失败,当前栈为空~");}return data[length - 1];
}
4、从栈中查找元素的位置
使用该方法前,请确保E.java中重写了equals()方法
public int search(E target) {int index = -1;for (int i = 0; i < data.length; i++) {if (data[i] == target) {index = i;}}return index;
}
最后,贴上完整的代码
package stack;import java.util.Arrays;/*** @author heyunlin* @version 1.0*/
public class Stack<E> {private E[] data;private int length;public Stack() {}/*** 入栈/压栈* @param e E* @return E*/public synchronized E push(E e) {if (isEmpty()) {Object[] array = new Object[1];data = (E[]) array;data[0] = e;length = 1;} else {length++;// 数组扩容data = Arrays.copyOf(data, length);// 把元素放到数组最后一个下标的位置data[length - 1] = e;}return data[length - 1];}/*** 出栈* @return E*/public synchronized E pop() {E top = peek();length --;data = Arrays.copyOf(data, length);return top;}/*** 取栈顶元素* @return E*/public E peek() {if (isEmpty()) {throw new RuntimeException("获取栈顶元素失败,当前栈为空~");}return data[length - 1];}public boolean isEmpty() {return data == null || data.length == 0;}/*** 查找对象在栈中的位置* @param target E* @return int*/public int search(E target) {int index = -1;for (int i = 0; i < data.length; i++) {E element = data[i];if (target == null && element == null || element.equals(target)) {index = i;}}return index;}@Overridepublic String toString() {return Arrays.toString(data);}}
最后,我们新建一个demo来测试一下刚刚写的Stack
package stack;/*** @author heyunlin* @version 1.0*/
public class StackExample {public static void main(String[] args) {Stack<String> stack = new Stack<>();stack.push("a");stack.push("b");stack.push("c");stack.push("d");stack.push("e");System.out.println(stack.push("f"));System.out.println(stack);String pop = stack.pop();System.out.println(pop);System.out.println(stack);}}
好了,如果本篇文章对你有所帮助,不要忘了点赞、收藏哦~
相关文章:
常用的数据结构——栈
目录 1、入栈 2、出栈 3、获取栈顶的元素 4、从栈中查找元素 栈是一种常见的数据结构,栈的特点是后进先出,就像我们叠盘子,拿走上面的盘子才能拿到下一个。java中的栈java.util.Stack是通过java.util.Vector实现的,所以底层都…...
C++完成淄博烧烤节管理系统
背景: 这次我们结合今年淄博烧烤做一个餐厅管理系统,具体需求如下,我们选择的是餐饮商家信息管理 问题描述: 淄博烧烤今年大火,“进淄赶烤”是大家最想干的事情,淄博烧烤大火特火的原因,火的…...
我心中的TOP1编程语言
目录 一、评选最佳编程语言时需要考虑哪些标准 (一)易用性 (二)执行效率 (三)语言功能特性 (四)工具生态环境 (五)开发者社区 二、不同编程语言的优点…...
Linux工具之gdb(含移植到arm-linux系统)
文章目录 文件目录结构移植ncurses库移植gdb移植到arm板调试测试 linux主机:ubuntu-18.04 交叉编译器:arm-buildroot-linux-gnueabihf 开发板kernel:Linux 5.4.0-150-generic x86_64 开发板:100ASK_STM32MP157_PRO开发板 arm-…...
DolphinScheduler
参考 Apache DolphinScheduler v1.3.9 使用手册 内置组件 masterserverworkserverzookeepertask queuealertapiui 设计 去中心化设计 通过zk选举 UI功能 队列管理 Yarn调度器的资源队列 用户管理 租户对应的是Linux系统用户,是Worker执行任务使用的用户 用户…...
10大白帽黑客专用的 Linux 操作系统
平时在影视里见到的黑客都是一顿操作猛如虎,到底他们用的都是啥系统呢? 今天给大家分享十个白帽黑客专用的Linux操作系统。 ▍1. Kali Linux Kali Linux是最著名的Linux发行版,用于道德黑客和渗透测试。Kali Linux由Offensive Security开发&…...
Golang每日一练(leetDay0099) 单词规律I\II Word Pattern
目录 290. 单词规律 Word Pattern 🌟 291. 单词规律 II Word Pattern ii 🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 …...
linux_centos7.9/ubuntu20.04_下载镜像及百度网盘分享链接
1、镜像下载站点 网易开源镜像:http://mirrors.163.com/ 搜狐开源镜像:http://mirrors.sohu.com/ 阿里开源镜像:https://developer.aliyun.com/mirror/ 首都在线科技股份有限公司:http://mirrors.yun-idc.com/ 常州贝特康姆软件技…...
Reqable HTTP一站式开发+调试工具(小黄鸟作者另一力作、小黄鸟完美替代品)
本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!Reqable HTTP一站式开发+调试工具(小黄鸟作者另一力作、小黄鸟替代品) 环境 win10pixel4Android13概览 …...
Yacc 与 Lex 快速入门
Yacc 与 Lex 快速入门 简介: Lex 和 Yacc 是 UNIX 两个非常重要的、功能强大的工具。事实上, 如果你熟练掌握 Lex 和 Yacc 的话,它们的强大功能使创建 FORTRAN 和 C 的编译器如同儿戏。本文详细的讨论了编写自己的语言和编译器所 用到的这两…...
【开源与项目实战:开源实战】80 | 开源实战二(下):从Unix开源开发学习应对大型复杂项目开发
上两节课,我们分别从代码编写、研发管理的角度,学习了如何应对大型复杂软件开发。在研发管理这一部分,我们又讲到比较重要的几点,它们分别是编码规范、单元测试、持续重构和 Code Review。其中,前三点在专栏的理论部分…...
【单周期CPU】LoongArch | 立即数扩展模块Ext | 32位算术逻辑运算单元(ALU)
前言:本章内容主要是演示在vivado下利用Verilog语言进行单周期简易CPU的设计。一步一步自己实现模型机的设计。本章先介绍单周期简易CPU中基本组合逻辑部件的设计。 💻环境:一台内存4GB以上,装有64位Windows操作系统和Vivado 201…...
Python实现数据结构的基础操作
目录 一、列表(List) 二、字典(Dictionary) 三、集合(Set) 四、链表的实现 五、队列和栈 数据结构是计算机科学中非常重要的概念,它用于存储和组织数据以便有效地进行操作。Python作为一种…...
20230624----重返学习-vue-响应式处理思路-仿源码
day-098-ninety-eight-20230624-vue-响应式处理思路-仿源码 vue vue大体概念 Vue是渐进式框架 所谓渐进式框架,就是把一套全面的框架设计体系,拆分成为多个框架,项目中需要用到那些需求,再导入对应的框架,以此来保证…...
【MongoDB】三、使用Java连接MongoDB
【MongoDB】三、使用Java连接MongoDB 实验目的实验内容练习1、开启Eclipse,创建Java Project项目,命名为Mongo12、添加项目依赖的jar包3、创建类MongoDemo4、连接数据库5、查看集合6、创建集合7、删除集合8、查看文档9、插入文档10、更新文档11、删除文档…...
【C++】通讯录的基本实现,附有源码分享
目录 1、运行环境 2、系统实现功能 2.1菜单功能 2.2退出通讯录功能 2.3添加联系人功能 2.4显示联系人功能 2.5删除联系人功能 2.6查找联系人功能 2.7修改联系人功能 2.8清空联系人功能 2.9动态扩容功能 2.10选择优化功能 2.11文件操作 3、源码分享 1、运行环境 …...
UI 自动化测试 —— selenium的简单介绍和使用
selenium 是 web 应用中基于 UI 的自动化测试框架,支持多平台、多浏览器、多语言。 提到 UI 自动化就先了解什么是自动化测试? 目录 1. 自动化测试 2. UI 自动化 2.1 UI 自动化的特点 2.2 UI 自动化测试的优缺点 2.3 UI 自动化测试的使用对象 2.4…...
mybatisPlus中apply的使用以进行联表等复杂sql语句
在 MyBatis-Plus 中,apply() 方法可以用于添加任意的 SQL 片段,包括联表查询。因此,你可以使用 apply() 方法来处理各种类型的联表查询。 使用 apply() 方法的好处是可以在查询条件中直接添加原生的 SQL 片段,而不受 MyBatis-Plu…...
自学Python技术的方法
目录 一、Python技术介绍 二、学习前的准备工作 三、学习时的具体操作 四、如何巩固学习 Python是一种高级编程语言,被广泛用于软件开发、数据分析、人工智能和科学计算等领域。它于1991年由Guido van Rossum创建,并且其简洁、易读的语法以及丰富的标…...
python熟悉python基础语法,了解html网络结构,了解json格式数据,含有字符串
前言 Python网络爬虫是利用Python编写的程序,通过自动化地访问网页、解析html或json数据,并提取所需信息的技术。下面将详细介绍一些与Python网络爬虫相关的重要知识点。 1、Python基础语法: 变量和数据类型:学习如何声明变量以及…...
深入解析STM32F103的USB Mass Storage实现:SCSI命令实战指南
1. USB Mass Storage基础概念与STM32F103适配 在嵌入式系统开发中,实现USB Mass Storage功能是让设备被识别为U盘的关键技术。STM32F103系列作为经典的Cortex-M3内核微控制器,其内置的USB外设为这一功能提供了硬件基础。这里有个常见的误解:很…...
告别药物研发效率困境:用REINVENT4实现智能分子设计范式突破
告别药物研发效率困境:用REINVENT4实现智能分子设计范式突破 【免费下载链接】REINVENT4 AI molecular design tool for de novo design, scaffold hopping, R-group replacement, linker design and molecule optimization. 项目地址: https://gitcode.com/gh_mi…...
CUTLASS架构解密:大规模矩阵乘法优化的工程实践
CUTLASS架构解密:大规模矩阵乘法优化的工程实践 【免费下载链接】cutlass CUDA Templates and Python DSLs for High-Performance Linear Algebra 项目地址: https://gitcode.com/GitHub_Trending/cu/cutlass 现实挑战:GPU矩阵计算中的性能瓶颈与…...
【西瓜带你学设计模式 | 第十二期 - 装饰器模式】装饰器模式 —— 动态叠加功能实现、优缺点与适用场景
文章目录前言1. 装饰器模式是什么?2. 装饰器模式解决什么问题?3. 实现步骤4. 静态结构4.1 抽象组件:Coffee(统一接口)4.2 具体组件:SimpleCoffee(基础咖啡)4.3 装饰器抽象类…...
ECU-TEST实战:如何用TCF文件高效管理DBC、A2L、ODX等测试描述文件?
ECU-TEST实战:TCF文件高效管理DBC、A2L、ODX的工程化实践 当测试用例从实验室走向产线,从单一车型扩展到多平台变体,DBC、A2L、ODX等描述文件的版本管理往往成为效率瓶颈。某新能源车企的测试团队曾统计,工程师平均每天要切换7次不…...
如何将B站碎片化缓存视频合并为完整MP4?这个Android工具给你答案
如何将B站碎片化缓存视频合并为完整MP4?这个Android工具给你答案 【免费下载链接】BilibiliCacheVideoMerge 项目地址: https://gitcode.com/gh_mirrors/bi/BilibiliCacheVideoMerge 想象一下这样的场景:你在地铁上打开手机,准备观看…...
解锁FNF-PsychEngine创作潜力:从核心功能到高级开发的完整指南
解锁FNF-PsychEngine创作潜力:从核心功能到高级开发的完整指南 【免费下载链接】FNF-PsychEngine Engine originally used on Mind Games mod 项目地址: https://gitcode.com/gh_mirrors/fn/FNF-PsychEngine FNF-PsychEngine是一款基于Haxe语言开发的开源节奏…...
Windows用户也能玩转Luckfox Pico:从驱动安装到ADB配置全攻略
Windows用户玩转Luckfox Pico:从驱动安装到ADB配置实战指南 对于习惯了Windows环境的开发者来说,初次接触Luckfox Pico这类嵌入式开发板时,往往会遇到各种跨平台适配问题。本文将手把手带你解决Windows系统下的驱动安装、ADB配置等核心痛点&…...
告别官方软件臃肿:惠普暗影精灵笔记本的纯净性能管家OmenSuperHub
告别官方软件臃肿:惠普暗影精灵笔记本的纯净性能管家OmenSuperHub 【免费下载链接】OmenSuperHub 使用 WMI BIOS控制性能和风扇速度,自动解除DB功耗限制。 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否曾经因为惠普Omen Gam…...
Sunshine终极指南:5步搭建免费游戏串流服务器
Sunshine终极指南:5步搭建免费游戏串流服务器 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 想要在任何设备上畅玩PC游戏?Sunshine作为一款开源的自托管游…...
