java中的队列 单项队列 双向队列,Java集合中的数据结构双向队列

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

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

1f677e35944922bc5588b730fc6b7ecb.png

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

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

9fc432d4ecd47722911fabef938deccc.png

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

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

//获取双向队列的对象,实例类可用ArrayDeque或者LinkedList

//Deque deque = new ArrayDeque();

Deque deque = new LinkedList();

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

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 deque = new ArrayDeque();

Deque deque = new LinkedList();

//添加数据

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 deque = new LinkedList();

//添加数据

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 deque = new LinkedList();

//添加数据

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的一些常用的增删获取元素的方法,可根据需要使用

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

标签:deque,Java,队列,打印,System,println,数据结构,hello

来源: https://blog.csdn.net/m0_48008264/article/details/106771098

/* * 基于双向链表实现双端队列结构 */ package dsa; public class Deque_DLNode implements Deque { protected DLNode header;//指向头节点(哨兵) protected DLNode trailer;//指向尾节点(哨兵) protected int size;//队列元素的数目 //构造函数 public Deque_DLNode() { header = new DLNode(); trailer = new DLNode(); header.setNext(trailer); trailer.setPrev(header); size = 0; } //返回队列元素数目 public int getSize() { return size; } //判断队列是否为空 public boolean isEmpty() { return (0 == size) ? true : false; } //取首元素(但不删除) public Object first() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); return header.getNext().getElem(); } //取末元素(但不删除) public Object last() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); return trailer.getPrev().getElem(); } //在队列前端插入新节点 public void insertFirst(Object obj) { DLNode second = header.getNext(); DLNode first = new DLNode(obj, header, second); second.setPrev(first); header.setNext(first); size++; } //在队列后端插入新节点 public void insertLast(Object obj) { DLNode second = trailer.getPrev(); DLNode first = new DLNode(obj, second, trailer); second.setNext(first); trailer.setPrev(first); size++; } //删除首节点 public Object removeFirst() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); DLNode first = header.getNext(); DLNode second = first.getNext(); Object obj = first.getElem(); header.setNext(second); second.setPrev(header); size--; return(obj); } //删除末节点 public Object removeLast() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); DLNode first = trailer.getPrev(); DLNode second = first.getPrev(); Object obj = first.getElem(); trailer.setPrev(second); second.setNext(trailer); size--; return(obj); } //遍历 public void Traversal() { DLNode p = header.getNext(); while (p != trailer) { System.out.print(p.getElem()+" "); p = p.getNex
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值