Stack是Java中基于Vector实现的LIFO数据结构,提供push、pop、peek等方法,适用于括号匹配、字符串反转等场景,但因同步开销大,生产环境推荐使用ArrayDeque替代。
在Java中,Stack 是一种继承自 Vector 的集合类,用于实现后进先出(LIFO, Last In First Out)的数据结构。它提供了如 push()、pop()、peek() 等方法来支持常见的栈操作。虽然在实际开发中推荐使用 Deque 来代替 Stack(因为 Stack 继承自 Vector,存在同步开销),但在学习和简单场景中,直接使用 Stack 仍然非常直观和方便。
Java中的 Stack 提供了几个核心方法来实现 LIFO 行为:
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()); } } }
Stack 的 LIFO 特性使其适用于多种典型问题:
括号匹配校验检查表达式中的括号是否正确闭合,是栈的经典应用。
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();
}
尽管 Stack 使用简单,但仍有一些实践中的注意点:
pop() 或 peek() 前,最好先用 empty() 判断栈是否为空,避免异常。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