随机名言

集合中篇—栈与队列



1. 准备

Java的集合实现了栈与队列,我们直接调用就可以实现功能,可是平时就见过Queue、Stack、Deque这些字眼,完全不知道怎么回事,下面就来梳理一下他们的关系,先来看类图(这里简化并只关联了所需要提到的类或接口),下面只说明之前没有提到的内容,没有看过前篇的同学赶紧充电 前篇传送门

  • Stack类(栈),继承了Vector线程安全类,现在不推荐使用,推荐ArrayDeque
  • Queue接口(队列),有Collection方法,而且也新增了自己的方法
  • Deque接口(双向队列),继承了Queue,因为是双向队列,所以可以实现队列和栈的操作
  • 我们之前学过的LinkedList以及ArrayDeque实现Deque接口,即可以作为队列和栈使用


2. Queue

Queue接口不同之处在于同一个功能他有两套方法,两套方法区别于一套是实现返回值,另一套是抛出异常

Throw Exception Return value
增加 add(e) offer(e)
删除 remove() poll()
检查 element() peek()

后面讲解基于抛出异常的方法



3. Deque

double ended queue,意思是双向队列,所以该接口多了操作方法,用于操作头尾,下面讲解部分方法,其余自行查看

方法 解释
addFirst(E e) 队头增加元素
addLast(E e) 队尾增加元素
removeFirst() 队头删除元素,并返回该元素
removeLast() 队尾删除元素,并返回该元素
peekFirst() 返回队头元素,不删除
peekLast() 返回队尾元素,不删除


4. LinkedList

  • 之前我们就学过LinkedList了,底层是双向链表,想不到还支持栈和队列,而且有了头尾操作,实现栈和队列就简单了,我们比较熟悉他,所以栈和队列就基于LinkedList来讲解
  • 栈和队列用头尾操作实现稍微想一下就会理解的,后面列出表格对照

4.1 栈

先进后出的结构,想象成羽毛球筒就行了,先放进去的羽毛球都是最后才能拿出来的

具体实现

public static void main(String[] args) {
	
 	LinkedList linkedList = new LinkedList(); 
	
 	linkedList.addFirst(1);
 	linkedList.addFirst(2);
 	linkedList.addFirst(3);
 	linkedList.addFirst(4);
 	
 	linkedList.removeFirst();
 	
 	//一定要用foreach方法,上篇有解释
 	for(Object i : linkedList){
 		System.out.println(i);
 	}
}
3
2
1

4.2 队列

public static void main(String[] args) {
	
 	LinkedList linkedList = new LinkedList(); 

    linkedList.addLast(1);
    linkedList.addLast(2);
    linkedList.addLast(3);
    linkedList.addLast(4);

    linkedList.removeFirst();

    //一定要用foreach方法,上篇有解释
    for(Object i : linkedList){
        System.out.println(i);
    }
}
2
3
4

4.3 对照表

功能 方法
进栈 addFirst(e)
出栈 remoceFirst()
取栈顶 peekFirst()

队列

功能 方法
进队 addLast(e)
出队 removeFirst()
取队首 peekFirst()

Stack的pop、push、peek方法Deque接口都有,但内部使用的还是addFirst,removeFirst
所以使用Deque的pop方法使用了头插法,遍历顺序是逆序的,建议使用addFirst等可以帮助记忆底层原理



posted @ 2020-01-15 13:47  Howlet  阅读(215)  评论(0编辑  收藏  举报

Copyright © By Howl