Java数据结构复习:MyArrayStack实现栈操作

需积分: 3 5 下载量 64 浏览量 更新于2024-09-25 收藏 176KB PDF 举报
"Java基础复习笔记05数据结构-栈" 在编程中,数据结构是组织和存储数据的重要方式,而栈(Stack)是一种常用的数据结构,它遵循“后进先出”(Last In First Out, LIFO)的原则。栈在Java中广泛应用于各种算法和程序设计中,如表达式求值、深度优先搜索等。本篇复习笔记将对Java中的栈进行深入探讨。 栈的基本操作包括压栈(push)和弹栈(pop)。压栈是将元素添加到栈顶的过程,弹栈则是移除栈顶元素。Java中实现栈有两种主要方式:一是使用内置容器类`java.util.Stack`,二是自定义数据结构。这里我们将关注自定义栈的实现。 1. 自定义栈的实现: 在给定的代码段中,我们看到了一个名为`MyArrayStack`的自定义栈类。这个类使用一个Object数组`objects`来存储元素,并通过`elementSize`变量追踪栈中元素的数量。初始化时,数组大小默认为16(`Def_Size`),以节省内存空间。当需要存储更多元素时,数组会自动扩容。 - `push()`方法:当尝试压栈时,首先检查数组是否已满。如果未满,就将新元素`e`添加到数组的最后一个未占用位置(即`objects[elementSize]`),然后将`elementSize`加1。如果数组已满,就需要进行扩容操作,通常通过创建一个更大的新数组并复制旧数组的所有元素到新数组中来实现。 2. Java内置的`Stack`类: `java.util.Stack`继承自`Vector`类,提供了标准的栈操作接口,如`push()`, `pop()`, `peek()`等。它提供了线程安全的栈操作,但性能相对较慢,因为每次操作都需要同步整个容器。在不需要线程安全或追求高性能的场景下,自定义栈可能更为合适。 3. 栈的应用: - 表达式求值:栈可以用来解决逆波兰表示法(Postfix Notation)的计算问题,通过将操作数压栈,遇到运算符时弹出栈顶的两个操作数进行运算,结果再压栈。 - 深度优先搜索(DFS):在图或树的遍历中,栈常被用来存储待访问的节点,以便按深度顺序访问。 - 函数调用:在程序执行过程中,函数调用和返回可以通过系统栈来管理,保存和恢复局部变量和返回地址。 4. 栈的其他操作: - `peek()`:查看但不移除栈顶元素,通常用于检查栈顶元素。 - `empty()`:检查栈是否为空,如果是则返回`true`,否则返回`false`。 - `size()`:返回栈中元素的数量。 5. 内存管理: - 栈内存:栈是计算机内存中的一个区域,用于存储局部变量和函数调用信息。Java中的栈内存由JVM管理,每次函数调用都会创建一个新的栈帧,存储参数、局部变量等信息。当函数返回时,对应的栈帧会被销毁,释放其占用的内存。 理解并熟练运用栈数据结构是成为一名优秀Java程序员的关键步骤之一。通过自定义栈类,我们可以更好地控制栈的性能和内存使用,同时也能加深对数据结构和内存管理的理解。