摘要:棧的實現(xiàn)實現(xiàn)一個棧當務之急是決定存儲數(shù)據(jù)的底層數(shù)據(jù)結構。變量記錄棧頂位置被構造函數(shù)初始化為表示棧頂對應數(shù)組的起始位置。這是因為棧是空的棧頂沒有任何元素。假設想將數(shù)字轉換為以為基數(shù)的數(shù)字實現(xiàn)轉換的算法如下。
棧的實現(xiàn)
實現(xiàn)一個棧,當務之急是決定存儲數(shù)據(jù)的底層數(shù)據(jù)結構。這里采用的是數(shù)組。 我們的實現(xiàn)以定義 Stack 類的構造函數(shù)開始:
function Stack() { this.dataStore = []; this.top = 0; this.push = push; this.pop = pop; this.peek = peek; }
我們用數(shù)組 dataStore 保存棧內(nèi)元素,構造函數(shù)將其初始化為一個空數(shù)組。變量 top 記錄 棧頂位置,被構造函數(shù)初始化為 0,表示棧頂對應數(shù)組的起始位置 0。如果有元素被壓入 棧,該變量的值將隨之變化。
先來實現(xiàn) push() 方法。當向棧中壓入一個新元素時,需要將其保存在數(shù)組中變量 top 所對 應的位置,然后將 top 值加 1,讓其指向數(shù)組中下一個空位置。代碼如下所示:
function push(element) { this.dataStore[this.top++] = element; }
這里要特別注意 ++ 操作符的位置,它放在 this.top 的后面,這樣新入棧的元素就被放在 top 的當前值對應的位置,然后再將變量 top 的值加 1,指向下一個位置。
pop() 方法恰好與 push() 方法相反——它返回棧頂元素,同時將變量 top 的值減 1:
function pop() { return this.dataStore[--this.top]; }
peek() 方法返回數(shù)組的第 top-1 個位置的元素,即棧頂元素:
function peek() { return this.dataStore[this.top-1]; }
如果對一個空棧調用 peek() 方法,結果為 undefined。這是因為棧是空的,棧頂沒有任何
元素。
有時候需要知道棧內(nèi)存儲了多少個元素。length() 方法通過返回變量 top 值的方式返回棧 內(nèi)的元素個數(shù):
function length() { return this.top; }
最后,可以將變量 top 的值設為 0,輕松清空一個棧:
function clear() { this.top = 0; }代碼歸納
function Stack() { this.dataStore = []; this.top = 0; this.push = push; this.pop = pop; this.peek = peek; this.clear = clear; this.length = length; } function push(element) { this.dataStore[this.top++] = element; } function peek() { return this.dataStore[this.top-1]; } function pop() { return this.dataStore[--this.top]; } function clear() { this.top = 0; } function length() { return this.top; }棧的應用 數(shù)制間的相互轉換
可以利用棧將一個數(shù)字從一種數(shù)制轉換成另一種數(shù)制。假設想將數(shù)字 n 轉換為以 b 為基數(shù)的數(shù)字,實現(xiàn)轉換的算法如下。
最高位為 n % b,將此位壓入棧。
使用n/b代替n。
重復步驟 1 和 2,直到 n 等于 0,且沒有余數(shù)。
持續(xù)將棧內(nèi)元素彈出,直到棧為空,依次將這些元素排列,就得到轉換后數(shù)字的字符
串形式。
使用棧,在 JavaScript 中實現(xiàn)該算法就是小菜一碟。下面就是該函數(shù)的定義,可以將數(shù)字 轉化為二至九進制的數(shù)字:
function mulBase(num, base) { var s = new Stack(); do { s.push(num % base); num = Math.floor(num /= base); } while (num > 0); var converted = ""; while (s.length() > 0) { converted += s.pop(); } return converted; }后話
當然,學好前端,你還需要關注一個公眾號!——每日前端
各位兄弟姐妹,共勉!
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/79170.html
摘要:棧和隊列是開發(fā)中最常用的兩種數(shù)據(jù)結構。如果又有數(shù)據(jù)入棧,的值將增加到。如果一個數(shù)據(jù)從棧中被取出,的值將會減少為。隊列與棧類似,隊列也是一個線性數(shù)據(jù)結構。與棧不同的是,隊列只刪除最先添加的數(shù)據(jù)?,F(xiàn)在,讓我們將棧大小的實現(xiàn)應用到隊列中。 翻譯:瘋狂的技術宅英文:https://code.tutsplus.com/art...說明:本文翻譯自系列文章《Data Structures With...
摘要:之數(shù)組操作接下來就是數(shù)據(jù)結構的第一部分,棧。以字符串顯示棧中所有內(nèi)容方法的實現(xiàn)說明需要往棧中添加新元素,元素位置在隊列的末尾。的前端樂園原文鏈接寒假前端學習學習數(shù)據(jù)結構與算法,棧與隊列 本系列的第一篇文章: 學習JavaScript數(shù)據(jù)結構與算法(一),棧與隊列第二篇文章:學習JavaScript數(shù)據(jù)結構與算法(二):鏈表第三篇文章:學習JavaScript數(shù)據(jù)結構與算法(三):集合第...
摘要:譯者注翻譯一個對新手比較友好的工作原理解析系列文章注意以下全部是概念經(jīng)驗豐富的老鳥可以離場啦正文從這里開始隨著的流行團隊們正在利用來支持多個級別的技術棧包括前端后端混合開發(fā)嵌入式設備以及更多這篇文章旨在成為深入挖掘和實際上他是怎么工作的系列 譯者注 翻譯一個對新手比較友好的 JavaScript 工作原理解析系列文章 注意: 以下全部是概念,經(jīng)驗豐富的老鳥可以離場啦 正文從這里開始 隨...
閱讀 2332·2021-11-23 09:51
閱讀 3764·2021-11-11 10:57
閱讀 1410·2021-10-09 09:43
閱讀 2498·2021-09-29 09:35
閱讀 2028·2019-08-30 15:54
閱讀 1798·2019-08-30 15:44
閱讀 3194·2019-08-30 13:20
閱讀 1702·2019-08-30 11:19