您的位置:首页 > 理论基础 > 数据结构算法

Java集合中的数据结构双向队列

2020-06-29 04:52 731 查看

双向队列:与单向队列相比,双向队列在队列两端都可以进行入队和出队的操作,增加了数据的可操作性

下图为双向队列的增删操作

从上图我们可以看到,无论是队头还是队尾,都可以进行数据的增删操作,这样我们就可以根据需要对数据进行添加和删除了。但是无论是单向队列还是双向队列,都是运算受限的线性表

在java集合体系中也存在双向队列的接口Deque,下图为Collection集合的继承体系

Deque是双向队列接口,是队列Queue的子接口;是指队列两端的元素既能入队,也能出队

如果我们需要创建Deque创建实例化对象,可以通过他的子类ArrayDeque或者LinkedList(下面演示使用LinkedList)进行创建

//获取双向队列的对象,实例类可用ArrayDeque或者LinkedList
//Deque<String> deque = new ArrayDeque<String>();
Deque<String> deque = new LinkedList<String>();

同样,双向队列也是集合体系中的,依然可以通过泛型来指定存储的数据类型

1.数据的入队(添加)
既然是双向队列,那么无论是队头还是队尾都可以添加数据
void addFirst(E e)
void addLast(E e)
boolean offerFirst(E e) // 推荐替换addFirst(E e)
boolean offerLast(E e) // 推荐替换addLast(E e)

//获取双向队列的对象,实例类可用ArrayDeque或者LinkedList
//Deque<String> deque = new ArrayDeque<String>();
Deque<String> deque = new LinkedList<String>();//添加数据
deque.addFirst("hello");
//打印一次
System.out.println(deque);//打印结果:[hello]
//从前面添加数据
deque.offerFirst("java");
//打印二次
System.out.println(deque);//打印结果:[java, hello]
//从后面添加数据
deque.offerLast("world");
//打印第三次
System.out.println(deque);//打印结果:[java, hello, world]

这里以hello为中心,我们通过打印结果可以知道,数据被分别添加到了hello的前面-java和后面-world,使用上述方式就实现了双向队列的入队了

2.数据的出队(删除)
E pollFirst() // 删除头元素并返回
E pollLast() // 删除尾元素并返回
E removeFirst() // 删除头元素并返回,但是如果队列为空,会抛出异常
E removeLast() // 删除尾元素并返回,但是如果队列为空,会抛出异常

//获取双向队列的对象,实例类可用ArrayDeque或者LinkedList
Deque<String> deque = new LinkedList<String>();
//添加数据
deque.offerFirst("hello");
deque.offerFirst("java");
deque.offerFirst("world");
//打印一次
System.out.println(deque);//打印结果:[world, java, hello]
//删除头元素
System.out.println(deque.pollFirst());//打印结果为:world
//删除后打印
System.out.println(deque);//打印结果为:[java, hello]
//删除尾元素
System.out.println(deque.pollLast());//打印结果:hello
//删除后打印
System.out.println(deque);//打印结果:[java]

对于上述的方法推荐使用poll的,防止因空队列带来的异常;
通过上面的打印结果可以看到,上述方法实现了删除队列的队头和队尾的元素并返回了被删除的元素,可根据需要调用

3.数据的获取
E getFirst()
E getLast()
E peekFirst() // 推荐替换getFirst,防止NoSuchElementExcetion
E peekLast() // 推荐替换getLast,防止NoSuchElementExcetion

//获取双向队列的对象,实例类可用ArrayDeque或者LinkedList
Deque<String> deque = new LinkedList<String>();
//添加数据
deque.offerFirst("hello");
deque.offerFirst("java");
deque.offerFirst("world");
//获取头元素
System.out.println(deque.peekFirst());//打印结果为:world
//打印队列
System.out.println(deque);//打印结果为:[world, java, hello]
//获取尾元素
System.out.println(deque.peekLast());//打印结果为:hello
//打印队列
System.out.println(deque);//打印结果为:[world, java, hello]

使用上述方法的时候,可以直接获取到头元素和尾元素,并且不会删除队列中的元素;对于删除并获取和直接获取根据需要调用

上述分享了一些关于双向队列Deque的一些常用的增删获取元素的方法,可根据需要使用

今天的分享就到这里了,如果有错误的地方,欢迎大家来指点!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: