學習數據結構很是重要。首要緣由是數據結構和算法能夠很高效的解決常見問題。做爲前端,經過javascript學習數據結構和算法要比學習java和c版本容易的多。javascript
在講數據結構以前咱們先了解一下ES6的一些方法。由於這可能對咱們瞭解數據結構有幫助。前端
首先咱們來用箭頭函數定義一個函數。java
const isEven = x => x % 2 === 0; let numbers = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
此方法會迭代數組中每一個元素,若是每一個元素都返回true,此方法纔會返回true.算法
numbers.every(isEven);
由於並非每一個數字都是偶數。因此返回false;數組
此方法會迭代數組中每一個元素,若是有元素都返回true,此方法纔會返回true.數據結構
numbers.some(isEven);
由於有偶數元素,因此返回true;數據結構和算法
此方法會迭代數組中的每一個元素,而後分別執行傳入的回到函數。函數
number.forEach(callback);
此方法會將數組的每一個元素經過回調函數,並將每一個返回值組成新的數組返回。學習
numbers.map(isEven);
返回[false,true,false,true,false,true,false,true,false,true,false,true,false,true,false];
this
此方法返回的新數組由使回調函數返回true的元素組成。
numbers.filter(isEven);
由於2,4,6,8,10,12,14模2等於0;因此返回[2,4,6,8,10,12,14];
此方法有四個參數previousValue,currentValue,index,array.後連個參數爲可選參數,能夠不傳。這個函數會返回一個將被疊加到疊加器的值。
numbers.reduce((previous, current) => previous + current)
咱們來分解一下reduce執行過程。第一個previous爲1,current爲2 return爲1+2=3。在第二次迭代中previous爲上一個迭代的返回值3,current爲3, return爲6 …所以最後返回120。
除此以外,ES6還新增了不少語法糖。有興趣的同窗能夠去阮大神的我的博客。
基礎的東西簡單的介紹完了,接下來咱們來點乾貨。那麼什麼是棧呢?棧是一種聽從後進先出(LIFO)原則的有序集合。新添加和待刪除的元素都保存在棧的同一端,稱做棧頂,另外一端就叫棧底。在棧裏,新元素都靠近棧頂,舊元素都接近棧底。就像生活中廚房裏疊放的盤子。
先從聲明一個Stack類開始。
class Stack { 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 = []; }
size() { return this.items.length; }
先從聲明一個Stack類開始。
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 --; let 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.count = 0; this.items = {}; }
size() { return this.items.count; }
由於數組版本的棧的toString()方法能夠直接使用數組提供的toString方法,爲對象版則須要咱們本身封裝。
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; }
這就是咱們用javascript版本的棧數據結構。
下面咱們以10進制轉2進製爲例,看看如何用棧決絕問題。
function decimalToBinary(decNumber) { const remStack = new Stack(); let number = decNumber; let rem; let binaryString = ''; while(number > 0) { rem = Math.floor(number % 2); remStack.push(rem); number = Math.floor(number / 2); } if(!remStack.isEmpty()) { binaryString += this.pop().toString(); } return binaryString; }
這即是用數據結構解決問題。後續我會將用JavaScript講解什麼是隊列、鏈表、集合、字典、哈希表(HashTable)、遞歸、樹、二叉堆、圖等數據結構。
原創博客:轉載請註明:javascript數據結構 – 棧