目录

Java中的栈的实现

Java中的栈的实现

1 解释代码

Deque st = new ArrayDeque<>(); Deque st = new ArrayDeque<>(); 这行代码的作用是创建一个 双端队列(Deque),用于存储 Character 类型的元素。它的行为类似于 栈(Stack) 或 队列(Queue),取决于如何使用它。 • Deque :表示 st 是一个 双端队列,支持两端插入和删除操作。 • new ArrayDeque <>():使用 ArrayDeque 作为具体的实现,它比 LinkedList 更高效(无额外的节点开销)。 • Character :存储字符类型的数据。

2.为什么不用 Stack?

Stack 是 Vector 的子类,基于 动态数组,性能不如 ArrayDeque。 • ArrayDeque 是双端队列,支持 栈(LIFO)和队列(FIFO) 操作,性能比 Stack 更优。 推荐使用 Deque 来代替 Stack,因为: • ArrayDeque 没有同步开销(Stack 继承自 Vector,方法是 synchronized 的)。 • ArrayDeque 性能更高,push() 和 pop() 都是 O(1)。

3.使用示例

  1. 作为栈(LIFO - 后进先出) Deque stack = new ArrayDeque<>(); stack.push(‘A’); // 入栈 stack.push(‘B’); // 入栈 stack.push(‘C’); // 入栈 System.out.println(stack.pop()); // 输出 C(后进先出) System.out.println(stack.pop()); // 输出 B System.out.println(stack.pop()); // 输出 A 输出 C B A push() 等价于 addFirst(),pop() 等价于 removeFirst()。
  2. 作为队列(FIFO - 先进先出)

4.Deque 的常用方法

Deque queue = new ArrayDeque<>(); queue.offer(‘A’); // 入队 queue.offer(‘B’); // 入队 queue.offer(‘C’); // 入队 System.out.println(queue.poll()); // 输出 A(先进先出) System.out.println(queue.poll()); // 输出 B System.out.println(queue.poll()); // 输出 C 输出 A B C offer() 等价于 addLast(),poll() 等价于 removeFirst()。 https://i-blog.csdnimg.cn/direct/be0adf348ea34af3aabe72bce6a35e5e.png

5.LinkedList<> 和 ArrayDeque<> 的区别和联系

LinkedList<> 和 ArrayDeque<> 都实现了 Deque 接口,但它们的底层实现和性能特点有所不同。

  1. 主要区别 https://i-blog.csdnimg.cn/direct/1538a6eb13d84fd4a9bbf5bb93def991.png
  2. 适用场景 https://i-blog.csdnimg.cn/direct/af573b6fd6424981b3a3411cdd6c35ad.png LinkedList list = new LinkedList<>(); list.add(1); list.add(3); list.add(4); list.add(1, 2); // 在索引 1 处插入 2 System.out.println(list); // [1, 2, 3, 4 https://i-blog.csdnimg.cn/direct/af772edde02c42d6a1a15c76ac5cdfbf.png

6 总结

Deque st = new ArrayDeque<>(); 创建了一个双端队列,可以当作 栈(LIFO) 或 队列(FIFO) 使用。 • 推荐 ArrayDeque 代替 Stack,因为它 更高效、更灵活,没有 Stack 的同步开销。 • 使用 push() 和 pop() 操作时,它表现得像 Stack(后进先出)。 • 使用 offer() 和 poll() 操作时,它表现得像 Queue(先进先出)。 https://i-blog.csdnimg.cn/direct/80c1820ccb66477f9b339fe376f1c003.png