Java集合中的数据结构双向队列
双向队列:与单向队列相比,双向队列在队列两端都可以进行入队和出队的操作,增加了数据的可操作性
下图为双向队列的增删操作
从上图我们可以看到,无论是队头还是队尾,都可以进行数据的增删操作,这样我们就可以根据需要对数据进行添加和删除了。但是无论是单向队列还是双向队列,都是运算受限的线性表
在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的一些常用的增删获取元素的方法,可根据需要使用
今天的分享就到这里了,如果有错误的地方,欢迎大家来指点!
- Java 数据结构之Deque(双向队列)
- 【JAVA数据结构】带dummy节点的双向队列
- Java 数据结构之Deque(双向队列)
- Java基础之集合框架--使用LinkedList模拟堆栈或队列数据结构
- Java基础知识强化之集合框架笔记20:数据结构之 栈 和 队列
- Java数据结构与算法之数据结构-逻辑结构-集合(一)------集合类简析
- Java 实现双向链表,基于双向链表实现双端队列
- 一个用Java实现的双向队列,可以分别在头尾插入和删除节点
- JAVA数据结构---循环队列
- 图解Java数据结构之队列
- 【数据结构】之队列的java实现(一)
- 数据结构之队列的Java实现
- java数据结构,实现栈/队列
- 数据结构(Java)——队列的实现
- Java练习数据结构第3章栈和队列——链队
- Java 模拟堆栈和队列的数据结构存储
- 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_04 数据结构_1_数据结构_栈
- Java集合-HashMap数据结构详解
- java学习笔记-集合之栈和队列
- 数据结构(JAVA版本)练习之集合 简易图书管理系统