a.js的堆、栈与队列,看完就弄懂了

堆的定义


堆是一种比较特殊的数据结构,可以被看做一棵树的数组对象,具有以下的性质: 堆中某个节点的值总是不大于或不小于其父节点的值; 堆总是一棵完全二叉树。

堆(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由操作系统释放。

以下一张图清晰了解堆:

image-one

通过image-one我们可以看出把a赋值给b,当b对象改变属性后,a也随之发生改变,这是因为a和b引用的是同一个堆对象,从一个向另一个变量复制引用类型的值,复制的其实是指针指针是存放在栈(stack)里面,因此两个变量最终指向同一个对象。即复制的是栈中的地址而不是堆中的对象。

引用数据类型(Object、Array、Function)存储在堆中,堆是运行时申请的动态内存,顺序随意。

项目实际问题

如果项目中需要赋值两个对象且只需要改变新对象的地址以及值,那么我们可以使用JSON.parse(JSON.stringify(value))进行深拷贝赋值。

栈的定义


栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。 栈的特点是:先进后出,或者说是后进先出,从栈顶放入元素的操作叫入栈,取出元素叫出栈。

栈(stack):由编译器自动分配释放,存放函数的参数值,局部变量等

image-two

创建好栈后,栈一般包含以下方法:

push(): 添加新元素到栈顶

pop(): 移除栈顶的元素,同时返回被移除的元素

peek(): 返回栈顶的元素,不对栈做任何修改

isEmpty(): 如果栈里没有任何元素就返回true,否则返回false

clear(): 移除栈里的所有元素

size(): 返回栈里的元素个数


栈的实现


function Stack(){

let dataStore= []

this.push =function(element){    dataStore.push(element)  } 

this.pop =function(){return dataStore.pop()  }

this.peek =function(){return dataStore[dataStore.length -1]  }

this.isEmpty =function(){return dataStore.length ==0}

this.size =function(){return dataStore.length  }

this.clear =function(){    dataStore = [] }

this.print =function(){console.log(dataStore.toString())  }

}

栈的使用

let stack =new Stack()

stack.push('a')

stack.push('b')

stack.push('c')

console.log(stack.peek()) // 3

console.log(stack.size()) // 3

自制入栈图

执行pop()方法后进行出栈,出栈如下图流程:

自制出栈图

出栈也是和入栈相同,都是从栈顶开始出栈,保证栈的后入先出原则

队列


队列与栈一样,也是一种线性表,不同的是,队列可以在一端添加元素,在另一端取出元素,也就是:先进先出。从一端放入元素的操作称为入队,取出元素为出队。

队列在尾部添加新元素,并从顶部移除元素。最新添加的元素必须排在队列的末尾。

队列的方法和栈基本相同,JavaScript中事件轮询(Event Loop)的执行机制,就是采用队列的存取方式,因事件轮询是js比较重要的一个只是点,等下次文章会总结事件轮询。


以上就是对堆、栈、队列的个人总结,理解了js的底层数据原理等等后才能更好的使用vue等框架,有些面试官也会问这几个概念的问题,了解一下对自己也是有好处的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,277评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,777评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,946评论 0 245
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,271评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,636评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,767评论 1 221
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,989评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,733评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,457评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,674评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,155评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,518评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,160评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,114评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,898评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,822评论 2 280
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,705评论 2 273

推荐阅读更多精彩内容