前端必须掌握的数据结构

6e49eefc09a3d05ce8b64df549c2759f.gif

戳蓝字"

Web前端严选

"

关注我们哦

前端必须要掌握常见的数据结构,学会这招,让你对开发中的数据结构更加清晰!

一.队列

队列就是先进先出,排队入场!
e6f00615dd76e62e020eaa3ad205be5c.png

class Queue {
    constructor() {
        this.arr = []
    }
    enqueue(element){ // 入队列
        this.arr.push(element)
    }
    dequeue(){ // 出队列
        return this.items.shift()
    }
}

二.栈

栈就是先进后出,就是离场时后进的人先出!
6f7b77109c6a90fbe08bc7f8e681e3df.png

class Stack {
    constructor(){
        this.arr = [];
    }
    push(element){ // 入栈
        this.arr.push(element);
    }
    pop() { // 出栈
        return this.items.pop();
    }
}

三.链表

f15af4da836ac0468debd405b410e119.png

链表让我们删除数据和新增数据更加方便!

head指针指向第一个存入的元素节点,每个节点都有next属性指向一下一个元素节点,最后一个元素的指针指向null

创建一个节点,每个节点的结构非常简单

class Node {
    constructor(element){
        this.element = element; // 每个节点保存的内容
        this.next = null; // 保存的指针,指向下一个节点
    }
}

构建链表

class LinkList {
    constructor(){
        this.head = null; // 表头 默认指向第一个节点,没有为null
        this.length = 0;
    }
    append(element){
        // 追加节点
        const node = new Node(element);
        if(this.head == null){
            this.head = node; // 第一个节点就是表头
        }else{
            let current = this.head;
            // 从第一个节点查找到最后一个节点
            while(current.next){
                current = current.next;
            }
            current.next = node; // 找到最后一个节点添加next指向新增节点
        }
        this.length++; // 每增加一个长度
    }
}

使用链表,不难看出链表的特点就是通过next来指向下一个节点

const ll = new LinkList();
ll.append(1);
ll.append(2);
console.log(ll); // head: Node { element: 1, next: Node { element: 2, next: null } }

实现链表的插入

insert(position,element){
    // 插入的时候判断插入的位置
    if(position>=0 && position <=this.length){
        const node = new Node(element); // 创建一个节点
        if(position === 0){ // 如果位置是0
            node.next = this.head; // 那么就让当前节点变成头
            this.head = node;
        }else{
            let current = this.head; // 获取头节点查找位置
            let previous = null;
            let index = 0;
            while(index++ < position){ // 查找到节点位置
                previous = current;
                current = current.next;
            }
            node.next = current; // 让当前节点next是刚才找到的节点
            previous.next = node; // 他的上一个节点的next是当前节点
        }
        this.length++;
    }
}

实现链表的删除

removeAt(position){
      if(position > -1 && position < this.length){
          if(position ==0){ // 如果是第一个直接改变指针
              this.head = this.head.next
          }else{
              let index = 0;
              let previous = null;
              let current = this.head;
              while(index++ < position){ // 找到要删除的这一项,直接让上一个指针指向下一个人
                  previous = current;
                  current = current.next
              }
              previous.next = current.next; // 上一个next直接指向下一个next
          }
          this.length--;
      }
  }

更新链表中的内容

update(position,element) {
    if (position >= 0 && position < this.length) {
        if (position === 0) {
          // 根位置 直接更改跟的内容即可
          this.head.element = element
        }else{
            let index = 0;
            // 查找到要修改的项来更新
            let current = this.head;
            while(index++ < position){
              current = current.next;
            }
            current.element = element;
        }
      }
  }

四.集合

ES6已经为我们提供了Set的api,但是在某些时候(浏览器不支持的情况下),我们还是需要自己来实现Set的

class Set{
    constructor(){
        this.items = {};
    }
    has(value){ // 判断
        return this.items.hasOwnProperty(value);
    }
    add(value){ // 像集合中添加
        if(!this.has(value)){
            this.items[value] = value;
        }
    }
    remove(value){ // 删除集合中的某一项
        if(this.has(value)){
            delete this.items[value];
        }
    }
}

集合:常见的方法有,交集、并集、差集!

五.hash表

6f3562a7f68db05e521c7af551742420.jpeg
特点查找速度快,但是存储量需要手动扩展

class HashTable{
    constructor(){
        this.table = [];
    }
    calcuteHash(key){ // 通过put的key 计算hash戳,存到数组中
        let hash = 0;
        for(let s of key){
            hash += s.charCodeAt();
        }
        return hash % 100; // 只能存放100个
    }
    get(key){ // 从hash表中取出值
        let hash = this.calcuteHash(key);
        return this.table[hash]
    }
    put(key,value){ // 像hash表中存入
        let hash = this.calcuteHash(key);
        this.table[hash] = value;
    }
}
let hash = new HashTable();
hash.put('abc',1);
console.log(hash.get('abc'));

六.树

叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
9aa820ae5da3724d7796f85c05e81864.png
前端最常考察的就是二叉树!

二叉树: 树中的节点最多只能有两个子节点

二叉查找树:
若左子树不空,则左子树上所有节点的值均小于它的根节点的值
若右子树不空,则右子树上所有节点的值均大于它的根节点的值

class Node {
    constructor(key){
        this.key = key;
        this.left = null; // 左树
        this.right = null;// 右树
    }
}
class BinarySearchTree{
    constructor(){
        this.root = null;
    }
    insert(key){
        const newNode = new Node(key);
        const insertNode = (node,newNode)=>{
            // 看下是放在左边还是右边
            if(newNode.key < node.key){ // left
                if(node.left == null){
                    node.left = newNode;
                }else{ // 如果节点已经有了那么继续像当前节点插入
                    insertNode(node.left,newNode);
                }
            }else{ // right
                if(node.right == null){
                    node.right = newNode;
                }else{
                    insertNode(node.right,newNode);
                }
            }
        }
        if(!this.root){ // 如果根没有值 那么他就是根
            this.root = newNode;
        }else{ // 插到某一侧
            insertNode(this.root,newNode)
        }
    }
}
let binaryTree = new BinarySearchTree();
binaryTree.insert(8);
binaryTree.insert(3);
binaryTree.insert(10);

七.图

图可以看成有关联的树,我们可以使用邻接表来描述各个节点的关系
6f031e8b98bed38c0aaaf25cf68ccf47.jpeg

class Graph{
    constructor(){
        this.List = {};
    }
    addNode(v){
        this.List[v] = [];
    }
    addRelation(v,w){
        // 相互存储关系
        this.List[v].push(w);
        this.List[w].push(v);
    }
}
const graph = new Graph();
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'].forEach(node => graph.addNode(node));
graph.addRelation('A', 'B')
graph.addRelation('A', 'C')
graph.addRelation('A', 'D')
console.log(graph.List['A']);

看到这里是不是对数据结构有了一定的认识啦!接下来就靠大家的合理应用啦~


❤️ 感谢大家

如果你觉得这篇内容对你挺有有帮助的话:

  1. 点赞支持下吧,让更多的人也能看到这篇内容(收藏不点赞,我就嘤嘤嘤 -_-)

  2. 关注公众号【Web前端严选】,定期为你推送好文。

2dcc566b288bccb54e0c427936646dd7.png

添加个人微信,进群与小伙伴一起玩耍(已经推出)~

e2f90dc4a06c7a082da797b54f179b19.jpeg

点个在看,大家都看 9306aba139239bec1635692210b84d9d.gif

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据结构学习资料分享 内容概览: 本次分享包涵了大学计算机相关专业必学的“数据结构”课程的一系列学习资料。主要包括: 算法代码:我们提供了多种数据结构的实现代码,包括数组、链表、栈、队列、树、图等。这些代码不仅能帮助你理解数据结构的基本概念,而且能让你明白如何在实际情况中应用这些数据结构。 笔记:详细且系统的笔记,涵盖了数据结构的各个方面,从基础概念到复杂的数据结构如堆、B树等。这些笔记有助于你系统地复习和学习数据结构。 相关书籍推荐:为了更深入地理解数据结构,我们推荐了几本经典的教材和参考书籍。这些书籍将帮助你建立完整的数据结构知识体系。 适用人群: 这份学习资料适用于所有大学计算机相关专业的学生,无论你是初学者还是已经有一定的数据结构基础。同时,对于对数据结构感兴趣的非专业人士,这份资料也是一个很好的起点。 使用建议: 结合理论和实践:在学习的过程中,请结合算法代码和理论知识。尝试自己编写代码实现数据结构,并在遇到问题时参考提供的代码。 由浅入深:建议先从基础的数据结构开始学习,如数组和链表,然后再学习更复杂的数据结构如树和图。 多做练习:数据结构是实践性很强的学科。通过多做练习,你可以更好地理解数据结构的基本概念和原理,并提高编程能力。
作为前端开发者,掌握数据结构和算法是非常重要的。这可以帮助您更好地设计和实现前端应用程序,提高代码的效率和性能。以下是一些建议,可以帮助前端开发者掌握数据结构和算法: 1. 学习基础知识:首先需要了解基本的数据结构和算法,例如数组、链表、栈、队列、哈希表、排序算法、查找算法等等。可以通过阅读相关的书籍或在线教程来学习这些知识。 2. 刷题:练习是掌握数据结构和算法的最好方法。可以刷LeetCode、Hackerrank等在线刷题网站上的算法题目。逐渐地,您可以尝试解决更复杂的问题,并更好地理解算法的实现和应用。 3. 实践项目:在实际项目中,可以运用已掌握数据结构和算法。例如,可以使用二叉树来构建导航栏,使用哈希表来处理用户输入,使用动态规划来解决复杂的问题等等。 4. 学习前端框架:学习流行的前端框架(如React,Vue等),它们提供了大量的优化技术和工具,可以帮助您更好地处理数据结构和算法方面的问题。 5. 加入社区:参与在线社区、论坛或技术博客,了解前端开发者如何使用数据结构和算法来解决实际问题。这也可以帮助您了解当前前端开发领域的最新趋势和技术。 总之,掌握数据结构和算法需要坚持学习和不断练习。只有通过不断学习和实践,才能不断提高自己的技能和水平。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值