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

更新时间:2020-06-24 16:00:30点击次数:292次
双向队列:与单向队列相比,双向队列在队列两端都可以进行入队和出队的操作,增加了数据的可操作性

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

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

在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]

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

本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息
  • 项目经理 点击这里给我发消息