学习数据结构非常重要。首要原因是数据结构和算法可以很高效的解决常见问题。作为前端,通过javascript学习数据结构和算法要比学习java和c版本容易的多。

在讲数据结构之前我们先了解一下ES6的一些方法。因为这可能对我们了解数据结构有帮助。

ES6操作数组的方法

首先我们来用箭头函数定义一个函数。

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

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数据结构 – 栈

javascript数据结构的更多相关文章

  1. 学习javascript数据结构(三)——集合

    前言 总括: 本文讲解了数据结构中的[集合]概念,并使用javascript实现了集合. 原文博客地址:学习javascript数据结构(三)--集合 知乎专栏&&简书专题:前端进击者 ...

  2. 学习javascript数据结构(二)——链表

    前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...

  3. 学习javascript数据结构(一)——栈和队列

    前言 只要你不计较得失,人生还有什么不能想法子克服的. 原文地址:学习javascript数据结构(一)--栈和队列 博主博客地址:Damonare的个人博客 几乎所有的编程语言都原生支持数组类型,因 ...

  4. javascript数据结构与算法--高级排序算法

    javascript数据结构与算法--高级排序算法 高级排序算法是处理大型数据集的最高效排序算法,它是处理的数据集可以达到上百万个元素,而不仅仅是几百个或者几千个.现在我们来学习下2种高级排序算法-- ...

  5. javascript数据结构与算法-- 二叉树

    javascript数据结构与算法-- 二叉树 树是计算机科学中经常用到的一种数据结构.树是一种非线性的数据结构,以分成的方式存储数据,树被用来存储具有层级关系的数据,比如文件系统的文件,树还被用来存 ...

  6. javascript数据结构与算法--散列

    一:javascript数据结构与算法--散列  一:什么是哈希表? 哈希表也叫散列表,是根据关键码值(key,value)而直接进行访问的数据结构,它是通过键码值映射到表中一个位置来访问记录的,散列 ...

  7. javascript数据结构与算法---队列

    javascript数据结构与算法---队列 队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素.队列用于存储按顺序排列的数据,先进先出,这点和栈不一样(后入先出).在栈中,最后入栈的元素 ...

  8. javascript数据结构与算法---栈

    javascript数据结构与算法---栈 在上一遍博客介绍了下列表,列表是最简单的一种结构,但是如果要处理一些比较复杂的结构,列表显得太简陋了,所以我们需要某种和列表类似但是更复杂的数据结构---栈 ...

  9. javascript数据结构与算法---列表

    javascript数据结构与算法---列表 前言:在日常生活中,人们经常要使用列表,比如我们有时候要去购物时,为了购物时东西要买全,我们可以在去之前,列下要买的东西,这就要用的列表了,或者我们小时候 ...

  10. JavaScript数据结构——树

    树:非顺序数据结构,对于存储需要快速查找的数据非常有用. 二叉树:二叉树中的节点最多只能有两个子节点(左侧子节点和右侧子节点).这些定义有助于我们写出更高效的向/从树中插入.查找和删除节点的算法. 二 ...

随机推荐

  1. 新闻实时分析系统 Spark2.X分布式弹性数据集

    1.三大弹性数据集介绍 1)概念 2)优缺点对比 2.Spark RDD概述与创建方式 1)概述 在集群背后,有一个非常重要的分布式数据架构,即弹性分布式数据集(resilientdistribute ...

  2. 揭秘String类型背后的故事——带你领略汇编语言魅力

    字符串或串(String)是由数字.字母.下划线组成的一串字符.一般记为 s=“a1a2···an”(n>=0).它是编程语言中表示文本的数据类型.在程序设计中,字符串(string)为符号或数 ...

  3. 学会使用这些,你的Windows可能会焕然一新

    星选哥用Windows也已经好多年了,今天用室友的电脑才发现,桌面真可以影响一个人的心情,从而影响工作,学习,生活. 所以准备推荐一些好用且轻量的小工具,让你时时刻刻有个好心情. 室友的桌面(还有很多 ...

  4. 算法整理(php语言完成),持续更行中......

    一下所有实例中,均在同一个方法中,所以算法使用内部函数完成 归并排序 public function test1Action () { $tmp = 0; $al_merge = function($ ...

  5. C语言I作业003

    1 本周作业头 这个作业属于哪个课程 C语言程序设计Ⅰ 这个作业要求在哪里 [班级作业链接](http://edu.cnblogs.com/campus/zswxy/SE2019-1/join?id= ...

  6. java 小程序分析:参数传递

    public class Test{ public static void main (String [] ABC){ StringBuffer a = new StringBuffer(" ...

  7. 网络OSI七层模型以及数据传输过程

    网络OSI七层模型 模型图 国际标准化组织(ISO)制定了osi七层模型,iso规定了各种各样的协议,并且分了7层 每一层的详细信息 具体7层 数据格式 功能与连接方式 典型设备 应用层 Applic ...

  8. PHP的array_walk和array_map函数实现数组值UTF-8转GBK编码

    在PHP中,array_walk() 和 array_map()两个函数都可以实现对数组中每个值的修改,比如本例就是将数组中所有的值,由UTF-8编码转成GBK编码. 当然,除了这两个函数,也可以用 ...

  9. Mac从拆箱到入门

    Mac从拆箱到入门   记录首次使用Mac的我的历程,不是专业的Mac使用教程,只是简单的记录.还有我在使用过程中一些用到的功能都一些小提示吧.  1.首次开机配置,对于一个完全的新手来说(也就是我) ...

  10. react-starter-projects

    react-starter-projects These are repositories that you copy and modify to create your own React app. ...