Java 中的堆栈是一种数据结构,很像队列、数组、链表或树。它与其他堆栈的不同之处在于,Java堆栈基于后进先出 (LIFO) 原则。这意味着当您使用这两个命令从堆栈中添加和删除一个元素时,您删除的第一个将始终是您添加的最后一个。让我们仔细看看 Java Stack类
探索 Java 堆栈类
Java Stack类是Vector类的扩展,它本身扩展了List类。因为向量是可变的并且可以随着内部元素的需求而增长和收缩,所以Stack也可以根据需要改变大小。Vector类的扩展添加了五个将Vector转换为Stack 的操作。这五个操作是:- .push(E item) – 将一个元素放到栈顶
- .pop() – 移除栈顶元素并将其作为函数值返回
- .peek() – 查看堆栈顶部的元素而不删除它
- .empty() – 用于测试堆栈是否为空的布尔函数。返回 0 或 1。
- .search(Object o) – 寻找 o 并返回它的位置。该值从 1 开始,而不是从 0 开始
编写 Java 堆栈示例
现在我们知道Stack的功能,让我们编写一个 Java 堆栈示例。Stack对于处理必须临时存储和快速检索的数据非常有用。因为Stack是 LIFO,所以在探索树数据结构时它对于节点遍历非常有用。在我们进入所有这些之前,让我们创建一个基本堆栈。实现栈的代码如下:
import java.util.*;
class Main {
public static void main(String[] args) {
Stack<Integer> stackExample = new Stack<Integer>();
这就是创建空Stack 所需要做的全部工作。您也可以只声明它而不声明数据类型,方法是:
Stack example = new Stack();
请记住,因为Stack是可变的,当我们将元素压入堆栈时,它会自动调整大小。现在让我们看看如何使用Stack函数。
Java 堆栈实现
让我们看看如何使用我们之前简要探讨过的五种方法。如果将 Java 栈的实现想象成一堆盘子,就很容易记住。你把盘子放在堆栈上,但要得到一个盘子,你不会走到底部,你会从顶部得到一个。你穿的最后一件是你脱下的第一件。用stackExample扩展我们之前的例子,函数如下:推
// pushing integers onto the Stack
stackExample.push(5);
stackExample.push(10);
在这一点上,我们将展示其他函数,就像我们每次都将这两个整数压入 Java 堆栈示例一样。
流行音乐
//popping integers off of the Stack
System.out.println(stackExample.pop());
System.out.println(stackExample.pop());
输出:
10
5
是空的
现在,假设您想从Stack中删除所有元素,但您不确定有多少元素。您可以将Boolean.isEmpty()函数与前提条件 while 循环结合使用,以弹出Stack中的所有元素。看看这个java栈实现是怎么做的。
while(!stackExample.isEmpty()) {
System.out.println(stackExample.pop());
}
输出
10
5
窥视
我们可以使用.peek()作为 Java 中的堆栈实现来查看堆栈中的下一项而不删除它。
System.out.println(stackExample.peek());
输出
10
如果我们弹出并打印堆栈,它将返回 10 和 5,因为 10 仍在堆栈中。我们只是看了一下,并没有用pop函数去掉。peek 函数是java 中Stack的一个很好的工具。
搜索
如果我们想找到一个特定的元素,Java 中的堆栈实现使用.search(e); 找到它。
System.out.println(stackExample.search(5));
输出
2
请记住,这是因为我们从Stack 的顶部开始计数,而 Java Stack从 1 开始,而不是像Array那样从 0 开始。所以,看看堆栈,它是 (10) --> (5),5 在第 2 个位置。如果您尝试查找不在Stack中的元素,您将得到 -1 作为输出。
迭代
在处理任何集合时,有时您可能需要查找多个元素。为了节省复杂性和不必多次搜索堆栈,您可以使用迭代。由于Java 中的Stack扩展了List类,因此有多种迭代选项。最简单的方法之一是只使用ListIterator函数。ListIterator很好,因为它允许您使用.hasPrevious()或.hasNext()从上到下或从下到上遍历Stack。这是它的样子:
ListIterator<Integer> exampleIterator = stackExample.listIterator(stackExample.size());
while (exampleIterator.hasPrevious()) {
int iteration = exampleIterator.previous();
System.out.println(iteration);
}
输出
10
5
请记住,当您在 Java 中迭代Stack时,您不会删除其中的任何元素。迭代本质上允许您按顺序查看堆栈中的每个元素。执行此操作时,您可以查找某些元素所在的位置,然后遍历并操作它们。如果需要,您可以计算、删除甚至更改它们。
GO TO FULL VERSION