javascript数据结构
学习数据结构非常重要。首要原因是数据结构和算法可以很高效的解决常见问题。作为前端,通过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数据结构的更多相关文章
- 学习javascript数据结构(三)——集合
前言 总括: 本文讲解了数据结构中的[集合]概念,并使用javascript实现了集合. 原文博客地址:学习javascript数据结构(三)--集合 知乎专栏&&简书专题:前端进击者 ...
- 学习javascript数据结构(二)——链表
前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...
- 学习javascript数据结构(一)——栈和队列
前言 只要你不计较得失,人生还有什么不能想法子克服的. 原文地址:学习javascript数据结构(一)--栈和队列 博主博客地址:Damonare的个人博客 几乎所有的编程语言都原生支持数组类型,因 ...
- javascript数据结构与算法--高级排序算法
javascript数据结构与算法--高级排序算法 高级排序算法是处理大型数据集的最高效排序算法,它是处理的数据集可以达到上百万个元素,而不仅仅是几百个或者几千个.现在我们来学习下2种高级排序算法-- ...
- javascript数据结构与算法-- 二叉树
javascript数据结构与算法-- 二叉树 树是计算机科学中经常用到的一种数据结构.树是一种非线性的数据结构,以分成的方式存储数据,树被用来存储具有层级关系的数据,比如文件系统的文件,树还被用来存 ...
- javascript数据结构与算法--散列
一:javascript数据结构与算法--散列 一:什么是哈希表? 哈希表也叫散列表,是根据关键码值(key,value)而直接进行访问的数据结构,它是通过键码值映射到表中一个位置来访问记录的,散列 ...
- javascript数据结构与算法---队列
javascript数据结构与算法---队列 队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素.队列用于存储按顺序排列的数据,先进先出,这点和栈不一样(后入先出).在栈中,最后入栈的元素 ...
- javascript数据结构与算法---栈
javascript数据结构与算法---栈 在上一遍博客介绍了下列表,列表是最简单的一种结构,但是如果要处理一些比较复杂的结构,列表显得太简陋了,所以我们需要某种和列表类似但是更复杂的数据结构---栈 ...
- javascript数据结构与算法---列表
javascript数据结构与算法---列表 前言:在日常生活中,人们经常要使用列表,比如我们有时候要去购物时,为了购物时东西要买全,我们可以在去之前,列下要买的东西,这就要用的列表了,或者我们小时候 ...
- JavaScript数据结构——树
树:非顺序数据结构,对于存储需要快速查找的数据非常有用. 二叉树:二叉树中的节点最多只能有两个子节点(左侧子节点和右侧子节点).这些定义有助于我们写出更高效的向/从树中插入.查找和删除节点的算法. 二 ...
随机推荐
- 2019-11-20:xss学习笔记
xxe漏洞防御使用开发语言提供的禁用外部实体的方法phplibxml_disable_entity_loader(true); 卢兰奇对象模型,bom由于现代浏览器实现了js交互性方面的相同方法和属性 ...
- 2019-10-23:渗透测试,基础学习,DVWA,Medium和Hight级别sql注入
VWA的Medium和Hight级别sql注入 一,Medium级 服务端代码 <?php if( isset( $_POST[ 'Submit' ] ) ) { // Get inp ...
- 【RocketMQ源码学习】- 5. 消息存储机制
前言 面试官:你了解RocketMQ是如何存储消息的吗?我:额,,,你等下,我看下这篇文字, (逃 由于这部分内容优点多,所以请哥哥姐姐们自备茶水,欢迎留言! RocketMQ存储设计是高可用和高性能 ...
- python之turtle画蚊香
原理:利用turtle绘制圆形,并使圆半径逐步增加 代码如下: import turtle turtle.pensize(30) for i in range(30): turtle.circle(i ...
- selenium(java)浏览器多窗口切换处理
要在多个窗口直接切换,首先获取每个窗口的唯一标示符(句柄),通过窗口属性可以获取所有打开窗口的标示符,以集合的形式返回:以下示例: Set<String> winHandels ...
- 3sql
-------------------- 三范式-- 第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列. -- 第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有一个 ...
- 【02】对象的Getter and Setter
java和C#非常相似,它们大部分的语法是一样的,但尽管如此,也有一些地方是不同的. 为了更好地学习java或C#,有必要分清它们两者到底在哪里不同. 我们这次要来探讨对象的Getter and Se ...
- 自定制页面跳转时携带原搜索参数的URL
介绍 django自带反向解析生成URL的功能,目的是避免硬编码,较少代码维护的代价. 前端页面使用模板语法,如:{% url "rbac: request menu_list" ...
- createTextNode
createTextNode()方法将创建一个包含给定文本的新文本文档节点.这个方法的返回值是一个指向新建文本节点的引用指针: reference = document.createTextNode( ...
- day20191006假期作业收尾
国庆作业:(轻重缓急,重点代码看懂理解了.每天重心就是代码,理解代码,理解,understand the code.花时间花功夫.只要功夫深,铁杵磨成针.) 一.使用DAO设计模式操作数据库CRUD( ...