如何检查 Java 中的栈是否为空

JavaJavaBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何检查 Java 中的 Stack 是否为空。我们将探讨实现这一目标的不同方法,包括标准的 isEmpty() 方法和 size() 方法。你还将学习如何处理栈为 null 的情况。

通过实际操作示例,你将获得使用这些技术来判断 Java Stack 是否为空的实践经验,这是使用该数据结构时的一项基本操作。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/DataStructuresGroup(["Data Structures"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java/BasicSyntaxGroup -.-> java/if_else("If...Else") java/DataStructuresGroup -.-> java/arrays_methods("Arrays Methods") java/DataStructuresGroup -.-> java/collections_methods("Collections Methods") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/exceptions("Exceptions") java/SystemandDataProcessingGroup -.-> java/object_methods("Object Methods") subgraph Lab Skills java/if_else -.-> lab-559976{{"如何检查 Java 中的栈是否为空"}} java/arrays_methods -.-> lab-559976{{"如何检查 Java 中的栈是否为空"}} java/collections_methods -.-> lab-559976{{"如何检查 Java 中的栈是否为空"}} java/exceptions -.-> lab-559976{{"如何检查 Java 中的栈是否为空"}} java/object_methods -.-> lab-559976{{"如何检查 Java 中的栈是否为空"}} end

使用 isEmpty() 检查栈

在这一步中,你将学习如何使用 isEmpty() 方法来检查 Java 中的 Stack 是否为空。Stack 类是 Java 集合框架(Java Collections Framework)的一部分,它表示一个后进先出(LIFO)的对象栈。在处理栈时,检查栈是否为空是一项常见操作,例如在尝试移除元素之前。

isEmpty() 方法是一种简单而高效的方式,用于判断包括 Stack 在内的集合是否包含任何元素。如果集合为空(不包含任何元素),它将返回 true;否则返回 false

让我们创建一个简单的 Java 程序来演示 isEmpty() 方法。

  1. 如果 HelloJava.java 文件尚未在 WebIDE 编辑器中打开,请打开它。

  2. 将文件的全部内容替换为以下代码:

    import java.util.Stack;
    
    public class HelloJava {
        public static void main(String[] args) {
            // Create a new Stack
            Stack<String> stack = new Stack<>();
    
            // Check if the stack is empty using isEmpty()
            boolean isEmptyBeforePush = stack.isEmpty();
            System.out.println("Is the stack empty before pushing elements? " + isEmptyBeforePush);
    
            // Push some elements onto the stack
            stack.push("Element 1");
            stack.push("Element 2");
    
            // Check if the stack is empty after pushing elements
            boolean isEmptyAfterPush = stack.isEmpty();
            System.out.println("Is the stack empty after pushing elements? " + isEmptyAfterPush);
        }
    }

    让我们来看看这段代码的新增部分:

    • import java.util.Stack;:这行代码导入了 Stack 类,使我们可以在程序中使用它。
    • Stack<String> stack = new Stack<>();:这行代码创建了一个新的空 Stack,它可以容纳 String 对象。
    • stack.isEmpty();:这是我们关注的方法,它用于检查 stack 对象是否为空。
    • stack.push("...");:这个方法将一个元素添加到栈顶。
  3. 保存文件(Ctrl+S 或 Cmd+S)。

  4. 现在,让我们编译修改后的程序。在终端中,确保你位于 ~/project 目录下,然后运行:

    javac HelloJava.java

    如果编译成功,你将不会看到任何输出。

  5. 最后,让我们运行程序:

    java HelloJava

    你应该会看到类似以下的输出:

    Is the stack empty before pushing elements? true
    Is the stack empty after pushing elements? false

    这个输出证实了 isEmpty() 方法正确地报告了添加元素前后栈的状态。

使用 size() 方法进行检查

在上一步中,我们使用 isEmpty() 方法来检查栈是否为空。对于包括 Stack 在内的集合,另一个有用的方法是 size() 方法。size() 方法返回集合中当前元素的数量。我们可以通过查看栈的大小是否为 0 来使用此方法检查栈是否为空。

虽然通常更推荐使用 isEmpty() 来简单地检查集合是否为空,因为它有时可能更高效,但检查 size() == 0 也能达到相同的结果。了解这两种方法是很有好处的。

让我们修改程序,使用 size() 方法来检查栈是否为空。

  1. 在 WebIDE 编辑器中打开 HelloJava.java 文件。

  2. 修改代码,使用 size() == 0 代替 isEmpty()

    import java.util.Stack;
    
    public class HelloJava {
        public static void main(String[] args) {
            // Create a new Stack
            Stack<String> stack = new Stack<>();
    
            // Check if the stack is empty using size()
            boolean isEmptyBeforePush = stack.size() == 0;
            System.out.println("Is the stack empty before pushing elements? " + isEmptyBeforePush);
    
            // Push some elements onto the stack
            stack.push("Element A");
            stack.push("Element B");
            stack.push("Element C");
    
            // Check the size of the stack after pushing elements
            int sizeAfterPush = stack.size();
            System.out.println("Size of the stack after pushing elements: " + sizeAfterPush);
    
            // Check if the stack is empty after pushing elements using size()
            boolean isEmptyAfterPush = stack.size() == 0;
            System.out.println("Is the stack empty after pushing elements? " + isEmptyAfterPush);
        }
    }

    注意以下更改:

    • 我们用 stack.size() == 0 替换了 stack.isEmpty() 来检查栈是否为空。
    • 我们还添加了一行代码,使用 stack.size() 打印出添加元素后栈的实际大小。
  3. 保存文件(Ctrl+S 或 Cmd+S)。

  4. 在终端中编译修改后的程序:

    javac HelloJava.java

    同样,没有输出表示编译成功。

  5. 运行程序:

    java HelloJava

    你应该会看到类似以下的输出:

    Is the stack empty before pushing elements? true
    Size of the stack after pushing elements: 3
    Is the stack empty after pushing elements? false

    这个输出表明,检查 stack.size() == 0 可以正确识别空栈,并且 stack.size() 会返回元素的数量。

对空引用栈进行测试

在前面的步骤中,你学习了如何使用 isEmpty()size() 方法检查 Stack 是否为空。了解当 Stack 对象本身为 null 时会发生什么也很重要。在 Java 中,null 表示变量不引用任何对象。尝试对 null 对象调用方法会导致 NullPointerException,这是一种常见的运行时错误。

让我们通过实际操作来看看这种情况,并学习如何处理它。

  1. 在 WebIDE 编辑器中打开 HelloJava.java 文件。

  2. 修改代码,将栈设置为 null,然后尝试检查它是否为空:

    import java.util.Stack;
    
    public class HelloJava {
        public static void main(String[] args) {
            // Create a new Stack and then set it to null
            Stack<String> stack = new Stack<>();
            stack.push("Some Element"); // Add an element first
            stack = null; // Now set the stack variable to null
    
            // Try to check if the stack is empty using isEmpty()
            try {
                boolean isEmpty = stack.isEmpty(); // This line will cause an error
                System.out.println("Is the stack empty? " + isEmpty);
            } catch (NullPointerException e) {
                System.out.println("Caught a NullPointerException! The stack object is null.");
            }
    
            // Try to check the size using size()
            try {
                 int size = stack.size(); // This line will also cause an error
                 System.out.println("Size of the stack: " + size);
            } catch (NullPointerException e) {
                 System.out.println("Caught a NullPointerException! Cannot get size of a null stack.");
            }
        }
    }

    以下是新增的内容:

    • stack = null;:这行代码使 stack 变量指向 null。之前创建的 Stack 对象无法再通过此变量访问。
    • try { ... } catch (NullPointerException e) { ... }:这是一个 try-catch 块,用于处理 try 块内代码执行时可能发生的潜在错误(异常)。如果发生 NullPointerException,则会执行 catch 块内的代码。
  3. 保存文件(Ctrl+S 或 Cmd+S)。

  4. 在终端中编译程序:

    javac HelloJava.java

    编译应该会成功。

  5. 运行程序:

    java HelloJava

    你应该会看到类似以下的输出:

    Caught a NullPointerException! The stack object is null.
    Caught a NullPointerException! Cannot get size of a null stack.

    这个输出表明,尝试对 null 栈变量调用 isEmpty()size() 方法会导致 NullPointerException,并且我们的 try-catch 块成功处理了这些异常。

这说明了在调用对象的方法之前,确保对象不为 null 是多么重要。你可以使用一个简单的条件语句来检查对象是否为 nullif (stack != null) { ... }

总结

在本次实验中,你学习了如何检查 Java 中的 Stack 是否为空。你探索了实现此目的的主要方法 isEmpty(),它是 Java 集合框架(Java Collections Framework)的一部分。你了解了如何使用 isEmpty() 来判断栈中是否包含任何元素,若栈为空则返回 true,否则返回 false

你通过创建一个新的 Stack,在添加元素前后检查其是否为空,并打印结果,演示了 isEmpty() 的使用方法。这个实践练习加深了你对如何在 Java 程序中有效使用 isEmpty() 方法检查栈是否为空的理解。