a.js的堆、棧與隊(duì)列,看完就弄懂了

堆的定義


堆是一種比較特殊的數(shù)據(jù)結(jié)構(gòu),可以被看做一棵樹(shù)的數(shù)組對(duì)象,具有以下的性質(zhì): 堆中某個(gè)節(jié)點(diǎn)的值總是不大于或不小于其父節(jié)點(diǎn)的值; 堆總是一棵完全二叉樹(shù)。

堆(heap):一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時(shí)可能由操作系統(tǒng)釋放。

以下一張圖清晰了解堆:

image-one

通過(guò)image-one我們可以看出把a(bǔ)賦值給b,當(dāng)b對(duì)象改變屬性后,a也隨之發(fā)生改變,這是因?yàn)閍和b引用的是同一個(gè)堆對(duì)象,從一個(gè)向另一個(gè)變量復(fù)制引用類型的值,復(fù)制的其實(shí)是指針,指針是存放在棧(stack)里面,因此兩個(gè)變量最終指向同一個(gè)對(duì)象。即復(fù)制的是棧中的地址而不是堆中的對(duì)象。

引用數(shù)據(jù)類型(Object、Array、Function)存儲(chǔ)在堆中,堆是運(yùn)行時(shí)申請(qǐng)的動(dòng)態(tài)內(nèi)存,順序隨意。

項(xiàng)目實(shí)際問(wèn)題

如果項(xiàng)目中需要賦值兩個(gè)對(duì)象且只需要改變新對(duì)象的地址以及值,那么我們可以使用JSON.parse(JSON.stringify(value))進(jìn)行深拷貝賦值。

棧的定義


棧是一種特殊的線性表,僅能在線性表的一端操作,棧頂允許操作,棧底不允許操作。 棧的特點(diǎn)是:先進(jìn)后出,或者說(shuō)是后進(jìn)先出,從棧頂放入元素的操作叫入棧,取出元素叫出棧。

棧(stack):由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量等

image-two

創(chuàng)建好棧后,棧一般包含以下方法:

push(): 添加新元素到棧頂

pop(): 移除棧頂?shù)脑?,同時(shí)返回被移除的元素

peek(): 返回棧頂?shù)脑兀粚?duì)棧做任何修改

isEmpty(): 如果棧里沒(méi)有任何元素就返回true,否則返回false

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

size(): 返回棧里的元素個(gè)數(shù)


棧的實(shí)現(xiàn)


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

自制入棧圖

執(zhí)行pop()方法后進(jìn)行出棧,出棧如下圖流程:

自制出棧圖

出棧也是和入棧相同,都是從棧頂開(kāi)始出棧,保證棧的后入先出原則

隊(duì)列


隊(duì)列與棧一樣,也是一種線性表,不同的是,隊(duì)列可以在一端添加元素,在另一端取出元素,也就是:先進(jìn)先出。從一端放入元素的操作稱為入隊(duì),取出元素為出隊(duì)。

隊(duì)列在尾部添加新元素,并從頂部移除元素。最新添加的元素必須排在隊(duì)列的末尾。

隊(duì)列的方法和?;鞠嗤琂avaScript中事件輪詢(Event Loop)的執(zhí)行機(jī)制,就是采用隊(duì)列的存取方式,因事件輪詢是js比較重要的一個(gè)只是點(diǎn),等下次文章會(huì)總結(jié)事件輪詢。


以上就是對(duì)堆、棧、隊(duì)列的個(gè)人總結(jié),理解了js的底層數(shù)據(jù)原理等等后才能更好的使用vue等框架,有些面試官也會(huì)問(wèn)這幾個(gè)概念的問(wèn)題,了解一下對(duì)自己也是有好處的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容