Stack
和Queue
是Java集合框架中的两个经典接口,分别代表栈和队列。它们提供了不同的数据结构和操作方式,适用于各种场景。
目前Java已不推荐使用Stack,推荐更高效的ArrayDeque(双端队列),实现了
Deque
接口。
1. Stack源码解析
1.1 类结构
public class Stack<E> extends Vector<E> {
// ...
}
Stack
继承自Vector
类,因此拥有Vector
的所有方法,但由于Vector
是同步的,Stack
在绝大多数情况下不建议使用。
1.2 常用方法
push(E item)
: 将元素压入栈顶。pop()
: 弹出栈顶元素。peek()
: 获取栈顶元素,但不弹出。empty()
: 判断栈是否为空。search(Object o)
: 在栈中查找元素并返回距离栈顶的距离。
1.3 应用场景
Stack
常用于需要后进先出(LIFO)的场景,如表达式求值、括号匹配等。
2. Queue源码解析
2.1 接口结构
public interface Queue<E> extends Collection<E> {
// ...
}
Queue
接口继承自Collection
接口,定义了一组用于队列操作的方法。
2.2 常用方法
add(E e)
: 将元素插入队尾,如果队列已满,则抛出异常。offer(E e)
: 将元素插入队尾,成功返回true
,如果队列已满则返回false
。remove()
: 移除并返回队头元素,如果队列为空,则抛出异常。poll()
: 移除并返回队头元素,如果队列为空则返回null
。element()
: 返回队头元素但不移除,如果队列为空,则抛出异常。peek()
: 返回队头元素但不移除,如果队列为空则返回null
。
2.3 实现类
常用的Queue
实现类包括:
LinkedList
: 基于链表实现的队列。ArrayDeque
: 基于数组实现的双端队列。PriorityQueue
: 基于优先级堆实现的优先级队列。
2.4 应用场景
Queue
常用于需要先进先出(FIFO)的场景,如任务调度、消息队列等。
3. Stack和Queue的应用示例
3.1 Stack应用示例
// 判断括号匹配
public boolean isBracketMatch(String expression) {
Stack<Character> stack = new Stack<>();
for (char ch : expression.toCharArray()) {
if (ch == '(' || ch == '[' || ch == '{') {
stack.push(ch);
} else if (ch == ')' && !stack.isEmpty() && stack.peek() == '(') {
stack.pop();
} else if (ch == ']' && !stack.isEmpty() && stack.peek() == '[') {
stack.pop();
} else if (ch == '}' && !stack.isEmpty() && stack.peek() == '{') {
stack.pop();
} else {
return false;
}
}
return stack.isEmpty();
}
3.2 Queue应用示例
// 使用Queue实现任务调度
public class TaskScheduler {
private Queue<Runnable> taskQueue = new LinkedList<>();
public void scheduleTask(Runnable task) {
taskQueue.offer(task);
}
public void executeTasks() {
while (!taskQueue.isEmpty()) {
Runnable task = taskQueue.poll();
task.run();
}
}
}
4. 总结
Stack
和Queue
是常用的数据结构,分别适用于后进先出和先进先出的场景。