Java Stack 类

2025年4月6日 | 阅读10分钟

栈是一种线性数据结构,用于存储对象的集合。它基于后进先出 (LIFO) 原则。在 Java 中,栈具有特殊的重要性,构成了许多算法和应用程序的基础。Java 集合框架提供了许多接口和类来存储对象的集合。其中之一就是 Stack 类,它提供了 push、pop、search 等不同的操作。

在本节中,我们将讨论 Java Stack 类、它的方法,并在 Java 程序中实现栈数据结构。但在转向 Java Stack 类之前,让我们快速了解一下栈的工作原理。

Stack

栈数据结构有两个最重要的操作:push 和 pop。push 操作将元素插入栈中,pop 操作从栈顶移除元素。想象它是一堆盘子,你只能添加或移除最上面的盘子。项目可以被添加(push)到栈中,也可以从栈中移除(pop)。最近添加的项目是第一个被移除的。让我们看看 push 和 pop 如何在栈上工作。

Java Stack

让我们分别将 20、13、89、90、11、45、18 压入栈中。

Java Stack

让我们从栈中移除 (pop) 18、45 和 11。

Java Stack

空栈:如果栈中没有元素,则称为空栈。当栈为空时,top 变量的值为 -1。

Java Stack

当我们向栈中压入一个元素时,top 会增加 1。在下图中,

  • 压入 12,top=0
  • 压入 6,top=1
  • 压入 9,top=2
Java Stack

当我们从栈中弹出一个元素时,top 的值会减少 1。在下图中,我们已经弹出了 9。

Java Stack

下表显示了 top 的不同值。

Java Stack

Java Stack 类

在 Java 中,Stack 是一个属于 Collection 框架的类,它扩展了 Vector 类。它还实现了 List、Collection、Iterable、Cloneable 和 Serializable 接口。它表示对象的 LIFO 栈。它使用泛型 () 允许栈保存任何数据类型的元素。main() 方法演示了如何将 Stack 类与整数元素一起使用,但我们也可以将其与任何其他数据类型一起使用。

Java Stack

Stack 类构造函数

Stack 类只包含默认构造函数,它创建一个空栈。

创建栈

如果我们要创建一个栈,首先,导入 java.util 包并创建 Stack 类的一个对象。

其中 type 表示栈的类型,如 Integer、String 等。

Stack 类的方法

我们可以在栈上执行 push、pop、peek 和 search 操作。Java Stack 类主要提供了五种方法来执行这些操作。除此之外,它还提供了 Java Vector 类的所有方法。

方法修饰符和类型方法描述
empty()booleanempty() 方法检查栈是否为空。
push(E item)Epush() 方法将元素压入(插入)栈顶。
pop()Epop() 方法从栈顶移除一个元素,并返回该元素作为函数的值。
peek()Epeek() 方法查看栈顶元素而不移除它。
search(Object o)intsearch() 方法搜索指定的对象并返回对象的位置。

Stack 类 empty() 方法

Stack 类的 empty() 方法检查栈是否为空。如果栈为空,如果栈不包含任何元素则返回 true,否则返回 false。我们也可以使用 Vector 类的 isEmpty() 方法。

语法

返回:如果栈为空,该方法返回 true,否则返回 false。

在以下示例中,我们创建了一个 Stack 类的实例。之后,我们两次调用了 empty() 方法。第一次它返回 true,因为我们没有向栈中压入任何元素。之后,我们向栈中压入了元素。我们再次调用 empty() 方法,它返回 false,因为栈不为空。

示例

编译并运行

输出

Is the stack empty? true
Elements in Stack: [78, 113, 90, 120]
Is the stack empty? false

Stack 类 push() 方法

该方法将一个项目插入到栈顶。它的工作方式与 Vector 类的 addElement(item) 方法相同。它传递一个参数 item 以压入栈中。

语法

参数:要压入栈顶的项目。

返回:该方法返回我们作为参数传递的参数。

Stack 类 pop() 方法

该方法移除栈顶的对象并返回相同的对象。如果栈为空,它会抛出 EmptyStackException

语法

返回:它返回栈顶的对象。

让我们在 Java 程序中实现栈并执行 push 和 pop 操作。

示例

输出

stack: []
push -> 20
stack: [20]
push -> 13
stack: [20, 13]
push -> 89
stack: [20, 13, 89]
push -> 90
stack: [20, 13, 89, 90]
push -> 11
stack: [20, 13, 89, 90, 11]
push -> 45
stack: [20, 13, 89, 90, 11, 45]
push -> 18
stack: [20, 13, 89, 90, 11, 45, 18]
pop -> 18
stack: [20, 13, 89, 90, 11, 45]
pop -> 45
stack: [20, 13, 89, 90, 11]
pop -> 11
stack: [20, 13, 89, 90]

Stack 类 peek() 方法

peek() 方法返回栈顶元素而不移除它。它允许我们检查栈顶的元素而不修改栈的内容。它查看栈中顶部的元素。如果栈为空,它也会抛出 EmptyStackException。

语法

返回:它返回栈顶元素。

让我们看一个 peek() 方法的例子。

示例

编译并运行

输出

Stack: [Apple, Grapes, Mango, Orange]
Element at the top of the stack: Orange

该方法从栈顶开始搜索对象。它解析我们想要搜索的参数。它返回对象在栈中的 1-based 位置。栈中最顶部的对象被认为是距离 1。

假设 o 是栈中我们要搜索的对象。该方法返回离栈顶最近的出现位置与栈顶的距离。它使用 equals() 方法在栈中搜索对象。

语法

参数:o 是要搜索的目标对象。

返回:它返回对象在栈中的位置。如果返回 -1,则表示该对象不在栈中。

让我们看一个 search() 方法的例子。

示例

编译并运行

输出

Stack: [Mac Book, HP, DELL, Asus]
Location of Dell: 3

Java 栈操作

栈的大小

我们还可以使用 Vector 类的 size() 方法来查找栈的大小。它返回栈中元素的总数(栈的大小)。

语法

让我们看一个 Vector 类的 size() 方法的例子。

示例

输出

Is the stack empty or not? false
The stack size is: 5

迭代元素

迭代意味着获取栈的元素。我们可以使用三种不同的方法来获取栈的元素,如下所示:

  • 使用 iterator() 方法
  • 使用 forEach() 方法
  • 使用 listIterator() 方法

使用 iterator() 方法

它是 Iterator 接口的方法。它返回一个迭代器,用于迭代栈中的元素。在使用 iterator() 方法之前,导入 java.util.Iterator 包。

语法

让我们对栈执行迭代。

示例

编译并运行

输出

BMW
Audi
Ferrari
Bugatti
Jaguar

使用 forEach() 方法

Java 提供了一个 forEach() 方法来迭代元素。该方法在 IterableStream 接口中定义。

语法

让我们使用 forEach() 方法迭代栈。

示例

输出

Iteration over the stack using forEach() Method:
119
203
988

使用 listIterator() 方法

此方法返回一个列表迭代器,用于迭代指定列表(按顺序)中的元素,从列表中指定位置开始。它从上到下迭代栈。

语法

参数:该方法解析一个名为 index 的参数。

返回:此方法返回一个列表迭代器,用于按顺序迭代元素。

异常:如果索引超出范围,它会抛出 IndexOutOfBoundsException

让我们使用 listIterator() 方法迭代栈。

示例

编译并运行

输出

Iteration over the Stack from top to bottom:
988
203
119

Java 栈 MCQ

1. 下列哪项最能描述 Java Stack 类中 push(E item) 方法的行为?

  1. 将指定元素添加到栈顶。
  2. 从栈中移除指定元素。
  3. 检索但不移除栈顶元素。
  4. 返回栈中元素的数量。
 

答案:A

解释:Java Stack 类中的 push(E item) 方法将指定元素添加到栈顶。


2. 以下代码的结果是什么?

  1. top 将是 1。
  2. top 将是 2。
  3. top 将是 0。
  4. 编译错误。
 

答案:B

解释:Java Stack 类中的 pop() 方法移除并返回栈顶元素,因此 top 将被赋值为 2。


3. Java Stack 类中哪个方法返回栈顶元素而不移除它?

  1. push(E item)
  2. pop()
  3. peek()
  4. isEmpty()
 

答案:C

解释:Java Stack 类中的 peek() 方法检索但不移除栈顶元素。


4. Java Stack 类中 push(E item) 方法的时间复杂度是多少?

  1. O(1)
  2. O(log n)
  3. O(n)
  4. O(n^2)
 

答案:A

解释:Java Stack 类中的 push(E item) 方法的时间复杂度为 O(1),因为它只是将指定元素添加到栈顶。


5. 何时应该使用 Java Stack 类中的 isEmpty() 方法?

  1. 将元素添加到栈顶。
  2. 从栈中移除元素。
  3. 在执行 pop() 操作之前检查栈是否为空。
  4. 检索但不移除栈顶元素。
 

答案:C

解释:Java Stack 类中的 isEmpty() 方法用于在执行 pop() 等操作之前检查栈是否为空,以避免 EmptyStackException 等异常。


下一主题Java Collection