前往力扣
说在前面——虽然有了数组但是当我们想要限制数据处理的顺序时,我们就可以使用队列和栈。(其实队列和栈就是链表和数组的使用)
队列(FIFO)
队列就是一个先进先出的序列,即first input first output(你可以想象成生活中的排队现象)。可以使用链表构成队列,也可以使用数组构成队列。
注:图片来自于leetcode
队列的声明
Queue<Object> name=new LinkedList<Object>();
//没用实现堵塞的队列- 实现堵塞的队列有五种
BlockingQueue<Object> name=new ArrayBlockingQueue<Object>();
//由数组支持的有界队列
BlockingQueue<Object> name=new LinkedBlockingQueue<Object>();
//由链表支持的可选有界队列
BlockingQueue<Object> name=new PriorityBlockingQueue<Object>();
//由优先级堆支持的无界队列
BlockingQueue<Object> name=new DelayQueue<Object>();
//由优先级堆支持的,基于时间的调度队列
BlockingQueue<Object> name=new SynchronousQueue<Object>();
//一个利用BlockingQueue接口的简单聚合机制的队列
点击查看原文——java队列——queue详细分析
队列的相关操作
- 入队——add(object),offer(object)从队尾入队(两者区别前者当队列的容量不够时返回异常,后者返回false)。
- 出队——remove(),poll()从队首出队(两者区别当队列为空时前者返回异常,后者返回false)。
- 获得队首元素值——element(),peek()(两者区别当队列为空时前者返回抛出异常后者返回false)
- 查询是否为空——isEmpty()。
关于队列所需掌握的知识
- 自己建立一个队列——使用数组(ArrayList)和链表。
- 熟悉系统提供的队列的相关函数的用法。
- 设计一个循环队列——同样你可以尝试使用数组和链表两种方法来实现。
- 使用队列实现BFS(Breadth First Search——广度优先搜索)。
栈(LIFO)
栈就是一个后进先出的序列(Last in,First out),你也可以想象成一筒 薯片(对就是薯片——ps:我没有饿)当你想其中加入薯片时是放在最上面,当你吃时你也是优先吃最上面的。对于栈的实现同样可以使用数组和链表两种方式。(在java中栈Stack继承于Vector,并且其实现是基于数组的)
注:图片来自于leetcode
栈的声明
Stack<Object> name=new Stack<Object>();
栈的相关操作
- 入栈——push()向栈顶加入元素(加入薯片)。
- 出栈——pop()从栈顶中删除元素并返回元素值(吃掉薯片)——如果栈为空抛出异常。
- 获得栈顶元素——peek()查看栈顶元素。
- 栈顶是否为空——isEmpty()查看栈是否为空,返回值是boolean类型。
- 搜索元素所在位置——search(object),返回元素object离栈顶的距离,如果元素不存在则返回-1。
BFS(广度优先搜索)
用途:遍历和搜索数据结构的算法。(主要用于寻找节点之间的最短路径)
是一种图形搜索算法,广度优先搜索顾名思义就是优先在广度上进行搜索,以一颗树为例,广度优先搜索是从顶层一层一层的向下搜索。
使用方式:通常和队列结合使用。
DFS(深度优先搜索)
用途:同广度优先搜索类似,一般用与树、图的遍历和搜索算法。(主要用于遍历)
同样是一种图形搜索算法,以一颗树为例深度优先搜索是以深度为主,沿着一条路径走到树的低端然后再走另一条路径。
使用方式:通常和栈结合使用。