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

【数据结构】Java实现栈

目录

1. 概念

2. 栈的使用 

3. 自己动手实现栈(使用动态数组实现栈) 

1. 创建一个MyStack类

2. push入栈

3. pop出栈

4. 查看栈顶元素

5. 判断栈是否为空与获取栈长

6. toString方法

4. 整体实现

4.1 MyStack类

4.2 Test类

4.3 测试结果


1. 概念

:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈 顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶
出栈:栈的删除操作叫做出栈。出数据在栈顶

2. 栈的使用 

public static void main(String[] args) {Stack<Integer> stack = new Stack<>();
//        将e入栈,并返回estack.push(1);stack.push(2);stack.push(3);stack.push(4);stack.push(5);
//        将栈顶元素出栈并返回System.out.println(stack.pop());
//        获取栈顶元素System.out.println(stack.peek());
//        检测栈是否为空System.out.println(stack.empty());
//        获取栈中有效元素个数System.out.println(stack.size());System.out.println(stack);}

3. 自己动手实现栈(使用动态数组实现栈) 

1. 创建一个MyStack类

思路图:

import java.util.Arrays;
import java.util.NoSuchElementException;
//使用泛型
public class MyStack<E> {private Object[] data;private int size;public MyStack(int capacity){this.data = new Object[capacity];}public MyStack(){this.data = new Object[10];}}

2. push入栈

public E push(E val){data[size ++] = val;if(size == data.length){data = Arrays.copyOf(data,data.length<<1);}return val;}

3. pop出栈

public E pop(){if (isEmpty()){throw new NoSuchElementException("stack is empy,cannot pop!");}E oldVal = (E)data[size - 1];size --;return oldVal;}

4. 查看栈顶元素

public E peek(){if (isEmpty()){throw new NoSuchElementException("stack is empy,cannot peek!");}return (E)data[size - 1];}

5. 判断栈是否为空与获取栈长

public boolean isEmpty() {return size == 0;}public int size(){return size;}

6. toString方法

public String toString() {StringBuilder sb = new StringBuilder();sb.append("bottom [");for (int i = 0; i < size; i++) {sb.append(data[i]);if(i < size - 1){sb.append(",");}}sb.append("] top");return sb.toString();}

4. 整体实现

4.1 MyStack类

package seqlist.stack_queue;import java.util.Arrays;
import java.util.NoSuchElementException;public class MyStack<E> {private Object[] data;private int size;public MyStack(int capacity){this.data = new Object[capacity];}public MyStack(){this.data = new Object[10];}public E push(E val){data[size ++] = val;if(size == data.length){data = Arrays.copyOf(data,data.length<<1);}return val;}public boolean isEmpty() {return size == 0;}public int size(){return size;}public E pop(){if (isEmpty()){throw new NoSuchElementException("stack is empy,cannot pop!");}E oldVal = (E)data[size - 1];size --;return oldVal;}public E peek(){if (isEmpty()){throw new NoSuchElementException("stack is empy,cannot peek!");}return (E)data[size - 1];}@Overridepublic String toString() {StringBuilder sb = new StringBuilder();sb.append("bottom [");for (int i = 0; i < size; i++) {sb.append(data[i]);if(i < size - 1){sb.append(",");}}sb.append("] top");return sb.toString();}
}

4.2 Test类

public static void main(String[] args) {MyStack<Integer> stack = new MyStack<>();
//        将e入栈,并返回estack.push(1);stack.push(2);stack.push(3);stack.push(4);stack.push(5);System.out.println("将栈顶元素出栈并返回");System.out.println(stack.pop());System.out.println("获取栈顶元素");System.out.println(stack.peek());System.out.println("检测栈是否为空");System.out.println(stack.isEmpty());System.out.println("获取栈中有效元素个数");System.out.println(stack.size());System.out.println(stack);}

4.3 测试结果

 【例题】一个栈的入栈序列为ABCDE,则不可能的出栈序列为( )

        A. ABCDE

        B. EDCBA

        C. DCEBA

        D. ECDBA

稳妥的做法是画图逐个选项检测,大概率是不会出错的,

如果是E先出,说明ABCDE都已经全部入栈,E出栈之后,此时栈顶元素是D,如果再要出栈应该是D,而不应该是C。故应该选择D。

相关文章:

【数据结构】Java实现栈

目录 1. 概念 2. 栈的使用 3. 自己动手实现栈&#xff08;使用动态数组实现栈&#xff09; 1. 创建一个MyStack类 2. push入栈 3. pop出栈 4. 查看栈顶元素 5. 判断栈是否为空与获取栈长 6. toString方法 4. 整体实现 4.1 MyStack类 4.2 Test类 4.3 测试结果 1.…...

【数据结构】排序

作者&#xff1a;✿✿ xxxflower. ✿✿ 博客主页&#xff1a;xxxflower的博客 专栏&#xff1a;【数据结构】篇 语录&#xff1a;⭐每一个不曾起舞的日子&#xff0c;都是对生命的辜负。⭐ 文章目录1.排序1.1排序的概念1.2常见的排序算法2.常见排序算法2.1插入排序2.1.1直接插入…...

过拟合、验证集、交叉验证

过拟合 简单描述&#xff1a;训练集误差小&#xff0c;测试集误差大&#xff0c;模型评估指标的方差&#xff08;variance&#xff09;较大&#xff1b; 判断方式&#xff1a; 1、观察 train set 和 test set 的误差随着训练样本数量的变化曲线。 2、通过training accuracy 和…...

原力计划来了【协作共赢 成就未来】

catalogue&#x1f31f; 写在前面&#x1f31f; 新星计划持续上新&#x1f31f; 原力计划方向&#x1f31f; 原力计划拥抱优质&#x1f31f; AIGC&#x1f31f; 参加新星计划还是原力计划&#x1f31f; 创作成就未来&#x1f31f; 写在最后&#x1f31f; 写在前面 哈喽&#x…...

一文了解Jackson注解@JsonFormat及失效解决

背景 项目中使用WRITE_DATES_AS_TIMESTAMPS: true转换日期格式为时间戳未生效。如下&#xff1a; spring:jackson:time-zone: Asia/Shanghaiserialization:WRITE_DATES_AS_TIMESTAMPS: true尝试是否关于时间的注解是否会生效&#xff0c;使用JsonForma和JsonFiled均失效。 常…...

webpack——使用、分析打包代码

世上本无nodejs js最初是在前端浏览器上运行的语言&#xff0c;js代码一旦脱离了浏览器环境&#xff0c;就无法被运行。直到nodejs的出现&#xff0c;我们在电脑上配置了node环境&#xff0c;就可以让js代码脱离浏览器&#xff0c;在node环境中运行。 浏览器不支持模块化 nodej…...

libvirt零知识学习5 —— libvirt源码编译安装(3)

接前一篇文章libvirt零知识学习4 —— libvirt源码编译安装&#xff08;2&#xff09; 在上篇文章及上上篇文章中构建libvirt的时候遇到了一个问题“ERROR: Problem encountered: YAJL 2 is required to build QEMU driver”。上篇文章讲到即使安装了相应的YAJL库仍然不能解决问…...

Nmap 的使用教程

Nmap是一个网络侦测和安全审计工具。它可以用于发现网络上的主机和服务&#xff0c;并提供广泛的信息&#xff0c;其中包括操作系统类型和版本、应用程序和服务的详细信息等。在本文中&#xff0c;我们将介绍如何使用Nmap扫描网络主机&#xff0c;识别开放端口以及进行操作系统…...

async与await异步编程

ECMA2017中新加入了两个关键字async与await 简单来说它们是基于promise之上的的语法糖&#xff0c;可以让异步操作更加地简单明了 首先我们需要用async关键字&#xff0c;将函数标记为异步函数 async function f() {} f()异步函数就是指&#xff1a;返回值为promise对象的函…...

移动应用架构设计:如何转变开发流程

移动应用架构设计&#xff1a;如何转变开发流程 2023 年掌握移动应用程序架构的指南&#xff08;附案例研究&#xff09; 如果他们要解决这个问题&#xff0c;开发人员需要了解移动架构设计的最佳实践&#xff0c;使他们能够构建用户喜欢的优化应用程序。其中一些做法包括使用…...

NX二次开发 图层函数总结

简介&#xff1a; NX二次开发 图层相关的总结。 函数&#xff1a; uc5007()uc5008()uc5009()UF_LAYER_ask_category_info()获取图层类别的信息UF_LAYER_ask_category_tag()根据图层分类名称查询其图层分类标识UF_LAYER_ask_status()UF_LAYER_ask_work_layer()UF_LAYER_create…...

windows微服务部署

windows部署一.nginx部署1.nginx 官网下载2. 配置nginx3.配置nigix 防止nigix刷新404不生效二.配置redis部署成服务1.在系统配置中 配置为系统变量2.打开快捷登录服务管理#3. 开启redis三.windows部署jar包一.nginx部署 1.nginx 官网下载 地址 官网地址 安装 windows版本 可安…...

Java四种内部类(看这一篇就够了)

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…...

蓝桥杯刷题第二十天

第一题&#xff1a;纸张尺寸问题描述在 ISO 国际标准中定义了 A0 纸张的大小为 1189mm 841mm, 将 A0 纸 沿长边对折后为 A1 纸, 大小为 841mm 594mm, 在对折的过程中长度直接取 下整 (实际裁剪时可能有损耗)。将 A1 纸沿长边对折后为 A2 纸, 依此类推。输入纸张的名称, 请输出…...

如何通过命令行查看CentOS版本信息和linux系统信息

1.如何查看已安装的CentOS版本信息&#xff1a; 1.cat /proc/version 2.uname -a 3.uname -r 4.cat /etc/centos-release 5.lsb_release -a 6.hostnamectl1. 第一种方式输出的结果是&#xff1a; Linux version 3.10.0-1127.el7.x86_64 (mockbuildkbuilder.bsys.centos.org) …...

oracle查询表空间大小以及每个表所占空间的大小

1、查询数据库中所有的表空间以及表空间所占空间的大小&#xff0c;直接执行语句就可以了&#xff1a; select tablespace_name, sum(bytes)/1024/1024 from dba_data_files group by tablespace_name; 2、查看表空间物理文件的名称及大小 select tablespace_name, file_id, …...

C语言通讯录应用程序:从设计到实现

hello&#xff0c;这期给大家带来C语言实现静态通讯录,主要也是建立起创建大项目的思维&#xff0c;与往期这两篇博客有点类似 C语言实现三子棋 C语言实现扫雷 文章目录&#x1f913;通讯录介绍&#x1f636;‍&#x1f32b;️效果演示&#x1f920;主题框架头文件测试文件函数…...

银河麒麟v10sp2安装nginx

nginx官网下载&#xff1a;http://nginx.org/download/ 银河麒麟系统请先检查yum源是否配置&#xff0c;若没有配置请参考&#xff1a;https://qdhhkj.blog.csdn.net/article/details/129680789 一、安装 1、yum安装依赖 yum install gcc gcc-c make unzip pcre pcre-devel …...

华为笔试题OD

华为笔试题OD 1题 华为od-2022.11.5-k优雅阈值 题目内容 如果一个数组中出现次数最多的元素出现大于等于 &#xfffd;k 次&#xff0c; 被称为 &#xfffd;−优雅数组k−优雅数组 &#xff0c; &#xfffd;k 也可以被称为优雅阈值。 例如&#xff0c;数组 [1,2,3,1,2,3,…...

Win10+Anconda安装.whl文件到指定环境——以pycocotools为例

Anconda安装.whl文件到指定环境1.Whl文件2.pycocotools安装前言&#xff1a;本篇文章主要记录了两个问题&#xff1a; &#xff08;1&#xff09;Win10环境下&#xff0c;利用Anconda安装.whl文件到指定环境的方法&#xff1b; &#xff08;2&#xff09;Win10系统安装pycocoto…...

KMS_VL_ALL_AIO激活工具完全指南:从问题诊断到长效管理

KMS_VL_ALL_AIO激活工具完全指南&#xff1a;从问题诊断到长效管理 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 如何诊断Windows/Office激活失败的核心原因&#xff1f; 1.1 激活失败的三大…...

H3C交换机堆叠配置实战:从零开始搭建企业级网络环境

H3C交换机堆叠配置实战&#xff1a;从零开始搭建企业级网络环境 在中小型企业的网络架构中&#xff0c;交换机堆叠技术正逐渐成为简化管理、提升可靠性的标配方案。想象一下&#xff0c;当你的机房需要扩容时&#xff0c;不再需要逐台配置新交换机&#xff0c;所有设备如同一个…...

vue-beautiful-chat避坑指南:从安装配置到WebSocket实时通信的全流程解析

Vue2实时聊天组件深度实践&#xff1a;从vue-beautiful-chat配置到WebSocket全链路优化 当我们需要在Vue2项目中快速实现一个专业级聊天界面时&#xff0c;vue-beautiful-chat组件无疑是优雅的解决方案。但许多开发者在集成WebSocket实时通信功能时&#xff0c;常会遇到各种&q…...

告别手动画框!OrCAD Capture 快速创建复合封装(附电源/地引脚处理技巧)

高效创建OrCAD复合封装的进阶技巧与避坑指南 在PCB设计流程中&#xff0c;原理图封装的创建往往是项目前期最耗时的环节之一。尤其是面对多通道运放、复杂电源管理芯片或模块化器件时&#xff0c;传统的手动绘制方式不仅效率低下&#xff0c;还容易因引脚属性设置不当导致后续D…...

Python多线程真能并行了吗?(GIL绕过技术全图谱:subprocess/numba/multiprocessing/cython/rustpy)

第一章&#xff1a;Python无锁GIL环境下的并发模型面试题汇总Python 的全局解释器锁&#xff08;GIL&#xff09;长期被视为多线程并发的瓶颈&#xff0c;但近年来随着 CPython 3.13 引入实验性无锁 GIL&#xff08;--without-pymalloc 配合 --with-per-object-gil 原型&#x…...

modelsim crack过程中显示dll文件找不到解决方法

把这几个文件放到modelsim/win64目录下&#xff0c;按照教程点击patch64生成license时会报错&#xff0c;如下找不到文件 - mgls.dll找不到文件 - mgls64.dll这个时候关闭杀毒软件进入你的 D:\modeltech64_10.5\win64 文件夹。在文件夹上方的地址栏&#xff08;显示路径的地方&…...

小白也能搞定!用Docker和Halo 2.10搭建个人博客,再也不用担心公网访问问题

零基础玩转DockerHalo 2.10&#xff1a;打造高颜值个人博客全攻略 在数字内容创作爆发的时代&#xff0c;拥有一个专属博客空间已成为个人品牌建设的标配。但传统建站方案往往面临技术门槛高、维护成本大等痛点。本文将带你用Docker容器技术和Halo 2.10开源系统&#xff0c;30…...

FLUX.1-dev FP8量化模型:让AI绘画不再依赖高端显卡

FLUX.1-dev FP8量化模型&#xff1a;让AI绘画不再依赖高端显卡 【免费下载链接】flux1-dev 项目地址: https://ai.gitcode.com/hf_mirrors/Comfy-Org/flux1-dev 还在为显卡显存不足而无法体验最新AI绘画技术而烦恼吗&#xff1f;FLUX.1-dev FP8量化模型正是为你量身打造…...

链式前向星:高效图存储的进阶指南

1. 为什么需要链式前向星&#xff1f; 当你第一次接触图论算法时&#xff0c;可能会被邻接矩阵和邻接表搞得晕头转向。我刚开始学图论的时候&#xff0c;就经常在这两种存储方式之间纠结。邻接矩阵写起来简单&#xff0c;一个二维数组就能搞定&#xff0c;但当节点数超过10000时…...

Eye-in-Hand还是Eye-to-Hand?深入解读OpenCV手眼标定背后的四种经典算法(Tsai, Park, Horaud)

Eye-in-Hand还是Eye-to-Hand&#xff1f;深入解读OpenCV手眼标定背后的四种经典算法 在工业机器人视觉引导系统中&#xff0c;相机与机械臂的精确标定直接决定了整个系统的定位精度。当工程师第一次调用OpenCV的calibrateHandEye()函数时&#xff0c;面对CALIB_HAND_EYE_TSAI、…...