*Java双端队列的知识
Deque
接口是 double ended queue 的缩写,即双端队列,支持在队列的两端插入和删除元素,继承 Queue
接口。public interface Deque extends Queue
Deque
的 12 种方法总结如下:
- 插入:
- 如果操作失败则抛出异常
void addFirst(Object e)
void addLast(Object e)
- 如果操作失败则返回一个特殊值(
null
或false
)boolean offerFirst(Object e)
boolean offerLast(Object e);
- 如果操作失败则抛出异常
- 删除:
- 如果操作失败则抛出异常
Object removeFirst()
Object removeLast()
- 如果操作失败则返回一个特殊值(
null
或false
)Object pollFirst()
Object pollLast()
- 如果操作失败则抛出异常
- 获取:
- 如果操作失败则抛出异常
Object getFirst()
Object getLast()
- 如果操作失败则返回一个特殊值(
null
或false
)Object peekFirst()
Object peekLast()
- 如果操作失败则抛出异常
Deque
与 List
不同,该接口不支持下标访问元素。Deque
的实现并不严格要求禁止插入元素 null
,但强烈鼓励不插入 null
。任何 Deque
的实现都强烈鼓励不要插入 null
,因为 null
是多种方法作为一种特殊返回值来表示 Deque
为空。
ArrayDeque
和 LinkedList
类是 Deque
接口的两个实现类:
ArrayDeque
类由数组支持。适合当作堆栈使用。LinkedList
类由链表支持。适合当作FIFO队列使用。
*代码
import java.util.Deque;
import java.util.LinkedList;
public class DequeTest {
public static void main(String[] args) {
Deque<String> deque = new LinkedList<String>();
deque.add("d");
deque.add("e");
deque.add("f");
//从队首取出元素,不会删除
System.out.println("队首取出元素:"+deque.peek());
System.out.println("队列为:"+deque);
//从队首加入元素(队列有容量限制时用,无则用addFirst)
deque.offerFirst("c");
System.out.println("队首加入元素后为:"+deque);
//从队尾加入元素(队列有容量限制时用,无则用addLast)
deque.offerLast("g");
System.out.println("队尾加入元素后为:"+deque);
//队尾加入元素
deque.offer("h");
System.out.println("队尾加入元素后为:"+deque);
//获取并移除队列第一个元素,pollFirst()也是,区别在于队列为空时,removeFirst会抛出NoSuchElementException异常,后者返回null
deque.removeFirst();
System.out.println("获取并移除队列第一个元素后为:"+deque);
//获取并移除队列第一个元素,此方法与pollLast 唯一区别在于队列为空时,removeLast会抛出NoSuchElementException异常,后者返回null
deque.removeLast();
System.out.println("获取并移除队列最后一个元素后为:"+deque);
//获取队列第一个元素.此方法与 peekFirst 唯一的不同在于:如果此双端队列为空,它将抛出NoSuchElementException,后者返回null
System.out.println("获取队列第一个元素为:"+deque.getFirst());
System.out.println("获取队列第一个元素后为:"+deque);
//获取队列最后一个元素.此方法与 peekLast 唯一的不同在于:如果此双端队列为空,它将抛出NoSuchElementException,后者返回null
System.out.println("获取队列最后一个元素为:"+deque.getLast());
System.out.println("获取队列第一个元素后为:"+deque);
//循环获取元素并在队列移除元素
while(deque.size()>0){
System.out.println("获取元素为:"+ deque.pop()+" 并删除");
}
System.out.println("队列为:"+deque);
}
}