JavaScript數(shù)據(jù)結(jié)構(gòu)與算法之棧詳解
1.認(rèn)識(shí)棧
棧:(stack)又名堆棧,它是一種運(yùn)算受限的線性表。遵循后進(jìn)先出(LIFO)
棧頂:限定僅在表尾進(jìn)行插入和刪除操作的線性表,
棧底:限定僅在表頭進(jìn)行插入和刪除操作的線性表。
進(jìn)棧:向一個(gè)棧插入新元素又稱作進(jìn)棧、入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;
出棧:從一個(gè)棧刪除元素又稱作出?;蛲藯?,它是把棧頂元素刪除掉,使其相鄰的元素成為新的棧頂元素
2.面向過(guò)程方法源碼編寫(xiě)棧
2.1思考
面向過(guò)程是什么:
面向過(guò)程就是將解決問(wèn)題的步驟分析出來(lái),
然后用函數(shù)實(shí)現(xiàn),
只要一步一步的執(zhí)行調(diào)用他就可以了。
2.2需要實(shí)現(xiàn)的方法
- push(element)添加一個(gè)或多個(gè)元素到棧頂
- pop()刪除錢(qián)頂?shù)脑?,并返回移除的元?/li>
- peek()返回棧頂?shù)脑?/li>
- isEmpty()用于判斷棧是否為空,空則為空
- clear()用于清空棧的元素
- size()用于返回棧中元素的個(gè)數(shù)
在實(shí)現(xiàn)之前我們思考一下我們?cè)趺磳?shí)現(xiàn)
首先我們借用數(shù)組的方法來(lái)實(shí)現(xiàn),所以我們需要?jiǎng)?chuàng)建
一個(gè)空數(shù)組來(lái)模擬棧
2.3源碼實(shí)現(xiàn),并調(diào)用類(lèi)
構(gòu)建一個(gè)類(lèi),用數(shù)組來(lái)模擬,
在類(lèi)中書(shū)寫(xiě)各種方法
部分調(diào)用數(shù)組的方法。
總的來(lái)說(shuō)就是用類(lèi)來(lái)包裝
數(shù)組的方法來(lái)實(shí)現(xiàn)棧的模擬
class Stack { constructor() { this.item = [] } push(element) { this.item.push(element) } pop() { return this.item.pop() } peek() { return this.item[this.item.length - 1] } isEmpty() { return this.item.length === 0 } clear() { this.item = [] size() { return this.item.length } } //實(shí)例化Stack類(lèi) const stack = new Stack() stack.push(4) stack.push(6) console.log( stack.pop()) console.log(stack.peek()) console.log(stack.isEmpty()) console.log(stack.size())
運(yùn)行結(jié)果:
3.用面向?qū)ο蟮姆椒▉?lái)源碼書(shū)寫(xiě)
3.1思考
面向?qū)ο螅?/strong>
就是將構(gòu)建問(wèn)題的事物,分解成若干個(gè)對(duì)象,
建立對(duì)象不是為了完成某個(gè)步驟,而是為了
描述某個(gè)事物在解決問(wèn)題過(guò)程的行為
3.2需要實(shí)現(xiàn)的方法
- push(element)添加一個(gè)或多個(gè)元素到棧頂
- pop()刪除錢(qián)頂?shù)脑?,并返回移除的元?/li>
- peek()返回棧頂?shù)脑?/li>
- isEmpty()用于判斷棧是否為空,空則為空
- clear()用于清空棧的元素
- size()用于返回棧中元素的個(gè)數(shù)
- toString()用于將棧以字符串的形式打印
那么在實(shí)現(xiàn)這個(gè)類(lèi),我們用對(duì)象來(lái)模擬棧
3.3源碼及使用類(lèi)
class Stack { constructor() { this.count=0 this.items = {} } push(element) { this.items[this.count]=element this.count++ } pop() { if(this.isEmpty()){ return undefined } this.count-- const result=this.items[this.count] delete this.items[this.count] return result } peek() { if(this.isEmpty()){ return undefined } return this.items[this.count-1] } isEmpty() { return this.count===0 } clear() { this.items={} this.count=0 } size() { return this.count } toString(){ if(this.isEmpty()){ return undefined } let objectString=`${this.items[0]}` for(let i=1;i<this.count;i++){ objectString=`${objectString},${this.items[i]}` } return objectString } } const stack = new Stack() stack.push(23) stack.push(34) stack.push(80) console.log( stack.pop()) console.log(stack.peek()) console.log(stack.isEmpty()) console.log(stack.size()) console.log(stack.toString())
在使用對(duì)象來(lái)模擬棧時(shí),采用了鍵:值的方式
來(lái)存儲(chǔ)數(shù)據(jù),比如this.items[this.count]=element
在這個(gè)結(jié)構(gòu)中用this.count來(lái)記錄棧的大小,
當(dāng)我們向里面插入一個(gè)數(shù)字時(shí),就分配count為鍵
插入的值為值。這個(gè)時(shí)候就需要將this.count++.
關(guān)于pop()與peek(),toString()方法都需要
先判斷棧是否為空,如果為空則返回undefined。
4.總結(jié)
- 了解了面向?qū)ο笈c面向過(guò)程
- 掌握了兩種方式用什么來(lái)模擬棧
- 對(duì)棧模擬進(jìn)行源碼設(shè)計(jì)
到此這篇關(guān)于JavaScript數(shù)據(jù)結(jié)構(gòu)與算法之棧詳解的文章就介紹到這了,更多相關(guān)JS棧詳解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- JavaScript樹(shù)形數(shù)據(jù)結(jié)構(gòu)處理
- JavaScript隊(duì)列數(shù)據(jù)結(jié)構(gòu)詳解
- JavaScript數(shù)據(jù)結(jié)構(gòu)與算法
- Javascript數(shù)據(jù)結(jié)構(gòu)之棧和隊(duì)列詳解
- ?JavaScript?數(shù)據(jù)結(jié)構(gòu)之散列表的創(chuàng)建(2)
- JavaScript?數(shù)據(jù)結(jié)構(gòu)之字典方法
- JavaScript?數(shù)據(jù)結(jié)構(gòu)之集合創(chuàng)建(2)
- JavaScript?數(shù)據(jù)結(jié)構(gòu)之集合創(chuàng)建(1)
- JavaScript數(shù)據(jù)結(jié)構(gòu)常見(jiàn)面試問(wèn)題整理
相關(guān)文章
微信小程序開(kāi)發(fā)WXML模板語(yǔ)法基礎(chǔ)教程
這篇文章主要介紹了微信小程序模板語(yǔ)法,WXML(WeiXin?Markup?Language)是框架設(shè)計(jì)的一套標(biāo)簽語(yǔ)言,結(jié)合基礎(chǔ)組件、事件系統(tǒng),可以構(gòu)建出頁(yè)面的結(jié)構(gòu),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08微信小程序點(diǎn)擊view動(dòng)態(tài)添加樣式過(guò)程解析
這篇文章主要介紹了微信小程序點(diǎn)擊view動(dòng)態(tài)添加樣式過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01js+CSS 圖片等比縮小并垂直居中實(shí)現(xiàn)代碼
本例子在在 ff 2.0/ ie6 / ie7 中測(cè)試通過(guò)。但在 opera 8.5 cn中沒(méi)有通過(guò)。希望大家測(cè)試。2008-12-12Bootstrap導(dǎo)航條學(xué)習(xí)使用(一)
這篇文章主要為大家詳細(xì)介紹了Bootstrap導(dǎo)航條的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02Bootstrap CSS組件之分頁(yè)(pagination)和翻頁(yè)(pager)
這篇文章主要介為大家詳細(xì)紹了Bootstrap CSS組件之分頁(yè)和翻頁(yè)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12JavaScript中常見(jiàn)的數(shù)據(jù)類(lèi)型判斷方法小結(jié)
在?JS?編程中,正確判斷數(shù)據(jù)類(lèi)型是必備技能,也是面試常問(wèn)的內(nèi),本文將探討四種常用的數(shù)據(jù)類(lèi)型判斷方法,通過(guò)了解它們的特點(diǎn)和適用范圍,能夠更好地處理不同數(shù)據(jù)類(lèi)型的情況,避免出現(xiàn)錯(cuò)誤和提升代碼質(zhì)量,需要的朋友可以參考下2023-06-06