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.pswp.cn/bicheng/78624.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78624.shtml
英文地址,請注明出處:http://en.pswp.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;但具體步驟的實現可能因不同情況而有所不…