javascript数据结构
学习数据结构非常重要。首要原因是数据结构和算法可以很高效的解决常见问题。作为前端,通过javascript学习数据结构和算法要比学习java和c版本容易的多。
在讲数据结构之前我们先了解一下ES6的一些方法。因为这可能对我们了解数据结构有帮助。
ES6操作数组的方法
首先我们来用箭头函数定义一个函数。
1 2 | 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.
1 | numbers.every(isEven); |
因为并不是每个数字都是偶数。所以返回false;
2.some方法迭代
此方法会迭代数组中每个元素,如果有元素都返回true,此方法才会返回true.
1 | numbers.some(isEven); |
因为有偶数元素,所以返回true;
3.forEach方法迭代
此方法会迭代数组中的每个元素,然后分别执行传入的回到函数。
1 | number.forEach(callback); |
4.map方法迭代
此方法会将数组的每个元素通过回调函数,并将每个返回值组成新的数组返回。
1 | numbers.map(isEven); |
返回[false,true,false,true,false,true,false,true,false,true,false,true,false,true,false];
5.filter方法迭代
此方法返回的新数组由使回调函数返回true的元素组成。
1 | 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.后连个参数为可选参数,可以不传。这个函数会返回一个将被叠加到叠加器的值。
1 | 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类开始。
1 2 3 4 5 | class Stack { constructor() { this .items = []; } } |
接下来我们添加一些方法。
- 1.push(element);添加元素到栈顶
- 2.pop();移除栈顶元素,并返回移除元素
- 3.peek();返回栈顶的元素
- 4.isEmpty();如果站里没有元素则按返回true,反之返回false
- 5.clear();移除栈里所有元素
- 6.size();返回栈里元素个数
push方法
1 2 3 | push(element) { this .items.push(element); } |
pop方法
1 2 3 | pop() { return this .items.pop(); } |
peek方法
1 2 3 | peek() { return this .items[ this .items.length - 1]; } |
isEmpty方法
1 2 3 | isEmpty() { return this .items.length === 0; } |
clear方法
1 2 3 | clear() { this .items = []; } |
size方法
1 2 3 | size() { return this .items.length; } |
3.创建基于JavaScript对象的栈
先从声明一个Stack类开始。
1 2 3 4 5 6 | class Stack { constructor() { this .count = 0; this .items = {}; } } |
接下来我们添加一些方法。
- 1.push(element);添加元素到栈顶
- 2.pop();移除栈顶元素,并返回移除元素
- 3.peek();返回栈顶的元素
- 4.isEmpty();如果站里没有元素则按返回true,反之返回false
- 5.clear();移除栈里所有元素
- 6.size();返回栈里元素个数
push方法
1 2 3 4 | push(element) { this .items[ this .count] = element; this .count ++; } |
pop方法
1 2 3 4 5 6 7 8 9 | pop() { if ( this .isEmpty()) { return undefined; } this .count --; let result = this .items[ this .count]; delete this .items[ this .count] return result; } |
peek方法
1 2 3 4 5 6 | peek() { if ( this .isEmpty()) { return undefined; } return this .items[ this .count - 1]; } |
isEmpty方法
1 2 3 | isEmpty() { return this .count == 0; } |
clear方法
1 2 3 4 | clear() { this .count = 0; this .items = {}; } |
size方法
1 2 3 | size() { return this .items.count; } |
toString方法
因为数组版本的栈的toString()方法可以直接使用数组提供的toString方法,为对象版则需要我们自己封装。
1 2 3 4 5 6 7 8 9 10 | 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进制为例,看看如何用栈决绝问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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数据结构 – 栈
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?