javascript数据结构

学习数据结构很是重要。首要缘由是数据结构和算法能够很高效的解决常见问题。做为前端,经过javascript学习数据结构和算法要比学习java和c版本容易的多。javascript

在讲数据结构以前咱们先了解一下ES6的一些方法。由于这可能对咱们了解数据结构有帮助。前端

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];

1.event方法迭代

此方法会迭代数组中每一个元素,若是每一个元素都返回true,此方法才会返回true.算法

numbers.every(isEven);

由于并非每一个数字都是偶数。因此返回false;数组

2.some方法迭代

此方法会迭代数组中每一个元素,若是有元素都返回true,此方法才会返回true.数据结构

numbers.some(isEven);

由于有偶数元素,因此返回true;数据结构和算法

3.forEach方法迭代

此方法会迭代数组中的每一个元素,而后分别执行传入的回到函数。函数

number.forEach(callback);

4.map方法迭代

此方法会将数组的每一个元素经过回调函数,并将每一个返回值组成新的数组返回。学习

numbers.map(isEven);

返回[false,true,false,true,false,true,false,true,false,true,false,true,false,true,false];this

5.filter方法迭代

此方法返回的新数组由使回调函数返回true的元素组成。

numbers.filter(isEven);

由于2,4,6,8,10,12,14模2等于0;因此返回[2,4,6,8,10,12,14];

6.reduce方法迭代

此方法有四个参数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还新增了不少语法糖。有兴趣的同窗能够去阮大神的我的博客。

1.什么是栈?

基础的东西简单的介绍完了,接下来咱们来点干货。那么什么是栈呢?栈是一种听从后进先出(LIFO)原则的有序集合。新添加和待删除的元素都保存在栈的同一端,称做栈顶,另外一端就叫栈底。在栈里,新元素都靠近栈顶,旧元素都接近栈底。就像生活中厨房里叠放的盘子。

2.建立基于JavaScript数组的栈

先从声明一个Stack类开始。

class Stack {
  constructor() {
    this.items = [];
  }
}

接下来咱们添加一些方法。

  • 1.push(element);添加元素到栈顶
  • 2.pop();移除栈顶元素,并返回移除元素
  • 3.peek();返回栈顶的元素
  • 4.isEmpty();若是站里没有元素则按返回true,反之返回false
  • 5.clear();移除栈里全部元素
  • 6.size();返回栈里元素个数

push方法

push(element) {
  this.items.push(element);
}

pop方法

pop() {
  return this.items.pop();
}

peek方法

peek() {
  return this.items[this.items.length - 1];
}

isEmpty方法

isEmpty() {
  return this.items.length === 0;
}

clear方法

clear() {
  this.items = [];
}

size方法

size() {
  return this.items.length;
}

3.建立基于JavaScript对象的栈

先从声明一个Stack类开始。

class Stack {
  constructor() {
    this.count = 0;
    this.items = {};
  }
}

接下来咱们添加一些方法。

  • 1.push(element);添加元素到栈顶
  • 2.pop();移除栈顶元素,并返回移除元素
  • 3.peek();返回栈顶的元素
  • 4.isEmpty();若是站里没有元素则按返回true,反之返回false
  • 5.clear();移除栈里全部元素
  • 6.size();返回栈里元素个数

push方法

push(element) {
  this.items[this.count] = element;
  this.count ++;
}

pop方法

pop() {
  if(this.isEmpty()) {
    return undefined;
  }
  this.count --;
  let result = this.items[this.count];
  delete this.items[this.count]
  return result;
}

peek方法

peek() {
  if(this.isEmpty()) {
    return undefined;
  }
  return this.items[this.count - 1];
}

isEmpty方法

isEmpty() {
  return this.count == 0;
}

clear方法

clear() {
  this.count = 0;
  this.items = {};
}

size方法

size() {
  return this.items.count;
}

toString方法

由于数组版本的栈的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版本的栈数据结构。

4.用栈解决问题

下面咱们以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数据结构 – 栈

相关文章
相关标签/搜索