数据容器——Java中的栈和队列

本文介绍了Java中ArrayDeque作为栈和队列的数据结构,相较于Stack和LinkedList,ArrayDeque在性能上有优势。由于其由并发大师DougLea参与编写,因此在需要栈或队列操作时,推荐使用ArrayDeque。常用栈操作包括pop()和push(),队列操作则涉及更多方法。了解这些基础知识对于提升Java编程效率至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

队列,一种先进先出的数据结构

栈,一种先进后出的数据结构

java中常见的能用作栈和队列的类有:LinkedListArrayDeque

虽然这两个类都实现了栈和队列的相关方法,但是更建议使用ArrayDeque

我们看看源码中对ArrayDeque的描述:
在这里插入图片描述我们可以看到,注释中有这样一句话:

This class is likely to be faster than Stack when used as a stack, and
faster than LinkedList when used as a queue.

意思就是作为栈使用时比Stack更快,作为队列使用时比LinkedList更快。

此类是在java 1.6才出来的,有我们著名的“并发大师” Doug Lea 参与编写,所以如果要使用栈和队列,建议使用此类。

常用的操作队列的方法有:

在这里插入图片描述
常用的操作栈的方法有:pop()、push(),这个比较简单,建议去源码中自行探索。

### 使用Java中的队列实现杨辉三角 在Java中,可以通过`Stack`来模拟结构,通过`LinkedList`作为队列的实现方式。以下是基于队列两种数据结构分别实现杨辉三角的功能。 #### 实现杨辉三角 利用的特点(后进先出),我们可以逐层计算并存储每一行的数据: ```java import java.util.Stack; public class YangHuiTriangleWithStack { public static void main(String[] args) { int rows = 6; Stack<Integer> stack = new Stack<>(); for (int i = 0; i < rows; i++) { // 当前行的第一个元素始终为1 stack.push(1); // 打印当前行的内容 for (int j = 0; j <= i; j++) { if (i != 0 && j != 0) { Integer top = stack.pop(); stack.push(top); // 将弹出的值重新压入 // 如果不是第一个元素,则需要从上一行获取相邻两数之 if (!stack.isEmpty()) { Integer secondTop = stack.peek(); stack.push(top + secondTop); } } System.out.print(stack.peek() + " "); } System.out.println(); } } } ``` 此方法的核心在于每次迭代时将新计算的结果存入,并按照需求调整输出顺序[^1]。 --- #### 队列实现杨辉三角 队列是一种先进先出(FIFO)的数据结构,在这里我们同样可以用来构建杨辉三角。具体做法是依次向队列中加入新的数值,并移除旧的数值以便于下一层级的计算。 ```java import java.util.LinkedList; import java.util.Queue; public class YangHuiTriangleWithQueue { public static void main(String[] args) { int rows = 6; Queue<Integer> queue = new LinkedList<>(); for (int i = 0; i < rows; i++) { // 每次循环前记录本行首个元素位置 int size = queue.size(); // 添加新的一行起始'1' if(i == 0){ queue.offer(1); }else{ // 计算中间部分的新值 for(int j=0 ;j<size-1;j++){ int first = queue.poll(); int second = queue.peek(); System.out.print(first+" "); // 输出已处理过的前面项 queue.offer(first+second); // 新增两项相加后的结果到队尾 } // 处理最后一个元素及其对应新增‘1’ int lastElement = queue.poll(); System.out.print(lastElement +" "+1 ); queue.offer(lastElement); queue.offer(1); } System.out.println(); } } } ``` 该程序逻辑清晰地展示了如何借助队列特性动态生成各层节点值[^2]。 --- ### 总结说明 以上提供了两种不同思路下的解决方案——一种依赖于堆叠操作完成逆序访问的要求;另一种则充分发挥了链表型容器支持快速插入删除的优势。两者各有千秋,可根据实际应用场景灵活选用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值