Java 栈使用

介绍

栈(Stack)是一种常见的数据结构,具有后进先出(Last-In-First-Out,LIFO)的特点。在 Java 中,栈是通过 Stack 类来实现的。栈的基本操作包括入栈(push)、出栈(pop)、查看栈顶元素(peek)等。栈在很多场景中都有广泛的应用,例如表达式求值、函数调用、递归等。

栈的特点

栈具有以下特点:

  • 后进先出(Last-In-First-Out,LIFO):最后进栈的元素最先出栈。
  • 仅允许在栈顶进行插入和删除操作。
  • 栈的大小是固定的,不可动态扩容。
  • 栈中无数据时,称为空栈。

栈的基本操作

入栈(push)

入栈操作是将一个元素添加到栈的顶部。在 Java 中,可以通过 Stack 类的 push 方法来实现入栈操作。

import java.util.Stack;

public class StackExample {
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        
        stack.push(1);
        stack.push(2);
        stack.push(3);
        
        System.out.println("Stack: " + stack);
    }
}

上述代码创建了一个 Stack 对象,并使用 push 方法向栈中依次插入了整数 1、2、3。最后,打印出栈的内容,输出为 Stack: [1, 2, 3]

出栈(pop)

出栈操作是将栈顶的元素移除并返回。在 Java 中,可以通过 Stack 类的 pop 方法来实现出栈操作。

import java.util.Stack;

public class StackExample {
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        
        stack.push(1);
        stack.push(2);
        stack.push(3);
        
        int topElement = stack.pop();
        
        System.out.println("Top element: " + topElement);
        System.out.println("Stack: " + stack);
    }
}

上述代码先将整数 1、2、3 入栈,然后使用 pop 方法将栈顶的元素 3 移除并赋值给 topElement 变量。最后,打印出栈顶元素和栈的内容,输出为:

Top element: 3
Stack: [1, 2]

查看栈顶元素(peek)

查看栈顶元素操作是返回栈顶的元素,但不对栈进行修改。在 Java 中,可以通过 Stack 类的 peek 方法来实现查看栈顶元素操作。

import java.util.Stack;

public class StackExample {
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        
        stack.push(1);
        stack.push(2);
        stack.push(3);
        
        int topElement = stack.peek();
        
        System.out.println("Top element: " + topElement);
        System.out.println("Stack: " + stack);
    }
}

上述代码先将整数 1、2、3 入栈,然后使用 peek 方法获取栈顶的元素并赋值给 topElement 变量。最后,打印出栈顶元素和栈的内容,输出为:

Top element: 3
Stack: [1, 2, 3]

栈的应用场景

栈在很多场景中都有广泛的应用,下面介绍几个常见的应用场景。

表达式求值

栈可以用于表达式的求值,例如计算一个数学表达式的结果。通常,我们将中缀表达式转换为后缀表达式,然后使用栈对后缀表达式进行求值。

import java.util.Stack;

public class ExpressionEvaluation {
    public static int evaluate(String expression) {
        Stack<Integer> stack = new Stack<>();
        
        for (int i = 0; i < expression.length(); i++) {
            char c = expression.charAt(i);
            
            if (Character.isDigit(c)) {
                stack.push(Character.getNumericValue(c));
            } else {
                int operand2 = stack.pop();
                int operand1 = stack.pop();
                
                switch (c) {
                    case '+':
                        stack.push(operand1 + operand2