当前位置: 首页 > news >正文

Java中的栈的实现

Java中的栈的实现--双端队列(Deque)

  • 1. 解释代码
  • 2.为什么不用 Stack<Character>?
  • 3.使用示例
  • 4.Deque 的常用方法
  • 5.LinkedList<> 和 ArrayDeque<> 的区别和联系
  • 6. 总结

1. 解释代码

Deque<Character> st = new ArrayDeque<>();

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

2.为什么不用 Stack?

•	**Stack<Character>** 是 Vector 的子类,基于 动态数组,性能不如 ArrayDeque。
•	**ArrayDeque 是双端队列**,支持 栈(LIFO)和队列(FIFO) 操作,性能比 Stack 更优。

推荐使用 Deque 来代替 Stack,因为:
	•	**ArrayDeque** 没有同步开销(Stack 继承自 Vector,方法是 synchronized 的)。
•	**ArrayDeque 性能更高**,push() 和 pop() 都是 O(1)。

3.使用示例

  1. 作为栈(LIFO - 后进先出)
Deque<Character> 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()。

  1. 作为队列(FIFO - 先进先出)

4.Deque 的常用方法

Deque<Character> 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()。

在这里插入图片描述

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

LinkedList<> 和 ArrayDeque<> 都实现了 Deque 接口,但它们的底层实现和性能特点有所不同。
  1. 主要区别
    在这里插入图片描述
  2. 适用场景
    在这里插入图片描述
LinkedList<Integer> 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

在这里插入图片描述

6. 总结

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

在这里插入图片描述

相关文章:

  • css 文本属性-第五章
  • 利用Deepseek+即梦,3分钟做出疗愈风禅意小院视频(含sop)
  • 网站应用-电脑PC微信快速登录-微信开发平台
  • 在Uniapp中实现特殊字符弹出框并插入输入框
  • 第本章:go 切片
  • win11 Visual Studio 17 2022源码编译 opencv4.11.0 + cuda12.6.3 启用GPU加速
  • Java链接redis
  • react 和 react-dom
  • VUE3项目的文档结构分析
  • JVM、JDK、JRE三者的关系
  • 【linux网络编程】字节序
  • 第七章 二叉树
  • 生成式AI系列(二) LLM生成质量改善的方法——RAG检索增强生成
  • Python评估网络脆弱性
  • Redis常问八股(一)
  • Java网络编程,多线程,IO流综合项目一一ChatBoxes
  • 初识Qt · 信号与槽 · 自定义和参数
  • 【轻松学C:编程小白的大冒险】---变量的定义、声明与应用场景 06
  • leetcode日记(86)恢复二叉搜索树
  • 2008-2024年中国手机基站数据/中国移动通信基站数据
  • 汽车网站建设费用/郑州网络推广平台有哪些
  • 营销型集团网站建设/百度识图网页版
  • wordpress改企业网站/济南头条新闻热点
  • 查询工具类网站制作/模板式自助建站
  • 南宁学网站建设/百度网站收录链接提交
  • 网站建设参考网站的说明书/做推广app赚钱的项目