java 双端队列_Java 双端队列接口 Deque

Deque 是一种支持在两端进行操作的线性结构,包含了栈和队列的功能。Java 中建议使用 Dqueue 的实现来替代遗留的 Stack 类。本文将介绍 Deque 提供的主要 API。

双端操作 API

Deque 的核心 API 可以按照操作头部和尾部分为两类,并可以进一步按照抛出异常和返回特殊值进行进一步划分。

Deque 方法汇总

头部操作

尾部操作

抛出异常

返回特殊值

抛出异常

返回特殊值

插入

addFirst(e)

offerFirst(e)

addLast(e)

offerLast(e)

删除

removeFirst()

pollFirst()

removeLast()

pollLast()

获取

getFirst()

peekFirst()

getLast()

peekLast()

需要注意的是,某些 Deque 的实现(如 ArrayDeque)在调用 offerFirst(e), offerLast(e) 时,若传入的 e 为 null,仍然会抛出 NullPointerEaception,而另一些实现则不会(如 LinkedList)。

descendingIterator()

返回一个迭代器,迭代器从尾部往头部方向返回元素。

removeFirstOccurrence(Object o) / removeLastOccurrence(Object o)

移除首次/最后出现的元素 o,Deque 中可以放入重复元素,首次出现的意思是距离头部最近的与 o 相等的元素,同理,最后出现的意思是距离尾部最近的与 o 相等的元素。

队列

Deque 继承了 Queue 接口,因此也提供了队列相关操作的东西。进行队列的操作本质是双端队列的 API 换了个名字,只需要将名字对应起来即可。

Queue 方法

对应的 Deque 方法

add(e)

addLast(e)

offer(e)

offerLast(e)

remove()

removeFirst()

poll()

pollFirst()

element()

getFirst()

peek()

peekFirst()

与队列类似,栈的 API 也时部分双端队列 API 换了了名字。

Stack 方法

对应的 Deque 方法

push(e)

addFirst(e)

pop()

removeFirst()

peek()

peekFirst()

Deque 的实现

Deque 是线性结构,实现方式分类两类,一类基于数组,典型代表是 ArrayDeque;另一类基于链表,典型代表是 LinkedList。这两个典型代表的详细介绍参考下面两篇博客:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/* * 基于双向链表实现双端队列结构 */ 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、付费专栏及课程。

余额充值