Java学习教程,从入门到精通,Java Stack(堆栈)语法知识点及语法知识点(58)

Java Stack(堆栈)语法知识点详解

一、概述

栈(Stack)是一种后进先出(Last In First Out, LIFO)或先进后出(First In Last Out, FILO)的数据结构,它只允许在一端(栈顶)进行插入(入栈)和删除(出栈)操作。

二、语法知识点
  1. 声明栈

    • 使用Stack类(java.util包下)来声明一个栈。
    • Stack<E>表示栈中元素的类型为E
    Stack<Integer> stack = new Stack<Integer>(); // 声明一个Integer类型的栈
    
  2. 栈的基本操作

    • 入栈(Push):使用push(E item)方法将元素压入栈顶。
    • 出栈(Pop):使用pop()方法移除栈顶元素,并返回该元素。
    • 查看栈顶元素(Peek):使用peek()方法查看栈顶元素但不移除它。
    • 检查栈是否为空(Empty):使用empty()方法检查栈是否为空。
    • 查找元素位置(Search):使用search(Object o)方法返回栈中指定元素的位置(从1开始)。
  3. 栈的实现

    • Stack类是Vector类的一个子类,因此栈的底层实现是基于数组的。
    • 栈的操作(如入栈和出栈)会受到数组容量的限制,当数组满时,需要进行动态扩展。
三、代码示例及注释
import java.util.Stack;public class StackDemo {public static void main(String[] args) {// 声明一个Integer类型的栈Stack<Integer> stack = new Stack<Integer>();// 入栈操作stack.push(10); // 将10压入栈顶stack.push(20); // 将20压入栈顶stack.push(30); // 将30压入栈顶// 查看栈顶元素Integer topElement = stack.peek();System.out.println("栈顶元素: " + topElement); // 输出: 栈顶元素: 30// 出栈操作Integer poppedElement = stack.pop();System.out.println("出栈元素: " + poppedElement); // 输出: 出栈元素: 30// 检查栈是否为空boolean isEmpty = stack.empty();System.out.println("栈是否为空: " + isEmpty); // 输出: 栈是否为空: false// 查找元素位置int index = stack.search(20);System.out.println("元素20的位置: " + index); // 输出: 元素20的位置: 2// 遍历栈System.out.println("栈中的元素:");for (Integer element : stack) {System.out.println(element);}// 输出:// 栈中的元素:// 10// 20}
}
四、注意事项
  1. 溢出和下溢

    • 溢出(Overflow):当栈已满时,再执行入栈操作会导致溢出异常。
    • 下溢(Underflow):当栈为空时,再执行出栈操作会导致下溢异常(EmptyStackException)。
  2. 线程安全

    • Stack类中的方法是同步的,因此它是线程安全的。但在多线程环境下,建议使用ConcurrentLinkedDeque等并发集合类。
  3. 栈的应用

    • 栈常用于实现递归、函数调用、表达式求值等场景。

当然可以,以下是一些关于栈(Stack)的具体案例,涵盖了栈的基本操作及其应用场景:

一、栈的基本操作案例

  1. 创建栈

    • 使用Java的集合类Stack来创建栈。
    Stack<Integer> stack = new Stack<Integer>();
    
  2. 入栈(Push)

    • 将元素添加到栈顶。
    stack.push(1);
    stack.push(2);
    stack.push(3);
    
  3. 出栈(Pop)

    • 从栈顶移除元素,并返回被移除的元素。
    int element = stack.pop(); // 返回并移除栈顶元素
    System.out.println(element); // 输出: 3
    
  4. 访问栈顶元素(Peek)

    • 获取栈顶元素,但不对栈进行修改。
    int element = stack.peek(); // 返回栈顶元素但不移除
    System.out.println(element); // 输出: 3(假设栈顶元素为3)
    
  5. 判断栈是否为空

    • 使用isEmpty()方法判断栈是否为空。
    boolean empty = stack.isEmpty();
    System.out.println(empty); // 输出: false(假设栈不为空)
    

二、栈的应用场景案例

  1. 方法调用和返回

    • 在方法调用时,会使用栈的特性将方法调用的信息存储在栈帧中,然后依次执行,直到返回。这是栈在计算机程序执行中的一个重要应用。
  2. 表达式求值

    • 计算机编译器和解释器在求解表达式时会使用栈来保存操作数和运算符。例如,在计算表达式“3 + 5 * 2”时,可以使用栈来保存操作数3、5、2和运算符+、*,并按照运算的优先级进行计算。
  3. 撤销操作

    • 编辑器和设计软件通常使用栈来实现撤销和重做的功能。当用户进行某些操作时,可以将这些操作的信息压入栈中。当用户需要撤销操作时,可以从栈中弹出最近的操作并进行撤销。

三、自定义栈类案例

除了使用Java的集合类Stack外,还可以自定义一个栈类来实现栈的操作。以下是一个简单的自定义栈类的示例:

public class CustomStack {private int[] elements;private int size;private static final int DEFAULT_CAPACITY = 10;public CustomStack() {elements = new int[DEFAULT_CAPACITY];size = 0;}public void push(int element) {ensureCapacity();elements[size++] = element;}public int pop() {if (size == 0) {throw new EmptyStackException();}return elements[--size];}public int peek() {if (size == 0) {throw new EmptyStackException();}return elements[size - 1];}public boolean isEmpty() {return size == 0;}private void ensureCapacity() {if (size == elements.length) {int[] newElements = new int[elements.length * 2];System.arraycopy(elements, 0, newElements, 0, elements.length);elements = newElements;}}public int size() {return size;}
}

使用自定义栈类进行栈的操作:

public class CustomStackExample {public static void main(String[] args) {CustomStack stack = new CustomStack();stack.push(1);stack.push(2);stack.push(3);int topElement = stack.peek();System.out.println("栈顶元素是: " + topElement); // 输出: 栈顶元素是: 3stack.pop();System.out.println("弹出栈顶元素后,栈顶元素是: " + stack.peek()); // 输出: 弹出栈顶元素后,栈顶元素是: 2}
}

以上案例展示了栈的基本操作以及其在实际编程中的应用场景。通过理解栈的原理和基本操作,可以更好地利用栈这种数据结构来提高程序的效率和可读性。

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

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

相关文章

docker简单私有仓库的创建

1&#xff1a;下载Registry镜像 导入镜像到本地中 [rootlocalhost ~]# docker load -i registry.tag.gz 进行检查 2&#xff1a;开启Registry registry开启的端口号为5000 [rootlocalhost ~]# docker run -d -p 5000:5000 --restartalways registry [rootlocalhost ~]# dock…

AI技术架构:从基础设施到应用

人工智能&#xff08;AI&#xff09;的发展&#xff0c;正以前所未有的速度重塑我们的世界。了解AI技术架构&#xff0c;不仅能帮助我们看懂 AI 的底层逻辑&#xff0c;还能掌握其对各行业变革的潜力与方向。 一、基础设施层&#xff1a;AI 技术的坚实地基 基础设施层是 AI 技…

Python Turtle 实现动态时钟:十二时辰与星空流星效果

在这篇文章中&#xff0c;我将带你通过 Python 的 turtle 模块构建一个动态可视化时钟程序。这个时钟不仅具备传统的时间显示功能&#xff0c;还融合了中国古代的十二时辰与八卦符号&#xff0c;并通过动态星空、流星效果与昼夜背景切换&#xff0c;为程序增添了观赏性和文化内…

使用CSS变量和JavaScript实现鼠标跟随渐变

实现鼠标跟随渐变效果的详细过程&#xff1a; 1. HTML 结构 我们在 HTML 中创建了一个 <div> 元素&#xff0c;用于展示渐变效果。这个元素的 ID 是 gradient-box&#xff0c;方便在 JavaScript 中进行操作。 2. CSS 样式 CSS 变量&#xff1a;在 :root 中定义了两个…

监控易监测对象及指标之:宝兰德中间件JMX监控指标解读

监控易作为一款全面的IT监控软件&#xff0c;能够为企业提供深入、细致的监控服务&#xff0c;确保企业IT系统的稳定运行。在本文中&#xff0c;我们将详细解读监控易针对宝兰德中间件JMX的监控指标&#xff0c;以帮助用户更好地理解和应用这些监控数据。 监测指标概览&#x…

数据仓库-集群管理

主要介绍操作类问题中的集群管理问题。 无法成功创建数据仓库集群时怎么处理&#xff1f; 请检查用户账户余额是否少于100元&#xff0c;是否已经没有配额创建新的数据仓库集群&#xff0c;以及是否存在网络问题。 如账户余额、配额、网络均未发现问题&#xff0c;请联系客户…

期魔方风控模型之委托失败补单程序

你知道吗&#xff1f;只需简单设置&#xff0c;期魔方风控模型就能自动处理风控委托失败的订单&#xff0c;进行补单操作。 那么&#xff0c;这种功能适用于哪些场景呢&#xff1f;让我们一起来探讨一下&#xff01; 在实际交易中&#xff0c;我们有时会遇到在任意交易终端&a…

ubuntu系统的docker安装(2)

查看系统版本 lsb_release -asudo systemctl status docker查看docker是否安装成功 docker pull拉取镜像不成功/docker run不成功 可能有多种原因&#xff1a;网络链接不稳定&#xff0c;没有重启docker&#xff0c;可以先将docker源设置为国内镜像源 sudo systemctl rest…

Source Insight的使用经验汇总

01-Add All"和“Add Tree”有何区别&#xff1f; 在 Source Insight 中&#xff0c;“Add All”和“Add Tree”是两种向项目&#xff08;Project&#xff09;中添加文件的操作选项&#xff0c;它们的区别在于处理文件和目录的方式不同&#xff1a; 1. Add All 范围&am…

MVC基础——市场管理系统(四)

文章目录 项目地址六、EF CORE6.1 配置ef core环境6.2 code first6.2.1 创建Database context1. 添加navigation property2. 添加MarketContext上下文七、Authentication7.1 添加Identity7.2 Run DB migration for Identity7.3 使用Identity7.3.1 设置认证中间件7.3.2 设置权限…

前端编辑器JSON HTML等,vue2-ace-editor,vue3-ace-editor

与框架无关 vue2-ace-editor有问题&#xff0c;ace拿不到&#xff08;brace&#xff09; 一些组件都是基于ace-builds或者brace包装的 不如直接用下面的&#xff0c;不如直接使用下面的 <template><div ref"editor" class"json-editor"><…

Oracle 与 达梦 数据库 对比

当尝试安装了达梦数据库后&#xff0c;发现达梦真的和Oracle数据库太像了&#xff0c;甚至很多语法都相同。 比如&#xff1a;Oracle登录数据库采用sqlplus&#xff0c;达梦采用disql。 比如查看数据视图&#xff1a;达梦和Oracle都有 v$instance、v$database、dba_users等&a…

【docker】12. Docker Volume(存储卷)

什么是存储卷? 存储卷就是将宿主机的本地文件系统中存在的某个目录直接与容器内部的文件系统上的某一目录建立绑定关系。这就意味着&#xff0c;当我们在容器中的这个目录下写入数据时&#xff0c;容器会将其内容直接写入到宿主机上与此容器建立了绑定关系的目录。 在宿主机上…

汽车总线协议分析-CAN总线

随着汽车工业的发展&#xff0c;汽车各系统的控制逐步向自动化和智能化转变&#xff0c;汽车电气系统变得日益复杂。许多车辆设计使用CAN、CAN-FD、LIN、FlexRay或SENT在电子控制单元(ECU)之间以及ECU与传感器&#xff0c;执行器和显示器之间进行通信。这些ECU之间的通信允许车…

前端性能优化(理念篇)

前端性能优化&#xff08;理念篇&#xff09; 前言 其实前端性能优化&#xff0c;按照我的理解&#xff0c;首先你公司的硬件条件跟其它资源跟的上&#xff0c;比如服务器资源&#xff0c;宽带怎么样&#xff0c;还有后端接口响应如何&#xff0c;这些资源都具备后&#xff0…

IIS部署程序https是访问出现403或ERR_HTTP2_PROTOCOL_ERROR

一、说明 在windows server 2016中的IIS程序池里部署一套系统&#xff0c;通过https访问站点&#xff0c;同时考虑到安全问题以及防攻击等行为&#xff0c;就用上了WAF云盾功能&#xff0c;能有效的抵挡部分攻击&#xff0c;加强网站的安全性和健壮性。 应用系统一直能够正常…

【深度学习】热力图绘制

热力图&#xff08;Heatmap&#xff09;是一种数据可视化方法&#xff0c;通过颜色来表示数据矩阵中的数值大小&#xff0c;以便更直观地展示数据的分布和模式。热力图在许多领域中都有应用&#xff0c;尤其在统计分析、机器学习、数据挖掘等领域&#xff0c;能够帮助我们快速识…

3.6 IP 数据报的发送与转发

欢迎大家订阅【计算机网络】学习专栏&#xff0c;开启你的计算机网络学习之旅&#xff01; 文章目录 前言1 主机发送 IP 数据报2 直接交付与间接交付3 路由器转发 IP 数据报4 习题分析 前言 在计算机网络中&#xff0c;数据传输的核心工作之一是通过 IP 协议将数据从源主机传递…

PH热榜 | 2024-12-13

1. AI Santa by Tavus 标语&#xff1a;随时随地&#xff0c;视频连线圣诞老人&#xff01; 介绍&#xff1a;准备好迎接AI圣诞老人了吗&#xff1f;塔武斯公司推出的这款神奇的节日体验&#xff0c;能让你实时用30多种语言与圣诞老人对话&#xff0c;看看自己今年是乖孩子还…

双击 Origin 文件后打开软件只有空白没有任何窗口、或者打开后加载失败解决办法

这其实是因为你的文件并没有在 Origin 中打开&#xff0c;可以在标题栏确认 如果这里显示为 UNTITLED&#xff0c;就说明文件还没有在 Origin 中打开。如果你遇到此类问题&#xff0c;我们建议尝试以下方法。 方法 1 设 Origin 为打开 .opj/opju 文件时的默认应用程序 右键单…