LinkedList的队列用法

具体的LinkedList数据结构参考这个链接

队列用法主要来自于Deque,而Deque又继承自Queue

先从下面一段代码说起吧

public static void main(String[] args) {
Queue<String> queue=new LinkedList<>();
queue.offer("张三");//队列尾部添加元素
queue.offer("李四");
queue.offer("王五");
while (queue.peek()!=null){//返回头部信息,不改变队列
System.out.println(queue.poll());//返回头部元素,改变队列
}

 

如果对于队列的数据结构不了解的话,对上面的注释内容会比较迷糊。
Queue接口主要是使LinkedList具有队列的能力。
队列类似于我们生活中的排队;特点就是先进先出,在尾部添加元素,从头部删除元素。

boolean add(E e);在队列尾部添加元素;(当队列满时,会抛出异常;我从源码中并没有看到抛异常的代码,希望知情者告知一声)

boolean offer(E e);在队列尾部添加元素,队列满时不会抛异常,只是返回false

调用的就是上面的add方法
E remove();删除队列中头部元素,如果是空队列,会抛异常。

E poll();删除头部元素,如果队列为空,不会抛异常,会返回null

E element();查看头部信息,如果空队列会抛异常

E peek();查看头部信息,空队列返回你null

说了了Queue队列的数据结构,那么Deque具体赋予了LinkeList什么能力了呢。
因为Deque是接口,那么本身并没有实现Queue方法的能力。所以可以断定Deque只是扩展了Queue。

Deque<String> deque=new LinkedList<>();
  deque.offer("张三");//队列尾部添加元素
  deque.offer("李四");
  deque.offer("王五");
  deque.addFirst("老郭");
  deque.addLast("老王");
  while (deque.peek()!=null){//返回头部信息,不改变队列
  System.out.print(deque.poll()+" ");//返回头部元素,改变队列
//打印结果:老郭 张三 李四 王五 老王
}

 

从上面的代码我们知道可以在任何地方将元素添加到队列头。
这与上面的Queue的数据结构就不相同了

上面的代码根据方法名结合着Queue的几个方法名,可以知道具体用法;不做赘述了。
如果把Queue比作排队的话,那么Deque就带插队的功能了;不光可以在队尾加元素;还可以在队头插入元素;
并且只能插到队头,无法插到队中间。
我们把Queue称作队列,Deque称作双端队列。
队列和栈数据结构的区别:
1.队列能操作两端;而栈只操作头部。
2.队列是先进先出,而栈是先进后出。

从上面的队列和栈的区别可以发现,他们的实现方法在Deque中都能找到,或者说是双端队列的特殊情况。

顺便说一下java中没有单独的栈接口,但是有一个Stack类;它继承子Vercor这个类。

Statck也实现了栈数据的一些方法,但是和Deque是有本质区别的。

Statck中添加元素是线程安全的;LinkedList不是线程安全的;

Statck操作的是数组;LinkedList操作的是链表结构的数据。


1.在不需要线程安全的情况下,完全可以使用Deque deque=new LinkedList<>()代替。
2.另外Deque deque=new LinkedList<>()也可以代替Queue queue=new LinkedList<>();

 

posted @ 2020-01-10 00:20  思思博士  阅读(3475)  评论(1编辑  收藏  举报