使用LinkedList实现队列和栈

LinkedList底层是由双向链表实现的,因此可以支持Queue和Stack。
本文讨论的实现基于JDK8源码。

实现Queue

LinkedList本身实现了Queue接口。

入队

方法签名 接口说明(JDK手册) 代码实现概括(JDK8)
boolean add(E e) 将指定的元素插入此队列(如果立即可行且不会违反容量限制),在成功时返回 true,如果当前没有可用的空间,则抛出 IllegalStateException。 last处插入新节点
boolean offer(E e) 将指定的元素插入此队列(如果立即可行且不会违反容量限制),当使用有容量限制的队列时,此方法通常要优于 add(E),后者可能无法插入元素,而只是抛出一个异常。 直接调用add()

出队

方法签名 接口说明(JDK手册) 代码实现概括(JDK8)
E element() 获取,但是不移除此队列的头。 取首元素,首元素为空则抛NoSuchElementException异常
E peek() 获取但不移除此队列的头;如果此队列为空,则返回 null。 取首元素,首元素为空则返回null
E poll() 获取并移除此队列的头,如果此队列为空,则返回 null。 调用unlinkFirst()移除首元素
E remove() 获取并移除此队列的头。 调用removeFirst(), 比unlinkFirst()多了一个校验,如果首元素为空则抛NoSuchElementException异常

实现Stack

Stack类已经比较老,官方已不推荐使用,推荐使用LinkedList替代。

Stack不推荐使用的原因

  • 扩展于Vector,Vetcor同样不被推荐;会暴露Vector的方法
  • 底层使用数组,有扩容性能问题
  • 方法中加了synchronized,性能问题,同时并不能完全保证并发场景下没有问题

栈操作

方法签名 接口说明(JDK手册) 代码实现概括(JDK8)
push(E e) 将元素推入此列表所表示的堆栈。 调用addFirst() (即linkFirst())
E peek() 获取但不移除此列表的头(第一个元素)。 取首元素,首元素为空则返回null
E poll() 获取并移除此列表的头(第一个元素) 调用unlinkFirst()移除首元素
E pop() 从此列表所表示的堆栈处弹出一个元素。 调用removeFirst(), 比unlinkFirst()多了一个校验,如果首元素为空则抛NoSuchElementException异常
posted @ 2024-07-31 21:27  五岳  阅读(16)  评论(0编辑  收藏  举报
回到顶部