摘要:它們就是棧和隊(duì)列。概念棧是一種遵循后進(jìn)先出原則的有序集合。新添加的或待刪除的元素都保存在棧的末尾,稱作棧頂,另一端就叫棧底。在棧里,新元素都靠近棧頂,舊元素都接近棧底。棧也被用在編程語(yǔ)言的編譯器和內(nèi)存中保存變量方法調(diào)用等,比如函數(shù)的調(diào)用棧。
一、定義 1.1 背景
通過(guò)前面一節(jié)《JavaScript數(shù)據(jù)結(jié)構(gòu)01 - 數(shù)組》我們知道,可以在數(shù)組的任意位置上刪除或添加元素。然而,有時(shí)候我們還需要一種在添加或刪除元素時(shí)有更多控制的數(shù)據(jù)結(jié)構(gòu)。
有兩種數(shù)據(jù)結(jié)構(gòu)類似于數(shù)組,但在添加和刪除元素時(shí)更為可控。
它們就是棧和隊(duì)列。
1.2 概念棧是一種遵循后進(jìn)先出(LIFO)原則的有序集合。新添加的或待刪除的元素都保存在棧的末尾,稱作棧頂,另一端就叫棧底。
在棧里,新元素都靠近棧頂,舊元素都接近棧底。
棧也被用在編程語(yǔ)言的編譯器和內(nèi)存中保存變量、方法調(diào)用等,比如函數(shù)的調(diào)用棧。
二、棧的實(shí)現(xiàn) 2.1 創(chuàng)建一個(gè)類來(lái)表示棧這里我還是用構(gòu)造函數(shù)的形式來(lái)書寫,大家有興趣可以用ES6的Class來(lái)重寫一遍。
// Stack類 function Stack () { this.items = []; this.push = push; this.pop = pop; this.peek = peek; this.isEmpty = isEmpty; this.clear = clear; this.size = size; this.print = print; }
棧里面有一些聲明的方法:
push(element):添加一個(gè)(或幾個(gè))新元素到棧頂
pop():移除棧頂?shù)脑兀瑫r(shí)返回被移除的元素
peek():返回棧頂?shù)脑兀粚?duì)棧做任何修改
isEmpty():如果棧里沒(méi)有任何元素就返回true,否則返回false
clear():移除棧里的所有元素
size():返回棧里的元素個(gè)數(shù)
2.2 實(shí)現(xiàn)棧中的輔助方法// 添加新元素到棧頂 function push (element) { this.items.push(element); } // 移除棧頂元素,同時(shí)返回被移除的元素 function pop () { return this.items.pop(); } // 查看棧頂元素 function peek () { return this.items[this.items.length - 1]; } // 判斷是否為空棧 function isEmpty () { return this.items.length === 0; } // 清空棧 function clear () { this.items = []; } // 查詢棧的長(zhǎng)度 function size () { return this.items.length; } // 打印棧里的元素 function print () { console.log(this.items.toString()); }2.3 創(chuàng)建實(shí)例進(jìn)行測(cè)試
// 創(chuàng)建Stack實(shí)例 var stack = new Stack(); console.log(stack.isEmpty()); // true stack.push(5); // undefined stack.push(8); // undefined console.log(stack.peek()); // 8 stack.push(11); // undefined console.log(stack.size()); // 3 console.log(stack.isEmpty()); // false stack.push(15); // undefined stack.pop(); // 15 console.log(stack.size()); // 3 stack.print(); // 5,8,11 stack.clear(); // undefined console.log(stack.size()); // 0三、結(jié)束
本文會(huì)同步到我的個(gè)人博客,完整代碼可以到我的github倉(cāng)庫(kù)查看,如果對(duì)你有幫助的話歡迎點(diǎn)一個(gè)Star~~
歡迎關(guān)注我的公眾號(hào)文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/96283.html
摘要:作者簡(jiǎn)介是推出的一個(gè)天挑戰(zhàn)。完整指南在從零到壹全棧部落。通過(guò)時(shí)分秒對(duì)一圈度,進(jìn)行映射,確定每一個(gè)指針?biāo)栊D(zhuǎn)的角度。此前的代碼中,每秒都會(huì)重新一個(gè)對(duì)象,用來(lái)計(jì)算角度值,但如果讓這個(gè)角度值一直保持增長(zhǎng),也就不會(huì)出現(xiàn)逆時(shí)針回旋的問(wèn)題了。 Day02 - JavaScript + CSS Clock 作者:?liyuechun 簡(jiǎn)介:JavaScript30 是 Wes Bos 推出的一個(gè)...
摘要:一棧數(shù)據(jù)結(jié)構(gòu)與不同,中并沒(méi)有嚴(yán)格意義上區(qū)分棧內(nèi)存與堆內(nèi)存。引用數(shù)據(jù)類型的值是保存在堆內(nèi)存中的對(duì)象。不允許直接訪問(wèn)堆內(nèi)存中的位置,因此我們不能直接操作對(duì)象的堆內(nèi)存空間。為了更好的搞懂變量對(duì)象與堆內(nèi)存,我們可以結(jié)合以下例子與圖解進(jìn)行理解。 showImg(https://segmentfault.com/img/remote/1460000009784102?w=1240&h=683); ...
摘要:關(guān)于點(diǎn)擊進(jìn)入項(xiàng)目是我于開始的一個(gè)項(xiàng)目,每個(gè)工作日發(fā)布一道面試題。即使這個(gè)時(shí)間周期內(nèi),小明取得多次滿分。創(chuàng)建作用域鏈在執(zhí)行期上下文的創(chuàng)建階段,作用域鏈?zhǔn)窃谧兞繉?duì)象之后創(chuàng)建的。這種一層一層的關(guān)系,就是作用域鏈。 關(guān)于【Step-By-Step】 Step-By-Step (點(diǎn)擊進(jìn)入項(xiàng)目) 是我于 2019-05-20 開始的一個(gè)項(xiàng)目,每個(gè)工作日發(fā)布一道面試題。每個(gè)周末我會(huì)仔細(xì)閱讀大家的答...
摘要:關(guān)于點(diǎn)擊進(jìn)入項(xiàng)目是我于開始的一個(gè)項(xiàng)目,每個(gè)工作日發(fā)布一道面試題。即使這個(gè)時(shí)間周期內(nèi),小明取得多次滿分。創(chuàng)建作用域鏈在執(zhí)行期上下文的創(chuàng)建階段,作用域鏈?zhǔn)窃谧兞繉?duì)象之后創(chuàng)建的。這種一層一層的關(guān)系,就是作用域鏈。 關(guān)于【Step-By-Step】 Step-By-Step (點(diǎn)擊進(jìn)入項(xiàng)目) 是我于 2019-05-20 開始的一個(gè)項(xiàng)目,每個(gè)工作日發(fā)布一道面試題。每個(gè)周末我會(huì)仔細(xì)閱讀大家的答...
摘要:前端日?qǐng)?bào)精選譯,和的未來(lái)學(xué)習(xí)筆記箭頭函數(shù)學(xué)習(xí)筆記教程?hào)鸥癫季志硗林貋?lái),用還是為什么我會(huì)選擇而不是眾成翻譯原生開發(fā)入門完全教程從零到壹全棧部落中文一個(gè)端帶文件路徑和顏色的攻城方略譯使用提高應(yīng)用程序的種方式中自定義操作符修仙 2017-07-02 前端日?qǐng)?bào) 精選 [譯] TC39,ECMAScript 和 JavaScript 的未來(lái)(Part 1)ES6學(xué)習(xí)筆記:箭頭函數(shù)_ES6, Ja...
閱讀 4373·2021-11-22 09:34
閱讀 2696·2021-11-12 10:36
閱讀 749·2021-08-18 10:23
閱讀 2645·2019-08-30 15:55
閱讀 3121·2019-08-30 15:53
閱讀 2087·2019-08-30 15:44
閱讀 1368·2019-08-29 15:37
閱讀 1412·2019-08-29 13:04