java 数据结构 堆栈队列

(数据结构)堆、二叉堆(java实现)

1.堆是一种完全二叉树:

2.在堆中有两个重要的公式:

已知parent下标,left=2parent+1,right=2parent+2

.
已知child的下标(不分左右) parent=(child-1)/2;

3.堆 逻辑上是一种完全二叉树 物理上是一个数组

4.满足任意位置的值>=它的左右孩子的值 大堆

反之 满足任意位置的值<=它的左右孩子的值 小堆

Stack 栈是Vector的一个子类,它实现了一个标准的后进先出的栈。

堆栈只定义了默认构造函数,用来创建一个空栈。 堆栈除了包括由Vector定义的所有方法,也定义了自己的一些方法 peek pop push

队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。

LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。
Queue queue = new LinkedList();
//添加元素
queue.offer(“a”);
queue.offer(“b”);
queue.offer(“c”);
queue.offer(“d”);
queue.offer(“e”);

数据结构之优先队列–二叉堆(Java实现)
位置从左到右是1,2,3,4,5,6。。。。。等等
仔细观察上述完全二叉树的结构,我们可以发现的是对于任意一个位置i, 结点的左孩子在2i的位置,右孩子在2i+1的位置上,基于上述的性质我们可以使用数组来实现二叉堆。
所以堆 ( 1)逻辑上是一种完全二叉树 ( 2)物理上是一个数组

数据结构队列的学习中,我们知道队列是先进先出的。任务被提交到队列中,按照先进先出的原则

对各个任务进行处理。不过在现实的情况下,任务通常有着优先级的概念,例如短任务、管理员的操作

应该优先执行。
这时使用队列就无法描述了,这种特殊的应用我们使用一种称之为优先队列(也就是堆)的方式

来解决。

优先队列
和队列一样优先队列也支持入队和出队操作,不过区别在于优先队列的出队操作出队的是优先级最高

的元素,
这里以元素的大小来判定任务的优先级,越小,优先级越高。基于这种优先队列的模型,我们可以多种方法对其进行实现,一种常用的方法就是使用链表以O(1)执

行 插入操作,
遍历最小元素并删除花费O(N)时间。基于优先队列的插入操作一般情况下多于删除操作这

一情况, 前者是一种较好的实现。

另外可以使用二叉查找树来实现,这样一来插入和删除操作都是O(logN),不过二叉树支持多种

操作用以实现优先队列未免有点小题大做的感觉。
下面将介绍二叉堆实现优先队列。
二叉堆就结构性质上来说就是一个完全填满的二叉树,满足结构性和堆序性。结构性不必多说,

就是完全二叉树应该满足的树结构。堆序性指的是:父节点的键值总是大于或等于(小于或等于)任何一个子节点的键值,
且每个节点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。

最大堆:当父节点的键值总是大于或等于任何一个子节点的键值。

最小堆:当父节点的键值总是小于或等于任何一个子节点的键值。
…………………………

优先级队列是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素。

PriorityQueue是从JDK1.5开始提供的新的数据结构接口。

如果想实现按照自己的意愿进行优先级排列的队列的话,需要实现Comparator接口。如果不提供Comparator的话,优先队列中元素默认按自然顺序排列,也就是数字默认是小的在队列头,字符串则按字典序排列。

//下面是代码示例

//优先级队列自定义比较器,降序排列
static Comparator cmp = new Comparator() {
public int compare(Integer e1, Integer e2) {
return e2 - e1;
}
};
public static void main(String[] args) {
//不用比较器,默认升序排列
Queue q = new PriorityQueue<>();
q.add(3);
q.add(2);
q.add(4);
while(!q.isEmpty())
{
System.out.print(q.poll()+" ");
}
/**
* 输出结果
* 2 3 4
/
//使用自定义比较器,降序排列
Queue qq = new PriorityQueue<>(cmp);
qq.add(3);
qq.add(2);
qq.add(4);
while(!qq.isEmpty())
{
System.out.print(qq.poll()+" ");
}
/
*
* 输出结果
* 4 3 2
*/
}

评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2020 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值