摘要:保護(hù)數(shù)據(jù)結(jié)構(gòu)內(nèi)部元素下劃線命名約定這只是一種約定,只能依賴于開發(fā)人員具備的常識(shí)用的限定作用于實(shí)現(xiàn)類實(shí)現(xiàn)了假的私有屬性,雖然基本類型不可變,但由于新增的方法仍然能取到所有屬性,而且是數(shù)組的形式,但我們操作的是棧,不應(yīng)該出現(xiàn)這種行為。
棧是一種遵循后進(jìn)先出(ILFO)原則的有序集合,新添加或待刪除的元素都保存在棧的同一段,稱為棧頂,另一端就叫棧底?,F(xiàn)實(shí)中很多例子采用了這種數(shù)據(jù)結(jié)構(gòu),比如一摞書,疊放的盤子。棧通常用來保存變量、方法調(diào)用,當(dāng)然也可以用于瀏覽器歷史記錄。
基于數(shù)組的棧 創(chuàng)建類class StackArray { constructor() { this.items = []; }向棧頂添加元素
push(element) { this.items.push(element); }從棧頂移除元素
pop() { return this.items.pop(); }查看棧頂元素
peek() { return this.items[this.items.length - 1]; }檢查棧是否為空
isEmpty() { return this.items.length === 0; }清空棧元素
clear() { this.items = []; }轉(zhuǎn)化為數(shù)組
toArray() { return this.items; }轉(zhuǎn)化為字符串
toString() { return this.items.toString(); }基于Javascript對(duì)象的stack類 創(chuàng)建stack類
class Stack { constructor() { this.count = 0;//記錄棧的大小,幫助我們進(jìn)行添加和刪除操作 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; }驗(yàn)證一個(gè)棧是否為空和它的大小
isEmpty() { return this.count === 0; } size() { return this.count; }查看棧頂?shù)闹挡G蹇?/b>
peek() { if (this.isEmpty()) { return undefined; } return this.items[this.count - 1]; }; clear() { /* while (!this.isEmpty()) { this.pop(); } */ this.items = {}; this.count = 0; };轉(zhuǎn)為字符串
toString() { if (this.isEmpty()) { return ""; } let objString = `${this.items[0]}`; for (let i = 1; i < this.count; i++) { objString = `${objString},${this.items[i]}`; } return objString; } }總結(jié)
除了toString方法,我們創(chuàng)建的其他方法的時(shí)間復(fù)雜度均是O(1),代表我們可以直接扎到目標(biāo)元素并對(duì)其進(jìn)行操作。
注意目前為止我們使用的是ES6語法類,由于JavaScript語言的特點(diǎn),類并不能跟其他語言一樣具有私有屬性,也就是在外部可以引用私有屬性,對(duì)其進(jìn)行賦值等操作??匆韵碌拇a了解一下:
const stack = new Stack(); console.log(Object.getOwnPropertyNames(stack));//["count","items"] console.log(Object.keys(stack));//["count","items"] console.log(stack.items);//直接訪問私有屬性
那么問題來了,我們只想讓用戶使用我們暴露出來的屬性或者方法,我們?cè)撛趺磳?shí)現(xiàn)私有屬性呢。筆者看了前輩總結(jié)的,直接把它寫上來。
保護(hù)數(shù)據(jù)結(jié)構(gòu)內(nèi)部元素 下劃線命名約定class stack{ constructor(){ this._count = 0; this._items = {}; } };
這只是一種約定,只能依賴于開發(fā)人員具備的常識(shí)
用E2015的限定作用于Symbol實(shí)現(xiàn)類const _items = Symbol("stackItems"); class Stack{ constructor(){ this[_items] = []; } };
實(shí)現(xiàn)了假的私有屬性,雖然Symbol基本類型不可變,但由于ES2015新增的Object.getOwnPropertySymbols方法仍然能取到所有Symbol屬性,而且是數(shù)組的形式,但我們操作的是棧,不應(yīng)該出現(xiàn)這種行為。別急,還有第三個(gè)方案
用ES2015的WeakMap實(shí)現(xiàn)類const items = new WeakMap(); class Stack{ constructor(){ items.set(this,[]); }, push(element){ const s = items.get(this); s.push(element); } }
這樣我們就實(shí)現(xiàn)了一個(gè)實(shí)現(xiàn)了一個(gè)完全的私有屬性 ,但是代碼可讀性對(duì)于筆者真的太難受了,不知道你們?cè)趺从X得呢。
棧的實(shí)踐 進(jìn)制轉(zhuǎn)換算法function baseConverter(decNumber, base) { const remStack = new Stack(); const digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; let number = decNumber; let rem; let baseString = ""; if (!(base >= 2 && base <= 36)) { return ""; } while (number > 0) { rem = Math.floor(number % base); remStack.push(rem); number = Math.floor(number / base); } while (!remStack.isEmpty()) { baseString += digits[remStack.pop()]; }平衡圓括號(hào)算法
function parenthesesChecker(symbols) { const stack = new Stack(); const opens = "([{"; const closers = ")]}"; let balanced = true; let index = 0; let symbol; let top; while (index < symbols.length && balanced) { symbol = symbols[index]; if (opens.indexOf(symbol) >= 0) { stack.push(symbol); } else if (stack.isEmpty()) { balanced = false; } else { top = stack.pop(); if (!(opens.indexOf(top) === closers.indexOf(symbol))) { balanced = false; } } index++; } return balanced && stack.isEmpty(); }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/109973.html
摘要:之?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)與算法(三):集合第...
摘要:筆者作為一位,將工作以來用到的各種優(yōu)秀資料神器及框架整理在此,畢竟好記性不如爛鍵盤,此前端知識(shí)點(diǎn)大百科全書前端掘金,,不定期更新技巧前端掘金技巧,偶爾更新。計(jì)算數(shù)組的極值技巧使你的更加專業(yè)前端掘金一個(gè)幫你提升技巧的收藏集。 CSS 樣式畫各種圖形 - 前端 - 掘金下面是一些我在 CSS 中經(jīng)常用到的圖案,還有一些是在css-tricks看到的。記錄一下,以后會(huì)用到。會(huì)持續(xù)更新… 一、...
摘要:筆者作為一位,將工作以來用到的各種優(yōu)秀資料神器及框架整理在此,畢竟好記性不如爛鍵盤,此前端知識(shí)點(diǎn)大百科全書前端掘金,,不定期更新技巧前端掘金技巧,偶爾更新。計(jì)算數(shù)組的極值技巧使你的更加專業(yè)前端掘金一個(gè)幫你提升技巧的收藏集。 CSS 樣式畫各種圖形 - 前端 - 掘金下面是一些我在 CSS 中經(jīng)常用到的圖案,還有一些是在css-tricks看到的。記錄一下,以后會(huì)用到。會(huì)持續(xù)更新… 一、...
摘要:棧內(nèi)存與堆內(nèi)存淺拷貝與深拷貝,可以說是前端程序員的內(nèi)功,要知其然,知其所以然。棧內(nèi)存與堆內(nèi)存中的變量分為基本類型和引用類型。 showImg(https://segmentfault.com/img/bVbuvnj?w=900&h=250); 前言 想寫好前端,先練好內(nèi)功。 棧內(nèi)存與堆內(nèi)存 、淺拷貝與深拷貝,可以說是前端程序員的內(nèi)功,要知其然,知其所以然。 筆者寫的 JavaScrip...
摘要:而且目前大部分編程語言的高級(jí)應(yīng)用都會(huì)用到數(shù)據(jù)結(jié)構(gòu)與算法以及設(shè)計(jì)模式。新添加的或待刪除的元素都保存在棧的同一端,稱作棧頂,另一端就叫棧底。在棧里,新元素都靠近棧頂,舊元素都接近棧底。 前言 JavaScript是當(dāng)下最流行的編程語言之一,它可以做很多事情: 數(shù)據(jù)可視化(D3.js,Three.js,Chart.js); 移動(dòng)端應(yīng)用(React Native,Weex,AppCan,Fl...
閱讀 3735·2021-11-17 09:33
閱讀 2760·2021-09-22 15:12
閱讀 3361·2021-08-12 13:24
閱讀 2453·2019-08-30 11:14
閱讀 1745·2019-08-29 14:09
閱讀 1337·2019-08-26 14:01
閱讀 3075·2019-08-26 13:49
閱讀 1789·2019-08-26 12:16