javaScript--数据结构和算法

在 JavaScript 里,数据结构和算法是十分关键的部分,下面介绍几种常见的数据结构和对应的算法。

  1. 数组(Array)
    数组是最基础的数据结构,用于存储一系列有序的数据。

    // 创建数组
    const arr = [1, 2, 3, 4, 5];// 访问元素
    console.log(arr[0]); // 输出 1// 修改元素
    arr[0] = 10;
    console.log(arr); // 输出 [10, 2, 3, 4, 5]// 遍历数组
    for (let i = 0; i < arr.length; i++) {console.log(arr[i]);
    }
    
  2. 栈(Stack)
    栈是一种后进先出(LIFO)的数据结构,仅能在栈顶进行插入和删除操作。

    class Stack {constructor() {this.items = [];}// 入栈push(element) {this.items.push(element);}// 出栈pop() {if (this.isEmpty()) {return null;}return this.items.pop();}// 获取栈顶元素peek() {if (this.isEmpty()) {return null;}return this.items[this.items.length - 1];}// 判断栈是否为空isEmpty() {return this.items.length === 0;}// 获取栈的大小size() {return this.items.length;}
    }// 使用栈
    const stack = new Stack();
    stack.push(1);
    stack.push(2);
    console.log(stack.pop()); // 输出 2
    
  3. 队列(Queue)
    队列是一种先进先出(FIFO)的数据结构,元素从队尾入队,从队头出队。

    class Queue {constructor() {this.items = [];}// 入队enqueue(element) {this.items.push(element);}// 出队dequeue() {if (this.isEmpty()) {return null;}return this.items.shift();}// 获取队头元素front() {if (this.isEmpty()) {return null;}return this.items[0];}// 判断队列是否为空isEmpty() {return this.items.length === 0;}// 获取队列的大小size() {return this.items.length;}// 清空队列clear() {this.items = [];}
    }// 使用队列
    const queue = new Queue();
    queue.enqueue(1);
    queue.enqueue(2);
    console.log(queue.dequeue()); // 输出 1
    
  4. 链表(Linked List)
    链表是由节点构成的数据结构,每个节点包含数据和指向下一个节点的指针。

    class Node {constructor(data) {this.data = data;this.next = null;}
    }class LinkedList {constructor() {this.head = null;this.length = 0;}// 在链表尾部添加节点append(data) {const newNode = new Node(data);if (this.head === null) {this.head = newNode;} else {let current = this.head;while (current.next !== null) {current = current.next;}current.next = newNode;}this.length++;}// 打印链表print() {let current = this.head;const result = [];while (current !== null) {result.push(current.data);current = current.next;}console.log(result.join(' -> '));}
    }// 使用链表
    const linkedList = new LinkedList();
    linkedList.append(1);
    linkedList.append(2);
    linkedList.print(); // 输出 1 -> 2
    
  5. 排序算法 - 冒泡排序(Bubble Sort)
    冒泡排序是一种简单的排序算法,它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。

    function bubbleSort(arr) {const len = arr.length;for (let i = 0; i < len - 1; i++) {for (let j = 0; j < len - 1 - i; j++) {if (arr[j] > arr[j + 1]) {// 交换元素[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];}}}return arr;
    }const unsortedArray = [5, 3, 8, 4, 2];
    const sortedArray = bubbleSort(unsortedArray);
    console.log(sortedArray); // 输出 [2, 3, 4, 5, 8]
    
  6. 二叉树
    二叉树是每个节点最多有两个子节点的树结构,这两个子节点通常被称为左子节点和右子节点。

    // 二叉树节点类
    class TreeNode {constructor(value) {// 节点存储的值this.value = value;// 左子节点,初始为 nullthis.left = null;// 右子节点,初始为 nullthis.right = null;}
    }
    // 创建根节点
    const root = new TreeNode(1);
    // 为根节点添加左子节点
    root.left = new TreeNode(2);
    // 为根节点添加右子节点
    root.right = new TreeNode(3);
    // 为左子节点添加左子节点
    root.left.left = new TreeNode(4);
    // 为左子节点添加右子节点
    root.left.right = new TreeNode(5);// 前序遍历
    function preOrderTraversal(node) {if (node === null) {return;}console.log(node.value);preOrderTraversal(node.left);preOrderTraversal(node.right);
    }
    // 对上述构建的二叉树进行前序遍历
    preOrderTraversal(root);// 中序遍历
    function inOrderTraversal(node) {if (node === null) {return;}inOrderTraversal(node.left);console.log(node.value);inOrderTraversal(node.right);
    }
    // 对上述构建的二叉树进行中序遍历
    inOrderTraversal(root);// 后续遍历
    function postOrderTraversal(node) {if (node === null) {return;}postOrderTraversal(node.left);postOrderTraversal(node.right);console.log(node.value);
    }
    // 对上述构建的二叉树进行后序遍历
    postOrderTraversal(root);// 层序遍历
    function levelOrderTraversal(root) {if (root === null) {return;}const queue = [root];while (queue.length > 0) {const current = queue.shift();console.log(current.value);if (current.left!== null) {queue.push(current.left);}if (current.right!== null) {queue.push(current.right);}}
    }
    // 对上述构建的二叉树进行层序遍历
    levelOrderTraversal(root);
    

    二叉树是一种灵活且强大的数据结构,不同的遍历方式适用于不同的场景。前序遍历常用于复制二叉树、表达式树求值;中序遍历常用于二叉搜索树的排序输出;后序遍历常用于释放二叉树的节点内存;层序遍历常用于按层次访问节点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/78624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

π0.5:带开放世界泛化的视觉-语言-动作模型

25年4月来自具身机器人创业公司 PI 公司的论文“π0.5: a Vision-Language-Action Model with Open-World Generalization”。 为了使机器人发挥作用&#xff0c;它们必须在实验室之外的现实世界中执行实际相关的任务。虽然视觉-语言-动作 (VLA) 模型在端到端机器人控制方面已…

使用 OpenCV 和 dlib 进行人脸检测

文章目录 1. 什么是 dlib2. 前期准备介绍2.1 环境准备2.2 dlib 的人脸检测器 3. 代码实现3.1 导入库3.2 加载检测器3.3 读取并调整图像大小3.4 检测人脸3.5 绘制检测框3.6 显示结果 4. 完整代码5. 优化与改进5.1 提高检测率5.2 处理 BGR 与 RGB 问题 6. 总结 人脸检测是计算机视…

spring 的PropertySource 类与 @PropertySource 注解详解与对比

PropertySource 类与 PropertySource 注解详解与对比 在这里插入图片描述 一、PropertySource 类详解 1. 类型与作用 类型&#xff1a;接口&#xff08;org.springframework.core.env.PropertySource&#xff09;作用&#xff1a;抽象配置数据源&#xff0c;提供统一的键值…

Java后端开发day37--源码解析:TreeMap可变参数--集合工具类:Collections

&#xff08;以下内容全部来自上述课程&#xff09; 1. TreeMap 1.1 须知 1.1.1 Entry 节点初始为黑色&#xff1a;提高代码阅读性 1.1.2 TreeMap中的成员变量 comparator&#xff1a;比较规则root&#xff1a;红黑树根节点的地址值size&#xff1a;集合的长度和红黑树…

基于Playwright的浏览器自动化MCP服务

一、服务定位与核心功能 github.com/executeautomation/mcp-playwright 是一个基于 Playwright&#xff08;微软开源的跨浏览器自动化测试框架&#xff09;的 Model Context Protocol (MCP) 服务&#xff0c;核心功能是将浏览器自动化能力集成到大语言模型&#xff08;LLM&…

OSPF网络协议

OSPF&#xff08;Open Shortest Path First&#xff09;是一种链路状态路由协议&#xff0c;属于IGP&#xff08;内部网关协议&#xff09;&#xff0c;用于在单一自治系统&#xff08;AS&#xff09;内动态分发路由信息。它通过计算最短路径&#xff08;基于Dijkstra算法&…

Ubuntu 22.04.4操作系统初始化详细配置

上一章节&#xff0c;主要讲解了Ubuntu 22.04.4操作系统的安装&#xff0c;但是在实际生产环境中&#xff0c;需要对Ubuntu操作系统初始化&#xff0c;从而提高系统的性能和稳定性。 一、查看Ubuntu系统版本和内核版本 # 查看系统版本 testubuntu:~$ sudo lsb_release -a Rel…

【Linux应用】开发板快速上手:镜像烧录、串口shell、外设挂载、WiFi配置、SSH连接、文件交互(RADXA ZERO 3为例)

【Linux应用】开发板快速上手&#xff1a;镜像烧录、串口shell、外设挂载、WiFi配置、SSH连接、文件交互&#xff08;RADXA ZERO 3为例&#xff09; 参考&#xff1a; ZERO 3 | Radxa Docs 大部分的Linux开发板等设备都大同小异 如树莓派、香橙派、STM32MP135的Linux开发板等 …

Redis使用总结

NoSQL 1.1为什么要用NoSQL 面对现在用户数据的急剧上升&#xff0c;我们需要对这些用户数据进行挖掘&#xff0c;传统的关系型数据库已经不适合这些 应用了.Nosql 的发展可以很了的处理这些大的数据. 1.2什么是NoSQL Not Only Sql->NoSQL(不仅仅是SQL) 非关系型数据库.随…

Unity ML-Agents + VScode 环境搭建 Windows

安装Unity 先去官网下载Unity Hub&#xff0c;然后安装在D盘就可以了&#xff0c;你需要手机上安装一个Unity Connect进行账号注册。 详细的注册可以参考&#xff1a; https://blog.csdn.net/Dugege007/article/details/128472571 注册好了以后登入电脑端的Unity Hub&#x…

Linux电源管理(2)_常规的电源管理的基本概念和软件架构

原文&#xff1a; Linux电源管理(2)_Generic PM之基本概念和软件架构 1. 前言 Linux系统中那些常规的电源管理手段&#xff0c;包括关机&#xff08;Power off&#xff09;、待机&#xff08;Standby or Hibernate&#xff09;、重启&#xff08;Reboot&#xff09;等。这些…

机器学习基础理论 - 分类问题评估指标

几个定义:混淆矩阵 TP: True Positives, 表示实际为正例且被分类器判定为正例的样本数FP: False Positives, 表示实际为负例且被分类器判定为正例的样本数FN: False Negatives, 表示实际为正例但被分类器判定为负例的样本数TN: True Negatives, 表示实际为负例且被分类…

在线教育系统开发常见问题及解决方案:源码部署到运营维护

当下&#xff0c;越来越多的教育机构、企业培训部门以及创业者&#xff0c;选择开发属于自己的在线教育系统。然而&#xff0c;从源码部署到实际运营&#xff0c;整个过程中常常会遇到一系列技术与管理难题。今天&#xff0c;笔者将从在线教育系统源码维护、运营等几个方向为大…

RAG(Retrieval-Augmented Generation,检索增强生成)

RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09;是一种结合 信息检索 和 文本生成 的技术&#xff0c;旨在提升大语言模型&#xff08;LLM&#xff09;生成内容的准确性和时效性。其核心思想是&#xff1a;先检索相关知识&#xff0c;再基…

项目实战 -- 状态管理

redux基础 还记得好久好久之前就想要实现的一个功能吗&#xff1f; 收起侧边栏折叠菜单&#xff0c;没错&#xff0c;现在才实现 因为不是父子通信&#xff0c;所以处理起来相对麻烦一点 可以使用状态树或者中间人模式 这就需要会redux了 Redux工作流&#xff1a; 异步就…

Go语言之路————指针、结构体、方法

Go语言之路————指针、结构体、方法 前言指针结构体声明初始化使用组合引用结构体和指针结构体的标签 方法例子结合结构体总结 前言 我是一名多年Java开发人员&#xff0c;因为工作需要现在要学习go语言&#xff0c;Go语言之路是一个系列&#xff0c;记录着我从0开始接触Go…

[创业之路-390]:人力资源 - 社会性生命系统的解构与重构:人的角色嬗变与组织进化论

前言&#xff1a; 人、财、物、信息、机制、流程、制度、方法共同组合了一个持续的消耗资源、持续的价值创造、持续面临生存与发展、遗传与变异的社会性生命系统。 "人"是所有社会性生命系统最最基础性的要素&#xff0c;它弥漫在系统中多维立体空间的不同节点上&am…

JS执行器在UI自动化测试中的应用

前言 在进行UI自动化过程会遇到滚动条下拉、隐藏元素定位、只读属性元素的编辑、富文本处理等&#xff0c;此时可以使用JS执行器简化我们的一些处理操作。 具体应用 JS执行器的使用步骤&#xff1a; 1.先写个JS脚本&#xff0c;如果需要获取操作后的值&#xff0c;JS脚本前面…

解析Suna:全球首款开源通用AI智能体

导语&#xff1a; 嘿&#xff0c;哥们儿&#xff0c;最近 AI Agent 这块儿挺火的&#xff0c;有个叫 Suna 的开源项目冒出来挺快&#xff01;听说只用了 3 周就开发出来了&#xff0c;但功能上感觉已经能跟那个商业版的 Manus掰掰手腕了。它能帮你搞定浏览器自动化、管文件、爬…

模板方法模式:定义算法骨架的设计模式

模板方法模式&#xff1a;定义算法骨架的设计模式 一、模式核心&#xff1a;模板方法定义算法骨架&#xff0c;具体步骤延迟到子类实现 在软件开发中&#xff0c;经常会遇到这样的情况&#xff1a;某个算法的步骤是固定的&#xff0c;但具体步骤的实现可能因不同情况而有所不…