如果学过数据结构,肯定会遇到“堆”、“栈”、“栈”。这些对于小白来说有点大了。让我们科普一下。什么是堆栈?根据WIKI的定义:栈(英文:stack)是计算机科学中一种特殊的串行抽象数据类型。它的特殊之处在于只能在链表或数组的一端(称为栈顶指针,英文:top)进行数据(英文:push)和输出数据(英文:pop)的操作。此外,栈还可以以一维数组或链表的形式完成。栈的另一种相关操作方法称为队列。需要记住的是堆:顺序是任意的,而栈:后进/先出(Last-In/First-Out)。这里的pop和push是什么意思?其实这是栈数据结构,使用了两个基本操作:push(push,push)和pop(pop,pop):push:将数据放到栈顶(数组形式或串口形式),栈顶指针堆栈加一。弹出:输出(返回)栈顶数据,栈顶数据减一。要理解栈,就要拆开分析。堆的概念:堆(英文:Heap)是计算机科学中一种特殊的树状数据结构。通常是一组对象,可以看作是一棵树。如果满足以下特征,则可以称为堆:“给定堆中的任意节点P和C,如果P是C的父节点,则P的值将小于或等于(或大于或等于)C”的值。如果父节点的值总是小于或等于子节点的值,则称该堆为最小堆(英文:minheap);反之,如果父节点的值总是大于或等于子节点的值,则称该堆为最大堆(英文:maxheap)。堆顶的节点称为根节点(英文:rootnode),根节点本身没有父节点(英文:parentnode)。栈(stack)的概念,也称堆栈,是一个有限操作的线性表。限制是插入和删除操作只允许在表的一端进行。这一端称为栈顶,另一端称为栈底。栈就是一个桶,后放入的先取出,它下面的东西出来后才能出来(先进后出)。线程的操作系统就是线程)为这个线程建立的存储区。该区域具有FIFO的特点,编译时可以指定需要的Stack大小。栈实际上就是栈本身,只是有一个抽象的名字。它的特点是:最后入栈的对象总是最先取出,这种特点通常称为后进先出(LIFO)队列。栈上定义了一些操作。其中最重要的两个就是上面提到的PUSH和POP。PUSH操作将一个元素添加到栈顶,而POP操作则相反,从栈顶移除一个元素并将栈的大小减一。它是如何工作的您可能仍然对它的工作原理感到困惑,所以让我以自助餐盘为例进行解释:经常出现在自助餐厅。每个托盘上都刻有数字。托盘从顶部按顺序装载,每个托盘都放在已装载托盘的顶部,如果需要,弹簧会被压缩以便为更多托盘腾出空间。例如图中托盘编号为42、23、2、9,先装42个托盘,再装9个托盘。最后一个托盘是9号。因此,“最先出来”的盘子也是9号。当客户从堆栈顶部取出一个托盘时,第一个托盘是9号,第二个托盘是2号。然后添加了更多托盘。在我们可以装载第一个托盘之前,这些托盘必须从堆叠中取出。在托盘堆叠的任何推入和弹出序列之后,托盘42保持在底部。只有在42号托盘从堆垛顶部弹出后,堆垛才会再次清空。栈通常放在机器的顶部地址区。它们通常从最高内存位置增长到较低内存位置,从而在程序内存末尾和堆栈“顶部”之间实现内存使用的最大灵活性。堆栈在内存中是“向上”增长还是“向下”增长与我们的讨论无关。堆栈的“顶部”元素是最后被压入并最先弹出的元素。堆栈的“底部”元素在移除时将清空堆栈。两者的区别在于堆是在程序运行时申请一定大小的内存空间,而不是在程序编译时申请。即内存是动态分配的,其访问与一般内存无异。它由程序员分配和释放。栈就是一个桶,后放进去的东西先取出来,本来在下面的东西要出来才能出来。(后进先出)由系统自动分配和回收。栈缓存使用一级缓存。它们通常在调用时存储在存储空间中,调用后立即释放。堆存放在二级缓存中,其生命周期由虚拟机的垃圾回收算法决定(一旦成为孤儿对象就无法回收)。所以调用这些对象的速度比较低。栈的优点是访问速度比堆快,仅次于直接位于CPU中的寄存器。栈:在Windows下,栈是一种向低地址扩展的数据结构,是一块连续的内存区域。就是说栈顶的地址和栈的最大容量都是由系统预先确定的。在WINDOWS下,栈的大小为2M(也有人说是1M,总之是编译时确定的一个常量),如果请求的空间超过栈中没有剩余空间时,就会提示溢出。因此,可以从堆栈中获得更少的空间。堆:堆是一种向高地址扩展的数据结构,是一个不连续的内存区域。这是因为系统使用链表来存储空闲内存地址,这些地址自然是不连续的,而链表的遍历方向是从低地址到高地址。堆的大小受限于计算机系统上可用的虚拟内存。可以看出,堆获取的空间更加灵活,更大。作为一个“堆”数据空间,它必须是灵活的,因为不知道成千上万的程序员在写什么程序。但是我们可以知道的一件事是它们运行在某个操作系统中。因此,它只是系统管理的数据空间的一个名称,叫做栈;程序员使用的空间的一个名称称为堆。
