Js 数据结构全面讲解

发布时间:2023-05-20

一、数组

1、定义:数组是一种数据结构,用于存储有序的元素集合。 2、操作:

//创建一个空数组
let arr = [];
//添加元素
arr.push(1);
arr.push(2);
//获取元素
console.log(arr[0]); //1
//获取数组长度
console.log(arr.length); //2
//删除元素
arr.splice(0, 1); //从下标0开始删除1个元素
//遍历数组
for(let i = 0; i < arr.length; i++){
    console.log(arr[i]);
}

3、应用: 使用数组存储多个元素,实现数据的批量操作,如购物车中存储多个商品,网页中存储多个评论等。

二、栈

1、定义:栈是一种特殊的数据结构,只能在数组的末尾添加或删除元素。 2、操作:

//创建一个栈
let stack = [];
//添加元素
stack.push(1);
stack.push(2);
//删除元素
stack.pop();
//获取栈顶元素
console.log(stack[stack.length - 1]);
//判断栈是否为空
console.log(stack.length === 0);

3、应用: 在计算机程序中,栈常用于配合递归实现函数调用、括号匹配等操作。

三、队列

1、定义:队列是一种特殊的数据结构,只能在数组的末尾添加元素,在数组的开头删除元素。 2、操作:

//创建一个队列
let queue = [];
//添加元素
queue.push(1);
queue.push(2);
//删除元素
queue.shift();
//获取队列头部元素
console.log(queue[0]);
//判断队列是否为空
console.log(queue.length === 0);

3、应用: 队列常用于实现广度优先搜索算法,并且在计算机中还有很多其他的应用场景,如操作系统中的任务队列、打印机中的打印队列等。

四、链表

1、定义:链表是一种数据结构,由节点组成,每个节点保存数据和指向下一个节点的指针。 2、操作:

//定义一个节点
class Node {
    constructor(val, next = null) {
        this.val = val;
        this.next = next;
    }
}
//创建一个链表
let head = new Node(1);
head.next = new Node(2);
head.next.next = new Node(3);
//遍历链表
let cur = head;
while(cur){
    console.log(cur.val);
    cur = cur.next;
}
//在链表中插入节点
let newNode = new Node(4);
newNode.next = head.next;
head.next = newNode;
//在链表中删除节点
head.next = head.next.next;

3、应用: 链表常用于实现LRU缓存、哈希表中的拉链法等。

五、树

1、定义:树是一种数据结构,由节点和边组成,每个节点保存数据,并指向零或多个子节点。 2、操作:

//定义一个节点
class Node {
    constructor(val, children = []) {
        this.val = val;
        this.children = children;
    }
}
//创建一个树
let root = new Node(1);
root.children = [new Node(2), new Node(3)];
//遍历树-深度优先搜索
function DFS(root) {
    console.log(root.val);
    for(let child of root.children){
        DFS(child);
    }
}
DFS(root);
//遍历树-广度优先搜索
function BFS(root) {
    let queue = [root];
    while(queue.length){
        let node = queue.shift();
        console.log(node.val);
        for(let child of node.children){
            queue.push(child);
        }
    }
}
BFS(root);

3、应用: 树的应用广泛,如在页面中渲染组件、文件系统中的目录结构、计算机网络中的路由表等。

六、图

1、定义:图是一种数据结构,由点和边组成,每个点可以与其他点直接相连。 2、操作:

//定义一个点
class Node {
    constructor(val, neighbors = []) {
        this.val = val;
        this.neighbors = neighbors;
    }
}
//创建一个图
let node1 = new Node(1);
let node2 = new Node(2);
let node3 = new Node(3);
let node4 = new Node(4);
node1.neighbors = [node2, node4];
node2.neighbors = [node1, node3];
node3.neighbors = [node2, node4];
node4.neighbors = [node1, node3];
//遍历图-深度优先搜索
let visited = new Set();
function DFS(node) {
    visited.add(node);
    console.log(node.val);
    for(let neighbor of node.neighbors){
        if(!visited.has(neighbor)){
            DFS(neighbor);
        }
    }
}
DFS(node1);
//遍历图-广度优先搜索
function BFS(node) {
    let queue = [node];
    visited.add(node);
    while(queue.length){
        let curr = queue.shift();
        console.log(curr.val);
        for(let neighbor of curr.neighbors){
            if(!visited.has(neighbor)){
                visited.add(neighbor);
                queue.push(neighbor);
            }
        }
    }
}
BFS(node1);

3、应用: 在现实生活中,图的应用非常多,如社交网络中的人际关系、地图中的路径规划、路网中的交通流等。