学习数据结构很是重要。首要缘由是数据结构和算法能够很高效的解决常见问题。做为前端,经过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数据结构 – 栈