Java基础数据结构——队列和栈
1. Queue
1.1 Queue 介绍
Queue(队列)是一种FIFO(First In First Out)的有序表,只有两个操作:
- 入队(从队列末尾)
- 出队(从队列头部)
超市收银台就是一个队列(先进先出)

1.2 Queue 使用
在 Java 中 LinkedList 类实现了 Queue 接口,因此我们可以把 LinkedList 当成 Queue 来用:

import java.util.LinkedList;
import java.util.Queue;
Queue<String> queue = new LinkedList<String>();
利用以上代码,我们就创建了队列 queue。常用的入队、出队和获取栈顶元素(探顶)有以下两组方法
| throw Exception | 返回false或null | |
|---|---|---|
| 入队 | add(E e) | boolean offer(E e) |
| 出队 | E remove() | E poll() |
| 探顶 | E element() | E peek() |
- 当往一个有大小限制且已经满了的队列添加元素时,如果用 add() 方法就会抛出
IllegalStateException异常,而用offer()方法只会返回false; - 当队列为空时,用
remove()方法会抛出NoSuchElementException异常,而poll()方法只是返回null; - 当队列为空时,用
element()方法会抛出NoSuchElementException异常,而peek()方法只是返回null;
注意:
- 一般情况下,推荐使用
offer(),poll(),peek()来专门操作队列; - 不要把 null 添加到队列中, 否则利用
poll()方法返回null时,无法确定是队列中的null元素还是队列为空
2. Deque
2.1 Deque 介绍
首选声明 Deque 不念 ‘DQ’,而是念 ‘Deck’
Deque (Double Ended Queue) 是双端队列,与 Queue 只允许队列尾入队,队列头出队所不同,Deque 允许两头出入。
我们来比较一下 Queue 和 Deque 出队和入队的方法:
| Queue | Deque | |
|---|---|---|
| 入队(尾) | add(E e) / boolean offer(E e) | addLast(E e) / offerLast(E e) |
| 出队(首) | E remove() / E poll() | E removeFirst() / E pollFirst() |
| 探顶 | E element() / E peek() | E getFirst() / E peekFirst() |
| 入队(首) | 无 | addFirst(E e) / offerFirst(E e) |
| 出队(尾) | 无 | E removeLast() / E pollLast() |
| 嗅尾 | 无 | E getLast() / E peekLast() |
注意:
- 跟
Queue类似,add* remove get* 方法会报Exception,而 offer* poll* peek* 方法返回null Queue提供的add()/offer()方法在Deque中也可以使用,但是,使用Deque,最好不要调用offer(),而是调用offerLast()- 使用
Deque,推荐总是明确调用offerLast()/offerFirst()或者pollFirst()/pollLast()方法
Deque 是一个接口,它的实现类有 ArrayDeque和 LinkedList Stack,ArrayDeque,LinkedList的区别:
- 不推荐使用Vector以及其子类Stack
- 频繁的插入、删除操作:LinkedList
- 频繁的随机访问操作:ArrayDeque
- 未知的初始数据量:LinkedList
3. Stack
注意,由于历史原因,我们现在使用的栈不是 java.util 包下的Stack,而是将 Deque 作为栈结构来使用!!!且作为栈使用时,只调用push()/pop()/peek()方法,不要调用addFirst()/removeFirst()/peekFirst()方法,这样代码更加清晰。
Deque<String> stack = new LinkedList();
stack.push("123");
stack.push("456");
String str1 = stack.peek();
String str = stack.pop();

本文介绍了Java中的Queue和Deque数据结构,包括它们的FIFO/双端特性,常用方法如入队、出队、探顶,并对比了Stack的使用方式。特别强调了LinkedList在这些数据结构中的应用和注意事项。

被折叠的 条评论
为什么被折叠?



