摘要:前言棧是一種高效的數(shù)據(jù)結(jié)構(gòu),因?yàn)閿?shù)據(jù)只能在棧頂添加或刪除,所以這樣的操作很快且很容易實(shí)現(xiàn)。棧被稱為一種后入先出,的數(shù)據(jù)結(jié)構(gòu)。二構(gòu)造棧數(shù)據(jù)結(jié)構(gòu)我們將使用實(shí)現(xiàn)棧結(jié)構(gòu),各部分功能使用注釋說明。參考資料數(shù)據(jù)結(jié)構(gòu)與算法描述第章棧
前言
棧是一種高效的數(shù)據(jù)結(jié)構(gòu),因?yàn)閿?shù)據(jù)只能在棧頂添加或刪除,所以這樣的操作很快且很容易實(shí)現(xiàn)。
一、什么是棧棧是一種特殊的列表,棧內(nèi)的元素只能通過列表的一端訪問,這一端稱之為棧頂。
棧被稱為一種后入先出(LIFO,last-in-first-out)的數(shù)據(jù)結(jié)構(gòu)。
由于棧具有后入先出的特點(diǎn),所以任何不在棧頂?shù)脑囟紵o法訪問,我們必須先拿掉上面的元素才能訪問其棧底的元素。
對(duì)棧的主要操作是將一個(gè)元素壓入棧和將一個(gè)元素彈出棧,入棧使用push()方法,出棧使用pop()方法。
我們將使用JavaScript實(shí)現(xiàn)棧結(jié)構(gòu),各部分功能使用注釋說明。
存儲(chǔ)數(shù)據(jù)我們使用的是數(shù)組。
/** * Stack 構(gòu)造方法 */ function Stack () { this.dataStore = [] this.top = 0 this.push = push this.pop = pop this.peek = peek this.clear = clear this.length = length } /** * push() 該方法用于向棧壓入元素 * 向棧中壓入一個(gè)新元素,將其保存在數(shù)組中變量top所對(duì)應(yīng)的位置 * 然后將 top + 1 讓其指向數(shù)組中下一個(gè)空位置 * @param {*} element */ function push (element) { this.dataStore[this.top++] = element } /** * pop() 該方法用于從棧頂推出元素 * 返回棧頂元素,同時(shí)將變量top - 1 */ function pop () { return this.dataStore[--this.top] } /** * peek() 該方法用于返回?cái)?shù)組的第 top - 1 個(gè)位置的元素 */ function peek () { return this.dataStore[this.top - 1] } /** * length() 該方法用于獲取棧的長度 * 返回當(dāng)前top值即可獲得棧內(nèi)元素個(gè)數(shù) */ function length () { return this.top } /** * clear() 該方法用于清空棧 * 將top設(shè)為0 */ function clear () { this.top = 0 }三、棧的應(yīng)用 數(shù)制間的相互轉(zhuǎn)換
我們可以利用棧將一個(gè)數(shù)字從一種數(shù)制轉(zhuǎn)換為另一種數(shù)制。
假設(shè)想將數(shù)字n轉(zhuǎn)換為以b為基數(shù)的數(shù)字,實(shí)現(xiàn)的算法如下:
最高位為 n%b,將此位壓入棧。
使用 n/b 代替n。
重復(fù)步驟1和2,直到n等于0,且沒有余數(shù)。
持續(xù)將棧內(nèi)元素彈出,直到棧空,依次將這些元素排列即可。
此算法只針對(duì)基數(shù)為2-9的情況
代碼實(shí)現(xiàn)如下:
function mulBase (num, base) { let s = new Stack() do { s.push(num % base) num = Math.floor(num /= base) } while (num > 0) { let converted = "" while (s.length() > 0) { converted += s.pop() } return converted } }回文
使用棧,我們可以判斷一個(gè)字符串是否為回文。
字符串完整壓入棧內(nèi)后,通過持續(xù)彈出棧中的每一個(gè)字母就可以得到一個(gè)新的字符串,該字符串剛好與原來的字符串順序相反。我們只需要比較兩個(gè)字符串即可。如果相等,就是一個(gè)回文。
function isPalindrome (word) { let s = new Stack() for (let i = 0; i < word.length; ++i) { s.push(word[i]) } let rword = "" while (s.length() > 0) { rword += s.pop() } if (word == rword) { return true } else { return false } }結(jié)束語
以上就是對(duì)JavaScript實(shí)現(xiàn)棧的介紹。
參考資料:數(shù)據(jù)結(jié)構(gòu)與算法JavaScript描述 第4章 棧
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/108010.html
摘要:中有三種數(shù)據(jù)結(jié)構(gòu)棧堆隊(duì)列。前端進(jìn)擊的巨人一執(zhí)行上下文與執(zhí)行棧,變量對(duì)象中解釋執(zhí)行棧時(shí),舉了一個(gè)乒乓球盒子的例子,來演示棧的存取方式,這里再舉個(gè)栗子搭積木。對(duì)于基本類型,棧中存儲(chǔ)的就是它自身的值,所以新內(nèi)存空間存儲(chǔ)的也是一個(gè)值。 面試經(jīng)常遇到的深淺拷貝,事件輪詢,函數(shù)調(diào)用棧,閉包等容易出錯(cuò)的題目,究其原因,都是跟JavaScript基礎(chǔ)知識(shí)不牢固有關(guān),下層地基沒打好,上層就是豆腐渣工程,...
摘要:之?dāng)?shù)組操作接下來就是數(shù)據(jù)結(jié)構(gòu)的第一部分,棧。以字符串顯示棧中所有內(nèi)容方法的實(shí)現(xiàn)說明需要往棧中添加新元素,元素位置在隊(duì)列的末尾。的前端樂園原文鏈接寒假前端學(xué)習(xí)學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法,棧與隊(duì)列 本系列的第一篇文章: 學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(一),棧與隊(duì)列第二篇文章:學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(二):鏈表第三篇文章:學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(三):集合第...
摘要:一棧數(shù)據(jù)結(jié)構(gòu)與不同,中并沒有嚴(yán)格意義上區(qū)分棧內(nèi)存與堆內(nèi)存。引用數(shù)據(jù)類型的值是保存在堆內(nèi)存中的對(duì)象。不允許直接訪問堆內(nèi)存中的位置,因此我們不能直接操作對(duì)象的堆內(nèi)存空間。為了更好的搞懂變量對(duì)象與堆內(nèi)存,我們可以結(jié)合以下例子與圖解進(jìn)行理解。 showImg(https://segmentfault.com/img/remote/1460000009784102?w=1240&h=683); ...
摘要:進(jìn)階期理解中的執(zhí)行上下文和執(zhí)行棧進(jìn)階期深入之執(zhí)行上下文棧和變量對(duì)象但是今天補(bǔ)充一個(gè)知識(shí)點(diǎn)某些情況下,調(diào)用堆棧中函數(shù)調(diào)用的數(shù)量超出了調(diào)用堆棧的實(shí)際大小,瀏覽器會(huì)拋出一個(gè)錯(cuò)誤終止運(yùn)行。 (關(guān)注福利,關(guān)注本公眾號(hào)回復(fù)[資料]領(lǐng)取優(yōu)質(zhì)前端視頻,包括Vue、React、Node源碼和實(shí)戰(zhàn)、面試指導(dǎo)) 本周正式開始前端進(jìn)階的第一期,本周的主題是調(diào)用堆棧,今天是第3天。 本計(jì)劃一共28期,每期重點(diǎn)攻...
摘要:當(dāng)一個(gè)應(yīng)用啟動(dòng)時(shí),會(huì)自動(dòng)加載這些庫,為應(yīng)用提供了一個(gè)基礎(chǔ)環(huán)境。也就是說,模板文件只能包含以這三種標(biāo)簽為頂層標(biāo)簽的片段。在中,我們需要判斷當(dāng)前的具體運(yùn)行環(huán)境,以便執(zhí)行相應(yīng)的代碼。 一、全棧開發(fā)平臺(tái) - 不僅僅是前端 Meteor和那些名聲如雷貫耳的前端框架,比如Angular, React等都不一樣,它是一個(gè) 采用單一開發(fā)語言的全棧開發(fā)的平臺(tái):開發(fā)者可以使用JavaScript同時(shí) 進(jìn)...
閱讀 2973·2021-11-23 10:12
閱讀 2698·2021-11-23 09:51
閱讀 2046·2021-11-15 11:37
閱讀 1383·2019-08-30 15:55
閱讀 1973·2019-08-29 15:40
閱讀 1171·2019-08-28 18:30
閱讀 1655·2019-08-28 18:02
閱讀 2650·2019-08-26 12:00