Stack是Java中基于Vector实现的LIFO数据结构,提供push、pop、peek等方法,适用于括号匹配、字符串反转等场景,但因同步开销大,生产环境推荐使用ArrayDeque替代。

在Java中,Stack 是一种继承自 Vector 的集合类,用于实现后进先出(LIFO, Last In First Out)的数据结构。它提供了如 push()、pop()、peek() 等方法来支持常见的栈操作。虽然在实际开发中推荐使用 Deque 来代替 Stack(因为 Stack 继承自 Vector,存在同步开销),但在学习和简单场景中,直接使用 Stack 仍然非常直观和方便。
1. Stack的基本操作方法
Java中的 Stack 提供了几个核心方法来实现 LIFO 行为:
- push(E item):将元素压入栈顶。
- pop():移除并返回栈顶元素;如果栈为空,抛出 EmptyStackException。
- peek():返回栈顶元素但不移除它;栈为空时同样抛出异常。
- empty():判断栈是否为空,返回 boolean 值。
- search(Object o):查找元素在栈中的位置(从栈顶开始为1),找不到返回-1。
import java.util.Stack;
public class StackExample {
public static void main(String[] args) {
Stack stack = new Stack<>();
stack.push("A");
stack.push("B");
stack.push("C");
System.out.println("栈顶元素: " + stack.peek()); // 输出 C
while (!stack.empty()) {
System.out.println("弹出: " + stack.pop());
}
}
}
2. 实际应用场景举例
Stack 的 LIFO 特性使其适用于多种典型问题:
括号匹配校验检查表达式中的括号是否正确闭合,是栈的经典应用。
立即学习“Java免费学习笔记(深入)”;
public static boolean isValidParentheses(String s) {
Stack stack = new Stack<>();
for (char c : s.toCharArray()) {
if (c == '(' || c == '[' || c == '{') {
stack.push(c);
} else {
if (stack.empty()) return false;
char top = stack.pop();
if ((c == ')' && top != '(') ||
(c == ']' && top != '[') ||
(c == '}' && top != '{')) {
return false;
}
}
}
return stack.empty();
}
字符串反转
利用栈的后进先出特性,可以轻松实现字符顺序反转。
public static String reverseString(String str) {
Stack stack = new Stack<>();
for (char c : str.toCharArray()) {
stack.push(c);
}
StringBuilder sb = new StringBuilder();
while (!stack.empty()) {
sb.append(stack.pop());
}
return sb.toString();
}
3. 使用建议与注意事项
尽管 Stack 使用简单,但仍有一些实践中的注意点:
- 每次调用
pop()或peek()前,最好先用empty()判断栈是否为空,避免异常。 - Stack 是线程安全的(因为继承 Vector),但性能较低;高并发场景建议使用 Deque
deque = new ArrayDeque(); 替代。 - Deque 提供了更清晰的栈操作接口,如
deque.push()、deque.pop()、deque.peek(),逻辑一致且效率更高。
Deque基本上就这些。Stack 在理解 LIFO 模型和教学演示中很有价值,但在生产环境中优先考虑 Deque 实现。stack = new ArrayDeque<>(); stack.push(1); stack.push(2); System.out.println(stack.peek()); // 输出 2 System.out.println(stack.pop()); // 输出 2









