堆是一块动态内存,栈是先进后出的堆的一种方法,队列是一种先进先出的线性表
0.利用redis的list数据类型构造栈和队列:
List类型
常用命令:
lpush(从list最左边加入元素)、lpop(从list最左边取出元素)、
rpush(从list最右边加入元素)、rpop(从list最右边取出元素)
lrange(按区间取元素)、blpop(从list最左边取出元素,没有元素则会按设置的时间阻塞等待)、
brpop(从list最右边取出元素,没有元素则会按设置的时间阻塞等待)
应用场景举例:
(1)构造数据结构:栈(lpush-lpop/rpush-rpop)、队列(lpush-rpop/rpush-lpop)、阻塞队列(lpush-brpop/rpush-blpop)
-
堆
堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。堆是指程序运行时申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。
2.2 堆简介
2.2.1 堆的性质
堆是一种常用的树形结构,是一种特殊的完全二叉树,当且仅当满足所有节点的值总是不大于或不小于其父节点的值的完全二叉树被称之为堆。堆的这一特性称之为堆序性。因此,在一个堆中,根节点是最大(或最小)节点。如果根节点最小,称之为小顶堆(或小根堆),如果根节点最大,称之为大顶堆(或大根堆)。堆的左右孩子没有大小的顺序。下面是一个小顶堆示例:
堆的存储一般都用数组来存储堆,i节点的父节点下标就为(i–1)/2(i – 1) / 2(i–1)/2。它的左右子节点下标分别为 2∗i+12 * i + 12∗i+1 和 2∗i+22 * i + 22∗i+2。如第0个节点左右子节点下标分别为1和2。
2.2.2 堆的基本操作
(1)建立
以最小堆为例,如果以数组存储元素时,一个数组具有对应的树表示形式,但树并不满足堆的条件,需要重新排列元素,可以建立“堆化”的树。
(2)插入
将一个新元素插入到表尾,即数组末尾时,如果新构成的二叉树不满足堆的性质,需要重新排列元素,下图演示了插入15时,堆的调整。
(3)删除。
堆排序中,删除一个元素总是发生在堆顶,因为堆顶的元素是最小的(小顶堆中)。表中最后一个元素用来填补空缺位置,结果树被更新以满足堆条件。
原文链接:https://blog.csdn.net/K346K346/article/details/80849966
-
栈(stack)——先进后出,删除与加入均在栈顶操作
栈也称为堆栈,是一种线性表。
堆栈的特性: 最先放入堆栈中的内容最后被拿出来,最后放入堆栈中的内容最先被拿出来, 被称为先进后出、后进先出。
堆栈中两个最重要的操作是PUSH和POP,两个是相反的操作。
PUSH:在堆栈的顶部加入一 个元素。
POP:在堆栈顶部移去一个元素, 并将堆栈的大小减一。
堆与栈的区别总结如下:
- 队列——先进先出
队列也是一种特殊的线性表。不同于栈所服从的先进后出的原则,队列的原则是先进先出。
队列在队头做删除操作,在队尾做插入操作:
原文链接:https://blog.csdn.net/m0_37622530/article/details/81429837