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