js(JavaScript)数据结构之堆(Heap)

news2024/11/18 1:49:30

什么是数据结构?

下面是维基百科的解释:

数据结构是计算机存储、组织数据的方式。数据结构意味着接口或封装:一个数据结构可被视为两个函数之间的接口,或者是由数据类型联合组成的存储内容的访问方法封装。

我们每天的编码中都会用到数据结构,下面是常见的数据结构:

  • 数组(Array)
  • 栈(Stack)
  • 队列(Queue)
  • 链表(Linked List)
  • 散列表(Hash)
  • 字典
  • 树(Tree)
  • 图(Graph)
  • 堆(Heap)

堆(Heap)

JavaScript中的堆(Heap)是一块用于存储动态分配内存的区域。在这个堆里,我们可以存储复杂的数据结构,比如对象和数组。不同于栈(Stack),堆的大小不是固定的,而是可以根据需要动态扩展。

想象一下堆就像是一个大仓库,你可以往里面存放各种东西。每当你需要创建一个新的对象或数组时,JavaScript会在这个仓库里动态分配一块空间,然后把对象或数组放进去。这些存储在堆中的数据可以在程序的不同部分被引用和使用。

堆的灵活性使得我们能够处理复杂的数据,并能够动态地创建、修改和删除对象。就像购物时在超市的购物车中添加或移除物品一样,堆允许我们在程序中灵活地管理和使用数据。

堆的案例参考效果

当谈到JavaScript中的堆(Heap)时,通常指的是动态内存分配和存储对象的区域。虽然在JavaScript中不能直接访问和控制堆,但我们可以通过创建对象来演示堆的概念和动态分配特性。

下面是一个案例,它展示了使用HTML和JavaScript创建一个学生信息管理系统。在这个案例中,我们可以动态地添加和删除学生,并将它们的信息显示在页面上。

HTML\JS效果

请添加图片描述

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>学生管理系统</title>
  <style>
    label {
      display: block;
      margin-bottom: 5px;
    }

    input[type="text"] {
      margin-bottom: 10px;
    }

    ul {
      list-style-type: none;
      padding: 0;
    }

    li {
      margin-bottom: 5px;
    }
  </style>
</head>

<body>
  <h2>学生管理系统</h2>
  <h3>添加学生</h3>
  <label for="name">姓名:</label>
  <input type="text" id="name">
  <label for="age">年龄:</label>
  <input type="text" id="age">
  <button onclick="addStudent()">添加学生</button>

  <h3>学生列表</h3>
  <ul id="studentList"></ul>

  <script>
    const students = [];

    function addStudent() {
      const nameInput = document.getElementById('name');
      const ageInput = document.getElementById('age');

      const name = nameInput.value;
      const age = ageInput.value;

      if (name && age) {
        const student = { name, age };
        students.push(student);

        nameInput.value = '';
        ageInput.value = '';

        displayStudents();
      }
    }

    function deleteStudent(index) {
      students.splice(index, 1);
      displayStudents();
    }

    function displayStudents() {
      const studentList = document.getElementById('studentList');
      studentList.innerHTML = '';

      students.forEach((student, index) => {
        const listItem = document.createElement('li');
        listItem.textContent = `${student.name} (年龄: ${student.age})`;

        const deleteButton = document.createElement('button');
        deleteButton.textContent = '删除';
        deleteButton.onclick = () => deleteStudent(index);

        listItem.appendChild(deleteButton);
        studentList.appendChild(listItem);
      });
    }
  </script>
</body>

</html>
案例代码思路和描述

这个案例是一个基本的学生信息管理系统,用户可以通过输入学生的姓名和年龄来添加学生,并以列表的形式显示学生的信息。每个学生条目都包含一个 "删除" 按钮,可以点击该按钮来删除对应的学生。

  1. 在HTML中,我们有一个用于输入学生姓名和年龄的表单,以及一个"添加学生" 按钮来添加学生。还有一个用于显示学生列表的无序列表。
  2. 当用户点击"添加学生" 按钮时,addStudent函数会被调用。
  3. addStudent函数首先获取输入框中的姓名和年龄。
  4. 如果姓名和年龄都存在,它会创建一个表示学生的对象,并将其添加到students数组中。
  5. 然后,它清空输入框中的姓名和年龄,并调用displayStudents函数来重新显示学生列表。
  6. deleteStudent函数用于删除学生。当用户点击某个学生后面的 "删除" 按钮时,该学生将从students数组中删除,并调用displayStudents函数刷新列表。
  7. displayStudents函数用于在页面上显示学生列表。它首先清空现有的列表项,然后遍历students数组,并为每个学生创建一个列表项和对应的 "删除" 按钮。最后,它将这些元素添加到无序列表中。
返回结果

你可以通过在文本框中输入学生的姓名和年龄,然后点击 "添加学生" 按钮来添加学生。添加的学生信息将显示在学生列表中,每个学生后面都有一个 "删除" 按钮。通过点击 "删除" 按钮,可以删除对应的学生。

这个案例演示了堆的概念,因为每次调用addStudent函数时,JavaScript会在堆中动态分配内存以存储新的学生对象。这些对象在堆中被保存,即使方法执行结束,它们的引用仍然存在于students数组中,直到被手动删除。

堆的常用场景

  1. 构建优先队列
  2. 支持堆排序
  3. 快速找出一个集合中的最小值(或者最大值)

堆内存与栈内存的区别

栈内存:

  • 存放基本数据类型和对象变量的指针
  • 自动分配固定大小的内存空间
  • 由系统自动释放

堆内存:

  • 存放引用类型(如object)等大小未知的对象类型数据
  • 动态分配内存,大小不一,也不会自动释放

在JavaScript中,堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(参数传递)。创建对象是为了反复利用,这个对象将被保存到运行时数据区。

持续学习总结记录中,回顾一下上面的内容:
JavaScript中的堆(Heap)是一块用于存储动态分配内存的区域。在这个堆里,我们可以存储复杂的数据结构,比如对象和数组。不同于栈(Stack),堆的大小不是固定的,而是可以根据需要动态扩展。

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

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

相关文章

聊聊websocket那些事

前端必备工具推荐网站(免费图床、API和ChatAI等实用工具): http://luckycola.com.cn/ 一、什么是websocket? WebSocket 是一种在单个 TCP 连接上进行全双工通信的网络协议。 它是 HTML5 中的一种新特性&#xff0c;能够实现 Web 应用程序和服务器之间的实时通信&#xff0c;…

事件分析应急响应-Server2229(环境+解析)

任务环境说明: 服务器场景:Server2229(开放链接)用户名:root,密码:

1116: 删除元素(数组)

题目描述 输入一个递增有序的整型数组A有n个元素&#xff0c;删除下标为i的元素&#xff0c;使其仍保持连续有序。注意&#xff0c;有效下标从0开始。 定义如下两个函数分别实现删除元素操作和数组输出操作。 void del(int a[], int n, int i); /*删除数组a中下标为i的元素*…

鸿蒙Harmony-相对布局(RelativeContainer)详解

成年人的世界&#xff0c;从来没有容易二字&#xff0c;想要什么&#xff0c;就得凭自己的努力去拿&#xff0c;遇到事情就得自己生生的硬抗&#xff0c;希望你即使再辛苦&#xff0c;但还是会选择这滚烫的人生&#xff0c;加油陌生的朋友们 目录 一&#xff0c;定义 二&#x…

三菱FX系列PLC定长切割控制(线缆裁切)

三菱PLC绝对定位指令DDRVA实现往复运动控制详细介绍请查看下面文章链接&#xff1a; https://rxxw-control.blog.csdn.net/article/details/135570157https://rxxw-control.blog.csdn.net/article/details/135570157这篇博客我们介绍线缆行业的定长切割控制相关算法。 1、输送…

分布式限流的主流方案

本文已收录至我的个人网站&#xff1a;程序员波特&#xff0c;主要记录Java相关技术系列教程&#xff0c;共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源&#xff0c;让想要学习的你&#xff0c;不再迷茫。 常见的分布式限流方案 前面我们了解了什么是分布式…

30 3D导航栏

效果演示 实现了一个导航栏&#xff0c;其中包含了五个图标&#xff0c;每个图标都有一个悬浮的文字标签&#xff0c;当鼠标悬停在图标上时&#xff0c;文字标签会旋转并向上移动&#xff0c;同时底部会出现一个阴影效果。整个导航栏的背景颜色为浅灰色。 Code <ul><…

【Java】IDEA中的JFormDesigner使用教程

目录 1 安装 JFormDesigner 插件2 JFormDesigner 使用教程2.1 新建JFormDesigner Form时的选项2.2 JFormDesigner Form界面布局2.3 JFormDesigner 常用组件 JFormDesigner 是一款用于设计和创建图形用户界面&#xff08;GUI&#xff09;的插件&#xff0c;它允许开发者使用可视…

DAY8--learning english

一、积累 1.haunt Why Ghost dont haunt chinese. 为什么鬼不会出现在中国人旁边? 2.confess i have a confession to make ... I actally a blind. 我要坦白一件事……我其实是个盲人。 3.brake Press S button to brake, or to reverse if the vehicle has stopped, 按住…

python 列表的高级应用

当前版本&#xff1a; Python 3.8.4 简介 列表&#xff08;list&#xff09;是Python编程语言中的基本数据类型之一&#xff0c;也是一个非常重要的通用序列。在其它编程语言中&#xff0c;它们通常被称为“数组”。可以存储多个元素&#xff0c;包括数字、字符串、甚至其他列…

【纯CSS特效源码】(二)精美的立体字

1.漂浮感立体 关键处&#xff1a; text-shadow:2px -2px white, -6px 6px gray;给字体添加了两层shadow&#xff0c;右上角白色提亮&#xff0c;左下角灰色阴影。 参数解释&#xff1a;例子中2px -2px white&#xff0c;代表右上角白色 第一个参数2px&#xff1a;正数表示从左…

CSS 实现三角形的技巧

目录 1、使用 border 绘制三角形 2、使用 linear-gradient 绘制三角形 3、使用 conic-gradient 绘制三角形 4、transform: rotate 配合 overflow: hidden 绘制三角形 5、使用 clip-path 绘制三角形 6、利用字符绘制三角形 1、使用 border 绘制三角形 使用 border 实现三角…

pinia的理解

Vue组件通讯类型 组件通讯的基本概念 以及pinia和vuex之间的一些差异 父子&#xff0c;子父&#xff0c;祖孙跨层级&#xff0c;非父子任意组件之间的通讯&#xff0c;对此进行一些介绍。 而无论是vuex还是pinia都是属于非父子组件之间任意通讯的一种状态管理模式&#xff0…

Python爬虫|使用urllib获取百度首页源码

在这个博客中&#xff0c;我们将一起探索百度首页的源码&#xff0c;深入了解从URL请求到页面呈现的全过程。我们将使用Python的urllib.request库来模拟浏览器发送请求&#xff0c;并解码响应中的页面源码。通过分析源码&#xff0c;我们将揭示网页的结构、内容和背后的工作原理…

mysql的gtid主从复制,从库误操作更新操作,

一&#xff1a;查看mysql的从库&#xff0c;发现sql进程状态 “no”.提示执行传输过来的binlog日志&#xff0c;执行失败&#xff0c; 二&#xff1a;查看主库对应的二进制日志的gtid地方。插入一些数据。 # mysqlbinlog --base64-outputdecode-rows -v mysql-bin.000001 |gre…

echarts -- 柱状图之柱状条如何显示白色侧阴影且鼠标移入时高亮

有个图表是要求柱状条的右下侧显示一个白色的侧阴影&#xff0c;一直没找到合适的方法&#xff0c; 加border或者shadowColor都达不到需求的效果。 因为柱状图 中series里可以包含多组数据&#xff0c;有几组就代表一个系列中有几个数据。这就代表series里要写七组数据。 对于上…

git-生成证书、公钥、私钥、error setting certificate verify locations解决方法

解决方法 方法1-配置证书、公钥、私钥打开Git Bash设置名称和邮箱执行&#xff0c;~/.ssh执行&#xff0c;ssh-keygen -t rsa -C "这是你的邮箱"&#xff0c;如图&#xff1a;进入文件夹可以看到用记事本之类的软件打开id_rsa.pub文件&#xff0c;并且复制全部内容。…

动态规划篇-04:完全平方数

279、完全平方数 状态转移方程 base case 当n 0 时&#xff0c;和为n的完全平方数的最少数量为0. 明确状态 “原问题或子问题中变化的变量” 在本题中&#xff0c;状态是 “完全平方数的最少数量”。因为当我们选择不同的完全平方数的时候&#xff0c;所需完全平方数的数量…

两个Mesh路由、一个5口交换机,打造智能家居无缝网络覆盖

在现代家庭中&#xff0c;无线网络已经成为了必需品&#xff0c;每个人都希望享受到无缝连接的畅快体验。然而&#xff0c;由于信号覆盖范围的限制和信号干扰等问题&#xff0c;很多家庭在组网方面遇到了一些困难。 对于有需求的家庭而言&#xff0c;两个Mesh路由器是一种非常…

错误处理(基于ESP-IDF)

主要参考资料 B站Up主孤独的二进制《错误处理 - 乐鑫 ESP32 物联网开发框架 ESP-IDF 开发入门》 ESP-IDF编程指南>API指南>错误消息: https://docs.espressif.com/projects/esp-idf/zh_CN/v5.1/esp32s3/api-guides/error-handling.html ESP-IDF编程指南>API指南>严…