Java Stack

Java Stack 类实现了堆栈数据结构。在本教程中,我们将借助示例了解 Java Stack 类及其方法。

在本教程中,我们将借助示例了解 Java Stack 类及其方法。

Java 集合框架中的 Stack 类继承了 Vector 类,它实现了堆栈数据结构的功能。

扩展 Vector 类的 Java Stack 类
Java 堆栈类

堆栈实现

在堆栈中,元素以后进先出的方式存储和访问。也就是说,元素被添加到栈顶并从栈顶移除。

堆栈数据结构的工作
堆栈数据结构的工作

创建堆栈

为了创建堆栈,我们必须先导入 java.util.Stack 包,然后使用如下的构造方法创建堆栈对象:

Stack<Type> stacks = new Stack<>();

这里, Type 表示堆栈中的元素的数据类型。例如,

Stack<Integer> stacks = new Stack<>();
Stack<String> stacks = new Stack<>();

堆栈方法

由于 Stack 继承了 Vector 类,它继承了 Vector 类的所有方法。请访问 Java Vector 类章节获取 Vector 类的更多信息。

除了继承的方法之外, Stack 还提供了 5 个特有的方法。

push() 方法

push() 方法向堆栈顶端添加元素。例如,

import java.util.Stack;

public class Main {
  public static void main(String[] args) {
    Stack<String> animals = new Stack<>();

    // 向堆栈添加元素
    animals.push("Dog");
    animals.push("Horse");
    animals.push("Cat");

    System.out.println("Stack: " + animals);
  }
}

输出

Stack: [Dog, Horse, Cat]

pop() 方法

pop() 方法从堆栈顶端移除元素。例如,

import java.util.Stack;

public class Main {
  public static void main(String[] args) {
    Stack<String> animals = new Stack<>();

    // 向堆栈添加元素
    animals.push("Dog");
    animals.push("Horse");
    animals.push("Cat");
    System.out.println("Initial Stack: " + animals);

    // 从堆栈删除元素
    String element = animals.pop();
    System.out.println("Removed Element: " + element);
  }
}

输出

Initial Stack: [Dog, Horse, Cat]
Removed Element: Cat

peek() 方法

peek() 方法返回堆栈顶部的对象。例如,

import java.util.Stack;

public class Main {
  public static void main(String[] args) {
    Stack<String> animals = new Stack<>();

    // 向堆栈添加元素
    animals.push("Dog");
    animals.push("Horse");
    animals.push("Cat");
    System.out.println("Stack: " + animals);

    // 访问堆栈顶部的元素
    String element = animals.peek();
    System.out.println("Element at top: " + element);
  }
}

输出

Stack: [Dog, Horse, Cat]
Element at top: Cat

search() 方法

search() 方法在堆栈中搜索指定的元素,它返回元素相对于堆栈顶部的位置。例如,

import java.util.Stack;

public class Main {
  public static void main(String[] args) {
    Stack<String> animals = new Stack<>();

    // 向堆栈添加元素
    animals.push("Dog");
    animals.push("Horse");
    animals.push("Cat");
    System.out.println("Stack: " + animals);

    // 搜索一个元素
    System.out.println("Position of Cat: " + animals.search("Cat"));
    System.out.println("Position of Horse: " + animals.search("Horse"));
    System.out.println("Position of Dog: " + animals.search("Dog"));
  }
}

输出

Stack: [Dog, Horse, Cat]
Position of Cat: 1
Position of Horse: 2
Position of Dog: 3

empty() 方法

empty() 方法用于检查堆栈是否为空。例如,

import java.util.Stack;

public class Main {
  public static void main(String[] args) {
    Stack<String> animals = new Stack<>();

    // 向堆栈添加元素
    animals.push("Dog");
    animals.push("Horse");
    animals.push("Cat");
    System.out.println("Stack: " + animals);

    // 检查堆栈是否为空
    boolean result = animals.empty();
    System.out.println("Is the stack empty? " + result);
  }
}

输出

Stack: [Dog, Horse, Cat]
Is the stack empty? false

使用 ArrayDeque 代替 Stack

一般我们不见使用 Stack 类,原因是因为 Stack 类的有的方法是同步导致了性能不高,还有就是 Stack 类内部是数组实现,扩容的时候数组拷贝导致了效率不高。 Deque 接口是一个双端链表,实现了更完善的堆栈数据结构。 Deque 的实现类 ArrayDeque 完全可以替代 Stack 类。

要了解更多信息,请访问: Java ArrayDeque 类