前端数据结构
栈
后进先出,数据结构类似于蜂窝煤,js中可以用数组push() pop() 来模拟栈
应用场景
- 十进制转二进制
- 有效的括号(Leetcode20)
- 函数执行栈中
var isValid = function(s) { let stack=[]; for(let i=0;i<s.length;i++){ if(s[i]==="("||s[i]==="["||s[i]==="{"){ stack.push(s[i]) }else{ if(stack[stack.length-1]==="("&&s[i]===")"|| stack[stack.length-1]==="{"&&s[i]==="}"|| stack[stack.length-1]==="["&&s[i]==="]"){ stack.pop() }else{ return false; } } } return stack.length===0 }
队列
后进先出,数据结构类似于排队,js中可以用数组push() shift() 来模拟队列
应用场景
- 食堂排队
- js异步中的任务队列
- 计算最近请求次数leetcode993
链表
多个元素组成的链表,元素存储不连续,用next指针连在一起,js中可以用对象来模拟链表
应用场景
- leetcode237删除链表
- leetcode206反转链表
- leetcode2两数相加
- leetcode83删除排序链表中的重复元素
- leetcode141环形链表
- 前端与链表:js中的原型链,原型链的本质是链表,原型链通过__proto__链接
- 使用链表指针获取JSON的节点值
const a={val:"a"} const b={val:"b"} const c={val:"c"} const d={val:"d"} a.next=b b.next=c c,next=d //遍历 let p=a; while(p){ console.log(a.val) p=p.next } //插入 let e={val:"e"} b.next=e e.next=c //删除 b.next=c
集合
一种无序且唯一的数据结构Set
使用方法:new has delete add size 遍历 keys values entries 有迭代器
应用场景
- 去重
- 判断某元素是否在集合中
- 求交集
- leetcode349两个数组的交集
//去重 let arr=[1,1,2,3] [...new Set(arr)] //元素在集合中 let set=new Set(arr) set.has(3) //求交集 let arr2=[3,4,5] let set2=new Set(arr2) [...new Set(arr)].filter((item)=>{set2.has(item)})