基础数据结构 -- 栈

1. 简介

        堆栈又名栈(stack),他是计算机科学中最基础的数据结构之一。可以算是一种受限制的线性结构,,具有后进先出(LIFO, Last In First Out)的特性。由于此特性,堆栈常用一维数组和链表等线性结构来实现。

2. 特点

        栈的特点特别简单,先入后出,后入先出。

2.1 图解

        栈的主要功能也很简单,无非就是出栈(pop)、入栈(push)和查看栈顶元素。由于这种限制,栈中元素的移除顺序与添加顺序相反,体现了后进先出的特性。

栈的重要术语:

  • 栈顶:栈中允许进行插入和删除操作的端部。
  • 栈底:与栈顶相对,是不能进行插入和删除操作的端部。
  • 空栈:不含任何元素的栈。

栈的基本操作:

  • 入栈:也称为压栈,是指在栈顶添加新的元素。
  • 出栈:是指移除栈顶的元素,使其相邻的元素成为新的栈顶元素。
  • 查看栈顶元素:此操作允许用户查看栈顶元素而不移除它。

2.2 结构

        在java中,栈(Stack)的底层实现就是数组(Vector)。

        数组实现的栈在尾部进行插入和删除操作时效率较高,而链表实现的栈虽然在空间使用上更加灵活,但需要更复杂的数据结构来支持高效的插入和删除操作。

        jdk源码中Stack的实现也很简洁,如下图

主要的常用功能就三个:

public E push(E item)
入栈,在栈顶添加元素
public synchronized E pop()
出栈,返回栈顶元素并删除
public synchronized E peek() 
返回栈顶元素,但不删除

2.3 使用

public class StackExample {public static void main(String[] args) {// 创建一个空的栈对象Stack<Integer> stack = new Stack<>();// 向栈中压入元素stack.push(1);stack.push(2);stack.push(3);// 输出栈的大小System.out.println("栈的大小:" + stack.size());// 查看栈顶元素System.out.println("栈顶元素:" + stack.peek());// 弹出栈顶元素int topElement = stack.pop();System.out.println("弹出的元素:" + topElement);// 再次查看栈顶元素System.out.println("新的栈顶元素:" + stack.peek());// 判断栈是否为空System.out.println("栈是否为空:" + stack.isEmpty());}
}// 结果
栈的大小:3
栈顶元素:3
弹出的元素:3
新的栈顶元素:2
栈是否为空:false

3. 用途

  •  表达式求值
    • 逆波兰表达式求值:栈可以用于计算后缀表达式的值,通过遍历表达式,将数字压入栈中,遇到运算符则从栈中弹出相应数量的数字进行计算,再将结果压回栈中。
  • 括号匹配
    • 符号匹配:栈可以用于检查表达式中的括号是否匹配,通过遍历表达式,每当遇到左括号时,将其压入栈中;当遇到右括号时,判断栈顶元素是否为对应的左括号,并出栈。
  • 算法辅助数据结构
    • 深度优先搜索:在图形算法中,栈可以用于实现深度优先搜索,通过遍历节点并将未访问的邻接节点压入栈中,然后在后续的探索中继续这个过程。
  • 历史记录
    • 网页浏览器历史:浏览器的前进和后退功能可以通过两个栈来实现,一个栈用于存储已访问的页面,另一个栈用于存储回退的页面。
  • 撤销操作
    • 编辑器撤销:在文本编辑器中,每次编辑操作都可以被记录在一个栈中,当用户执行撤销操作时,可以从栈中取出最近的操作并执行相反的操作。
  • 递归处理
    • 递归转迭代:在处理递归问题时,可以使用栈来模拟递归调用的过程,将递归转换为迭代,从而避免栈溢出的风险。
  • 函数调用堆栈
    • 异常处理:在Java中,异常的传播和处理可以通过栈来实现,每个方法调用时的异常信息都会被记录在栈帧中,直到找到合适的异常处理器。 

4. 总结

        Java中的栈是一种非常重要的数据结构,它遵循后进先出(LIFO)的原则,即最后进入的元素最先被取出。栈在Java中的应用非常广泛,从基本的算法实现到深层次的程序执行机制,都离不开栈的支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/850761.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OPenCV的重要结构体Mat

一 Mat Mat是什么&#xff1f; Mat有什么好处&#xff1f; class CV_EXPORTS Mat{ public: ... int dims;//维数 int rows,cols;//行列数 uchar *data;//存储数据的指针 int *refcount;//引用计数 ...};二 Mat属性 三 Mat拷贝 1 Mat浅拷贝 Mat A Aimread(file,IMREAD_COLOR) …

http接口上传文件响应413:413 Request Entity Too Large

目录 一、场景简介二、异常展示三、原因四、解决 一、场景简介 1、服务端有经过nginx代理 2、上传文件超过5M时&#xff0c;响应码为413 3、上传文件小于5M时&#xff0c;上传正常 二、异常展示 三、原因 nginx限制了上传数据的大小 四、解决 扩大nginx上传数据的大小 步…

【详细的Kylin使用心得,什么是Kylin?】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

秋招突击——算法打卡——6/5——提高{(状态机模型)股票买卖、(单调队列优化DP)最大子序列和}——新做:{考试的最大困扰度}

文章目录 提高(状态机模型)股票买卖IV思路分析实现代码参考代码 新作考试的最大困扰度个人实现参考思路 总结 提高 (状态机模型)股票买卖IV 上一次的思路总结&#xff0c;上次写的时候忘记总结了&#xff0c;现在重新画一下图 思路分析 这道题是一个经典的状态机模型&#…

用动态IP采集数据总是掉线是为什么?该怎么解决?

动态IP可以说是做爬虫、采集数据、搜集热门商品信息中必备的代理工具&#xff0c;但在爬虫的使用中&#xff0c;总是会遇到动态IP掉线的情况&#xff0c;从而影响使用效率&#xff0c;本文将探讨动态IP代理掉线的几种常见原因&#xff0c;并提供解决方法&#xff0c;以帮助大家…

牛客网刷题 | BC119 最高分与最低分之差

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 输入n个成绩&#…

CleanMyMac2025破解版crack+keygen

【CleanMyMac】这款神奇的软件&#xff0c;让我彻底告别了电脑卡顿的困扰&#xff01;&#x1f62e;‍&#x1f4a8; CleanMyMac绿色免费版下载如下&#xff1a;记得保存哈&#xff0c;以防失效&#xff1a; https://pan.quark.cn/s/9b08114cf404 CleanMyMac X2024全新版下载…

指针(初阶2)“野指针以及指针运算”

目录 一.野指针 二.如何避免野指针 三.指针运算 1、指针&#xff08;-&#xff09;整数 2、指针 - 指针 3、指针关系运算 小编在这里声明一下&#xff0c;将某一块的知识点分为上中下或者1&#xff0c;2&#xff0c;3来编写不是为了增加小编的文章总量&#xff0c;也不是故意这…

279 基于matlab的粒子群集法对铁路电能质量控制系统的容量避行优化设计

基于matlab的粒子群集法对铁路电能质量控制系统的容量避行优化设计。计算出满足功率因素、电压不平衡度等电能指标的条件下。RPC所需要的补偿功率。求得所需最小的系统客量。该设计能快速计算出符合系统设定指标的各项最优补偿功率。并通过sumulink份真。检验设计参数的准确性。…

泛微开发修炼之旅--13通过Ecology拦截器(注解的方式),拦截后端接口,实现接口执行成功后或执行前操作源码示例

文章链接&#xff1a;泛微开发修炼之旅--13通过Ecology拦截器(注解的方式)&#xff0c;拦截后端接口&#xff0c;实现接口执行成功后或执行前操作源码示例

R语言探索与分析20-北京市气温预测分析

一、序言 近年来&#xff0c;人类大量燃烧煤炭、天然气等含碳燃料导致温室气 体过度排放&#xff0c;大量温室气体强烈吸收地面辐射中的红外线&#xff0c;造 成温室效应不断累积&#xff0c;使得地球温度上升&#xff0c;造成全球气候变暖。气象温度的预测一直以来都是天气预…

C语言详解(结构体)

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#xff0c;在这里撰写成文一…

网关API(SpringCloudGateway)如何自定义Filter

1.前言 SpringCloud 虽然给我们提供了很多过滤器&#xff0c;但是这些过滤器功能都是固定的&#xff0c;无法满足用户的各式各样的需求。因此SpringCloud提供了过滤器的扩展功能自定过滤器。 开发者可以根据自己的业务需求自定义过滤器。 2. 自定义 GatewayFilter(局部过滤器)…

微信小程序 画布canvas

属性说明 属性类型默认值必填说明最低版本typestring否指定 canvas 类型&#xff0c;支持 2d (2.9.0) 和 webgl (2.7.0)2.7.0canvas-idstring否canvas 组件的唯一标识符&#xff0c;若指定了 type 则无需再指定该属性1.0.0disable-scrollbooleanfalse否当在 canvas 中移动时且…

【Python】解决Python报错:KeyError: ‘username‘

​​​​ 文章目录 引言1. 错误详解2. 常见的出错场景2.1 用户输入处理错误2.2 动态数据源 3. 解决方案3.1 使用 get() 方法3.2 检查键是否存在 4. 预防措施4.1 数据验证4.2 使用默认字典 (defaultdict) 结语 引言 在Python开发中&#xff0c;处理字典时遇到 KeyError 是一种…

Elastic 8.14:用于简化分析的 Elasticsearch 查询语言 (ES|QL) 正式发布

作者&#xff1a;来自 Elastic Brian Bergholm 今天&#xff0c;我们很高兴地宣布 Elastic 8.14 正式发布。 什么是新的&#xff1f; 8.14 版本最重要的标题是 ES|QL 的正式发布(GA)&#xff0c;它是从头开始设计和专门构建的&#xff0c;可大大简化数据调查。在新的查询引擎的…

Mac环境下,简单反编译APK

一、下载jadx包 https://github.com/skylot/jadx/releases/tag/v1.4.7 下载里面的这个&#xff1a;下载后&#xff0c;找个干净的目录解压&#xff0c;我是放在Downloads下面 二、安装及启动 下载和解压 jadx&#xff1a; 下载 jadx-1.4.7.zip 压缩包。将其解压到你希望的目…

【数据结构】排序——插入排序,选择排序

前言 本篇博客我们正式开启数据结构中的排序&#xff0c;说到排序&#xff0c;我们能联想到我之前在C语言博客中的冒泡排序&#xff0c;它是排序中的一种&#xff0c;但实现效率太慢&#xff0c;这篇博客我们介绍两种新排序&#xff0c;并好好深入理解排序 &#x1f493; 个人主…

HC-SR505人体感应灯

1硬件 1.1硬件组成 1.正点原子探索者开发板 2 HC-SR505迷你小型人体感应模块 3 继电器&#xff0b;5V小灯 HC-SR505迷你小型人体感应模块介绍 1.2 硬件连接 1.HC-SR505&#xff08;连接在PE0&#xff09; 2.继电器&#xff08;连接在PE1&#xff09; 2.主要代码 int ma…

【nerf】nvidia-smi

当cmd下nvidia -smi不能使用时候 沿着以下路径打开cmd&#xff0c;再输入&#xff0c;可以查看cuda版本 然后查看电脑安装的