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

常用的数据结构——栈

目录

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、从栈中查找元素 栈是一种常见的数据结构&#xff0c;栈的特点是后进先出&#xff0c;就像我们叠盘子&#xff0c;拿走上面的盘子才能拿到下一个。java中的栈java.util.Stack是通过java.util.Vector实现的&#xff0c;所以底层都…...

C++完成淄博烧烤节管理系统

背景&#xff1a; 这次我们结合今年淄博烧烤做一个餐厅管理系统&#xff0c;具体需求如下&#xff0c;我们选择的是餐饮商家信息管理 问题描述&#xff1a; 淄博烧烤今年大火&#xff0c;“进淄赶烤”是大家最想干的事情&#xff0c;淄博烧烤大火特火的原因&#xff0c;火的…...

我心中的TOP1编程语言

目录 一、评选最佳编程语言时需要考虑哪些标准 &#xff08;一&#xff09;易用性 &#xff08;二&#xff09;执行效率 &#xff08;三&#xff09;语言功能特性 &#xff08;四&#xff09;工具生态环境 &#xff08;五&#xff09;开发者社区 二、不同编程语言的优点…...

Linux工具之gdb(含移植到arm-linux系统)

文章目录 文件目录结构移植ncurses库移植gdb移植到arm板调试测试 linux主机&#xff1a;ubuntu-18.04 交叉编译器&#xff1a;arm-buildroot-linux-gnueabihf 开发板kernel&#xff1a;Linux 5.4.0-150-generic x86_64 开发板&#xff1a;100ASK_STM32MP157_PRO开发板 arm-…...

DolphinScheduler

参考 Apache DolphinScheduler v1.3.9 使用手册 内置组件 masterserverworkserverzookeepertask queuealertapiui 设计 去中心化设计 通过zk选举 UI功能 队列管理 Yarn调度器的资源队列 用户管理 租户对应的是Linux系统用户&#xff0c;是Worker执行任务使用的用户 用户…...

10大白帽黑客专用的 Linux 操作系统

平时在影视里见到的黑客都是一顿操作猛如虎&#xff0c;到底他们用的都是啥系统呢&#xff1f; 今天给大家分享十个白帽黑客专用的Linux操作系统。 ▍1. Kali Linux Kali Linux是最著名的Linux发行版&#xff0c;用于道德黑客和渗透测试。Kali Linux由Offensive Security开发&…...

Golang每日一练(leetDay0099) 单词规律I\II Word Pattern

目录 290. 单词规律 Word Pattern &#x1f31f;  291. 单词规律 II Word Pattern ii &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 …...

linux_centos7.9/ubuntu20.04_下载镜像及百度网盘分享链接

1、镜像下载站点 网易开源镜像&#xff1a;http://mirrors.163.com/ 搜狐开源镜像&#xff1a;http://mirrors.sohu.com/ 阿里开源镜像&#xff1a;https://developer.aliyun.com/mirror/ 首都在线科技股份有限公司&#xff1a;http://mirrors.yun-idc.com/ 常州贝特康姆软件技…...

Reqable HTTP一站式开发+调试工具(小黄鸟作者另一力作、小黄鸟完美替代品)

本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!Reqable HTTP一站式开发+调试工具(小黄鸟作者另一力作、小黄鸟替代品) 环境 win10pixel4Android13概览 …...

Yacc 与 Lex 快速入门

Yacc 与 Lex 快速入门 简介&#xff1a; Lex 和 Yacc 是 UNIX 两个非常重要的、功能强大的工具。事实上&#xff0c; 如果你熟练掌握 Lex 和 Yacc 的话&#xff0c;它们的强大功能使创建 FORTRAN 和 C 的编译器如同儿戏。本文详细的讨论了编写自己的语言和编译器所 用到的这两…...

【开源与项目实战:开源实战】80 | 开源实战二(下):从Unix开源开发学习应对大型复杂项目开发

上两节课&#xff0c;我们分别从代码编写、研发管理的角度&#xff0c;学习了如何应对大型复杂软件开发。在研发管理这一部分&#xff0c;我们又讲到比较重要的几点&#xff0c;它们分别是编码规范、单元测试、持续重构和 Code Review。其中&#xff0c;前三点在专栏的理论部分…...

【单周期CPU】LoongArch | 立即数扩展模块Ext | 32位算术逻辑运算单元(ALU)

前言&#xff1a;本章内容主要是演示在vivado下利用Verilog语言进行单周期简易CPU的设计。一步一步自己实现模型机的设计。本章先介绍单周期简易CPU中基本组合逻辑部件的设计。 &#x1f4bb;环境&#xff1a;一台内存4GB以上&#xff0c;装有64位Windows操作系统和Vivado 201…...

Python实现数据结构的基础操作

目录 一、列表&#xff08;List&#xff09; 二、字典&#xff08;Dictionary&#xff09; 三、集合&#xff08;Set&#xff09; 四、链表的实现 五、队列和栈 数据结构是计算机科学中非常重要的概念&#xff0c;它用于存储和组织数据以便有效地进行操作。Python作为一种…...

20230624----重返学习-vue-响应式处理思路-仿源码

day-098-ninety-eight-20230624-vue-响应式处理思路-仿源码 vue vue大体概念 Vue是渐进式框架 所谓渐进式框架&#xff0c;就是把一套全面的框架设计体系&#xff0c;拆分成为多个框架&#xff0c;项目中需要用到那些需求&#xff0c;再导入对应的框架&#xff0c;以此来保证…...

【MongoDB】三、使用Java连接MongoDB

【MongoDB】三、使用Java连接MongoDB 实验目的实验内容练习1、开启Eclipse&#xff0c;创建Java Project项目&#xff0c;命名为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 的自动化测试框架&#xff0c;支持多平台、多浏览器、多语言。 提到 UI 自动化就先了解什么是自动化测试&#xff1f; 目录 1. 自动化测试 2. UI 自动化 2.1 UI 自动化的特点 2.2 UI 自动化测试的优缺点 2.3 UI 自动化测试的使用对象 2.4…...

mybatisPlus中apply的使用以进行联表等复杂sql语句

在 MyBatis-Plus 中&#xff0c;apply() 方法可以用于添加任意的 SQL 片段&#xff0c;包括联表查询。因此&#xff0c;你可以使用 apply() 方法来处理各种类型的联表查询。 使用 apply() 方法的好处是可以在查询条件中直接添加原生的 SQL 片段&#xff0c;而不受 MyBatis-Plu…...

自学Python技术的方法

目录 一、Python技术介绍 二、学习前的准备工作 三、学习时的具体操作 四、如何巩固学习 Python是一种高级编程语言&#xff0c;被广泛用于软件开发、数据分析、人工智能和科学计算等领域。它于1991年由Guido van Rossum创建&#xff0c;并且其简洁、易读的语法以及丰富的标…...

python熟悉python基础语法,了解html网络结构,了解json格式数据,含有字符串

前言 Python网络爬虫是利用Python编写的程序&#xff0c;通过自动化地访问网页、解析html或json数据&#xff0c;并提取所需信息的技术。下面将详细介绍一些与Python网络爬虫相关的重要知识点。 1、Python基础语法&#xff1a; 变量和数据类型&#xff1a;学习如何声明变量以及…...

linux mail -s发送邮件异常解决

异常&#xff1a; Error initializing NSS: Unknown error -8015. "/root/dead.letter" 11/301 . . . message not sent. 出现此问题&#xff0c;大概率是和证书相关。如果没有安装证书&#xff0c;请先安装&#xff1a; 1&#xff0c;下载 yum -y install mailx …...

Netty核心技术七--Google Protobuf

1.编码和解码的基本介绍 编写网络应用程序时&#xff0c;因为数据在网络中传输的都是二进制字节码数据&#xff0c;在发送数据时就需要编码&#xff0c;接收数据时就需要解码 codec(编解码器) 的组成部分有两个&#xff1a;decoder(解码器)和encoder(编码器)。encoder 负责把…...

【Docker】Docker常用命令总结

文章目录 一、帮助命令二、镜像命令三、容器命令四、常用的其他命令 在开发过程中&#xff0c;经常涉及到 docker 的相关操作&#xff0c;本文对常用的指令进行汇总。 一、帮助命令 docker version # 显示docker版本信息 docker info # 显示docker系统信息&#xff…...

React 对比class与Effect Hook优化响应式数据更新监听,感受useEffect真正的强大

还是之前写过的一个组件 import React from "react"export default class index extends React.Component{constructor(props){super(props);this.state {name: "小猫猫"}}componentDidMount ()>{document.title this.state.name;}componentDidUpda…...

AWS Lambda 介绍

计算服务的演进 EC2------Container-------Lambda 虚拟机---容器--------------serverless无服务器架构 什么是AWS Lambda&#xff1f; AWS lambda的核心是事件驱动&#xff0c;驱动可能来自&#xff0c;Alexa,SNS&#xff0c;DynamoDB&#xff0c;S3&#xff0c;Kinesis等&…...

linux之权限管理

目录 1.一.基本小语句 2.文件权限操作chmod 1.一.基本小语句 ls - a 查看此文件夹所有和隐藏内容 ls - l 查看此文件夹权限 chown 改变文所有者 2.文件权限操作chmod chmod 参数 文件名 文件的权限主要针对三类对象进行定义   owner 属主, u:针对前三个部分的权限修改   …...

【设计模式与范式:行为型】61 | 策略模式(下):如何实现一个支持给不同大小文件排序的小程序?

上一节课&#xff0c;我们主要介绍了策略模式的原理和实现&#xff0c;以及如何利用策略模式来移除 if-else 或者 switch-case 分支判断逻辑。今天&#xff0c;我们结合“给文件排序”这样一个具体的例子&#xff0c;来详细讲一讲策略模式的设计意图和应用场景。 除此之外&…...

【C++】auto_ptr为何被唾弃?以及其他智能指针的学习

搭配异常可以让异常的代码更简洁 文章目录 智能指针 内存泄漏的危害 1.auto_ptr(非常不建议使用) 2.unique_ptr 3.shared_ptr 4.weak_ptr总结 智能指针 C中为什么会需要智能指针呢&#xff1f;下面我们看一下样例&#xff1a; int div() {int a, b;cin >&g…...

数据结构练习题1:基本概念

练习题1&#xff1a;基本概念 1 抽象数据类型概念分析2. 逻辑结构与存储结构概念分析3.综合选择题4.综合判断题5.时间复杂度相关习题6 时间复杂度计算方法&#xff08;一、二、三层循环&#xff09; 1 抽象数据类型概念分析 1.可以用&#xff08;抽象数据类型&#xff09;定义…...

如何消除Msxml2.XMLHTTP组件的缓存

之前使用这个组件&#xff0c;是每隔十分钟取数据&#xff0c;没有遇到这个缓存问题&#xff0c; 这次使用它是频繁访问接口&#xff0c;就出现了一直不变的问题。觉得是缓存没有清除的问题。 网上搜了一些方案。最好的方案就是给url地址末尾给一个随机参数。用于让组件觉得是…...

网站没有内容 备案能成功吗/关联词有哪些三年级

HTTP 模块 http 核心模块之一: 用于搭建HTTP 服务器:开启服务器: 1: 导入http 模块 var http require(http);2: 使用http 这个模块中的createServer() 创建一个服务器实例对象。 var server http.createServer();为服务器绑定一个事件 server.on(request, function(res, da…...

货运 东莞网站建设/整合营销传播的概念

为什么写这篇文章? 博主有两位朋友分别是小A和小B: 小A&#xff0c;工作于传统软件行业(某社保局的软件外包公司)&#xff0c;每天工作内容就是和产品聊聊需求&#xff0c;改改业务逻辑。再不然就是和运营聊聊天&#xff0c;写几个SQL&#xff0c;生成下报表。又或者接到客服…...

html做的小网站/哪个浏览器不屏蔽网站

在Silverlight中的MVVM模式下将前台页面和ViewModel界面交互分离开是通过本节所要讲述的Command实现的。我们自定义一个Command需要继承于ICommand接口并且实现这个接口。它有CanExecute()、Execute()方法和CanExecuteChanged事件组成。 CanExecute()&#xff1a;判断是否继续执…...

在印尼用哪个网站做电商/百度搜索下载app

MVC(Model View Controller)模型(model)&#xff0d;视图(view)&#xff0d;控制器(controller)&#xff1a;MVC本来是存在于Desktop程序中的&#xff0c;M是指数据模型&#xff0c;V是指用户界面&#xff0c;C则是控制器。使用MVC是将M和V的实现代码分离&#xff0c;从而使同一…...

深圳 三人 网站建设/seo的全称是什么

被蓝桥杯Python侮辱之后&#xff0c;决定转路C 初识输入输出 //这是一个关于输入输出的程序 //首先头文件要放在前面 #include<iostream>int main(){std:: cout<<"Enter two numbers"<<std::endl;//输出运算符 <<//输出运算符左边的变量必须…...

主播网站怎么建立/网上如何做广告

原标题&#xff1a;盘点吃鸡性能最好的4款安卓手机&#xff0c;黑鲨只能垫底随着科技的发展&#xff0c;现在的手机是越来越不错了&#xff0c;大家最喜欢的是哪款手机呢&#xff1f;相信许多的男网友都会选择性能比较好的手机吧&#xff0c;判断一款手机性能好不好&#xff0c…...