堆和栈的基本概念

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆和栈的基本概念相关的知识,希望对你有一定的参考价值。

  JS中有基本数据类型和引用数据类型,基本数据类型包括了Number、Boolean、String、Null、Undefined和Symbol这些数据类型,引用数据类型包括了Array、Object等数据类型,基本数据类型存放在栈中,而引用数据类型存放在堆中,那么对于数据结构中的堆和栈来说,两者有何区别呢?

  直观来看,当一个变量存储数据放在栈中,使用和复制该变量,只是改变了存储的数据,并没有影响这个变量,比如:

let a = 1;
let b = a;
b = 2;

  a、b都是数字类型的数据,将a的数据复制给b,是将a存放的1传递给b,对b进行操作不会影响到a本身。那么如果数据是存放在堆中呢?

let arr1 =  [1, 2, 3, 4, 5];
let arr2 = arr1;
arr2[2] = 10;

 

  列举两个数组,将数组1复制给数组2,引用数据是对数组内数据的指向,当改变数组2第三个数时,数组1的第三个数也会被改变。

  在网上常常能看到把堆比喻成一颗倒的树,将栈比喻成一个箱子。堆(heap)是一种经过排序的树形数据结构,每个结点都有一个值。堆中某个节点的值总是不大于或不小于其父节点的值。堆总是一棵完全二叉树。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。应用程序在运行的时候请求操作系统分配给自己内存,一般是申请/给予的过程。

  栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。栈就像一个桶或者箱子,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来(先进后出,而堆是先进先出),栈是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有FIFO(first-in-first-out)的特性,在编译的时候可以指定需要的Stack的大小。

  另外有个说法是堆栈,堆栈本身就是栈,只是换了个抽象的名字。堆栈中,最后一个放入堆栈中的物体总是被最先拿出来, 这个特性通常称为后进先出(LIFO)队列。 堆栈中定义了一些操作。 两个最重要的是PUSH和POP。 PUSH操作在堆栈的顶部加入一 个元素。POP操作相反, 在堆栈顶部移去一个元素, 并将堆栈的大小减一。

 

以上是关于堆和栈的基本概念的主要内容,如果未能解决你的问题,请参考以下文章

内存堆和栈的区别

(转)内存堆和栈的区别

内存堆和栈的区别

Linux程序存储结构与进程结构 堆和栈的差别

堆和栈的概念和区别

堆和栈的概念和区别