一、数据结构中的堆与栈
在数据结构中,堆与栈为两种常见数据结构,数据结构共分为三大类:表、树、图,堆为树类数据结构,栈为表类数据结构。
堆:
堆是一种经过排序的树形数据结构。每一个结点都有一个值,像一棵倒过来的树。通常我们所说的堆的数据结构,是指二叉堆。堆的特点是根结点的值最小(或最大)。且根结点的两个子树也是一个堆。因为堆的这个特性,经常使用来实现优先队列,堆的存取是随意。这就如同我们在图书馆的书架上取书,尽管书的摆放是有顺序的。可是我们想取随意一本时不必像栈一样,先取出前面全部的书。书架这样的机制不同于箱子,我们能够直接取出我们想要的书。
栈:
栈是一种具有后进先出性质的数据结构,也就是说后存放的先取,就像装数据的桶或箱子。在编程领域,常用来做递归操作的底层结构。
二、内存分配中的堆与栈
内存中的栈区处于相对较高的地址以地址的增长方向为上的话,栈地址是向下增长的。栈中分配局部变量空间。堆区是向上增长的用于分配程序猿申请的内存空间。堆是向高地址扩展的数据结构,是不连续的内存区域。这是因为系统是用链表来存储的空暇内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。使用栈就象我们去饭馆里吃饭。仅仅管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的优点是快捷,可是自由度小。 使用堆就象是自己动手做喜欢吃的菜肴。比较麻烦。可是比较符合自己的口味,并且自由度大。
堆:
堆区(heap) 一般由程序猿分配释放。若程序猿不释放,程序结束时可能由OS回收 ,与数据结构中的堆是两回事,分配方式倒是类似于链表。
栈:
栈区(stack)由编译器自己主动分配释放 。存放函数的參数值,局部变量的值等,其操作方式类似于数据结构中的栈。