JS数据结构之“栈”、“队列”、“链表”

一、栈

JS中没有栈这种数据类型,创建栈其实是创建数组。push(内容)入栈;pop()出栈;

const stack = [];
stack.push(1);
stack.push(2);
const item1 = stack.pop();
const item2 = stack.pop();

二、队列

JS中没有队列这种数据类型,创建队列其实是创建数组。push(内容)入队;shift()出队;

const queue = [];
queue.push(1);
queue.push(2);
const item1 = queue.shift();
const item2 = queue.shift();

三、链表

在JavaScript中,链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和一个或多个指向列表中其他节点的引用(链接)。链表与数组不同,它在内存中不是连续存储的,这使得链表在插入和删除操作时更加高效。

以下是链表的基本组成部分和操作:

节点(Node)

链表中的每个元素都被称为节点,每个节点通常包含两个部分:

  1. 数据域:存储节点的数据。
  2. 指针域(或链接域):存储指向下一个节点的引用。

下面是一个简单的节点类实现:

class ListNode {constructor(data) {this.data = data; // 数据域this.next = null; // 指针域,初始为null}
}

JS中简单的链表写成下面这种形式就可以。

const a = { val: 'a' };
const b = { val: 'b' };
const c = { val: 'c' };
const d = { val: 'd' };a.next = b;
b.next = c;
c.next = d;// 遍历链表
let p = a;
while (p) {console.log(p.val);p = p.next;
}// 插入操作
const e = { val: 'e' };
c.next = e;
e.next = d;// 删除
c.next = d;

链表(LinkedList)

链表本身是一个包含多个节点的数据结构,通常会有以下操作:

  1. 初始化:创建一个空链表。
  2. 插入:在链表的特定位置插入一个新节点。
  3. 删除:从链表中删除一个节点。
  4. 查找:在链表中查找一个节点。
  5. 遍历:访问链表中的每个节点。

以下是一个简单的链表类实现:

class LinkedList {constructor() {this.head = null; // 初始化时,头节点为null}// 在链表末尾添加一个新节点append(data) {let newNode = new ListNode(data);if (!this.head) {this.head = newNode;return;}let current = this.head;while (current.next) {current = current.next;}current.next = newNode;}// 在链表头部添加一个新节点prepend(data) {let newNode = new ListNode(data);newNode.next = this.head;this.head = newNode;}// 删除特定数据的节点delete(data) {if (!this.head) return;if (this.head.data === data) {this.head = this.head.next;return;}let current = this.head;while (current.next) {if (current.next.data === data) {current.next = current.next.next;return;}current = current.next;}}// 查找特定数据的节点find(data) {let current = this.head;while (current) {if (current.data === data) {return current;}current = current.next;}return null;}// 遍历链表并打印每个节点的数据print() {let current = this.head;while (current) {console.log(current.data);current = current.next;}}
}

使用链表

下面是如何使用上面定义的链表类:

let list = new LinkedList();
list.append(1);
list.append(2);
list.append(3);
list.prepend(0);
list.print(); // 输出: 0 1 2 3
list.delete(2);
list.print(); // 输出: 0 1 3

链表在JavaScript中的应用非常广泛,尤其是在需要频繁插入和删除操作的场景中,它比数组更加高效。然而,链表也有其缺点,比如它不支持随机访问,访问特定索引的元素需要从头开始遍历。

使用链表指针获取JSON节点值

const json = {a: { b: { c: 1 } },d: { e: 2 },};const path = ['a', 'b', 'c'];
let p = json;
path.forEach(k => {p = p[k];
});

JS中的原型链

const obj = {};
const func = () => { };
const arr = [];// 如果A沿着原型链能够找到B.prototype,那么A instanceof B为true
// 如果在A对象上没有找到x属性,那么会沿着原型链找x属性Object.prototype.x = 'x';
Function.prototype.y = 'y';

四、集合

在JavaScript中,集合(Set)是一种内置的对象类型,用于存储唯一值(不重复的值)的集合。集合中的值可以是任何类型的数据,包括原始值或对象引用。

以下是关于JavaScript中集合的一些关键点:

创建集合

你可以使用new Set()构造函数来创建一个新的集合。

const mySet = new Set();

你也可以在创建时初始化集合,通过传递一个可迭代对象(如数组)。

const mySet = new Set([1, 2, 3, 4]);

添加元素

使用add()方法可以向集合中添加新元素。如果元素已存在,则不会重复添加。

mySet.add(5);

删除元素

使用delete()方法可以从集合中删除特定的元素,如果元素存在,则返回true,否则返回false

mySet.delete(5); // 如果元素5存在,则删除并返回true

检查元素是否存在

使用has()方法可以检查集合中是否存在某个元素。

mySet.has(5); // 如果元素5存在,则返回true

获取集合的大小

使用size属性可以获取集合中元素的数量。

console.log(mySet.size); // 输出集合中的元素数量

清空集合

使用clear()方法可以清空集合中的所有元素。

mySet.clear();

遍历集合

集合是可迭代的,你可以使用for...of循环来遍历集合中的元素。

for (const item of mySet) {console.log(item);
}

或者使用forEach()方法。

mySet.forEach((value) => {console.log(value);
});

集合操作

集合支持多种数学集合操作,如并集、交集和差集。

  • 并集:使用...扩展运算符和new Set()可以创建两个集合的并集。
const setA = new Set([1, 2, 3]);
const setB = new Set([3, 4, 5]);
const union = new Set([...setA, ...setB]); // Set {1, 2, 3, 4, 5}
  • 交集:使用filter()方法可以创建两个集合的交集。
const intersection = new Set([...setA].filter((x) => setB.has(x))); // Set {3}
  • 差集:同样使用filter()方法可以创建两个集合的差集。
const difference = new Set([...setA].filter((x) => !setB.has(x))); // Set {1, 2}

集合在JavaScript中是一种非常有用的数据结构,特别是当你需要确保存储的数据唯一性时。它们提供了一种简单的方式来处理不重复的值的集合,并支持高效的数据操作。

let mySet = new Set();
// 1.添加
mySet.add(1);
mySet.add(5);
// 这个5不会被添加
mySet.add(5);
mySet.add('some text');
let o = { a: 1, b: 2 };
mySet.add(o);
// 但是这个{a: 1, b: 2 }对象会被添加 因为这个对象和o对象是两个不一样的内存
mySet.add({ a: 1, b: 2 });// 2.has方法
const has = mySet.has(5);// 3.delete方法
mySet.delete(5);// 4.迭代Set 4种方法
for (let item of mySet) console.log(item);
for (let item of mySet.keys()) console.log(item);
for (let item of mySet.values()) console.log(item);
for (let [key,value] of mySet.entries()) console.log(key,value);
// 5.如何把Set和array互转
// 第一种方法 通过...运算
const myArr1 = [...mySet];
// 第二种方法 通过调用from方法
const myArr2 = Array.from(mySet);// 6.如何把array转化为Set
const mySet2 = new Set([1, 2, 3, 4]);// 求交集
const intersection = new Set([...mySet].filter(x => mySet2.has(x)));// 求差集
const difference = new Set([...mySet].filter(x => !mySet2.has(x)));
// 去重
const arr = [1, 1, 2, 2];
const arr2 =[... new Set(arr)];// 判断元素是否在集合中
const set = new Set(arr);
const has = set.has(3);// 求交集
const set2 = new Set([2, 3]);
const set3 = new Set([...set].filter(item => set2.has(item)));

五、字典

const m = new Map();
//增
m.set('a', 'aa');
m.set('b', 'bb');//删
m.delete('b');
// m.clear();// 改
m.set('a', 'aaa');

JavaScript也提供了一个Map对象,它是一个更合适的字典实现,因为它保持键的插入顺序,并且允许任何类型的值作为键。

const myMap = new Map();
myMap.set('key1', 'value1');
myMap.set('key2', 'value2');console.log(myMap.get('key1')); // 输出 'value1'
myMap.delete('key1');
console.log(myMap.has('key1')); // 输出 false// 遍历Map
for (const [key, value] of myMap) {console.log(key + ': ' + value);
}

另外,可以使用对象(Object)来模拟字典的行为。字典是一种数据结构,用于存储键值对,其中每个键都是唯一的,每个键都映射到一个值。

以下是关于在JavaScript中使用对象作为字典的一些关键点:

创建字典

你可以通过创建一个空对象来模拟一个字典。

const myDictionary = {};

添加键值对

你可以通过给对象属性赋值来添加键值对。

myDictionary.key1 = 'value1';
myDictionary['key2'] = 'value2';

访问值

你可以通过键来访问对应的值。

console.log(myDictionary.key1); // 输出 'value1'
console.log(myDictionary['key2']); // 输出 'value2'

修改值

你可以通过键来修改对应的值。

myDictionary.key1 = 'newValue1';

删除键值对

你可以使用delete操作符来删除键值对。

delete myDictionary.key1;

检查键是否存在

你可以使用in操作符来检查一个键是否存在于字典中。

console.log('key1' in myDictionary); // 输出 false,因为已经删除了

或者使用hasOwnProperty方法来检查对象自身属性中是否具有指定的属性。

console.log(myDictionary.hasOwnProperty('key2')); // 输出 true

遍历字典

你可以使用for...in循环来遍历字典中的所有键。

for (const key in myDictionary) {if (myDictionary.hasOwnProperty(key)) {console.log(key + ': ' + myDictionary[key]);}
}

使用Object.keys()Object.values()

Object.keys()方法返回一个包含对象所有自身可枚举属性名称的数组,而Object.values()方法返回一个包含对象自身所有可枚举属性值的数组。

const keys = Object.keys(myDictionary); // ['key2']
const values = Object.values(myDictionary); // ['value2']

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

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

相关文章

【51单片机】串口通信原理 + 使用

学习使用的开发板:STC89C52RC/LE52RC 编程软件:Keil5 烧录软件:stc-isp 开发板实图: 文章目录 串口硬件电路UART串口相关寄存器 编码单片机通过串口发送数据电脑通过串口发送数据控制LED灯 串口 串口是一种应用十分广泛的通讯接…

嵌入式web开发:boa、lighttpd

嵌入式web开发:boa、lighttpd https://blog.csdn.net/m0_37105371/category_10937068.html BOA服务器的移植-CSDN博客 【第1部分:boa服务器部署到ubuntu里】 http://www.boa.org/boa-0.94.13.tar.gz tar xvzf boa-0.94.13.tar.gz cd boa-0.94.13/src/ a…

RC高通滤波器Bode图分析(传递函数零极点)

RC高通滤波器 我们使得R1K,C1uF;电容C的阻抗为Xc; 传递函数 H ( s ) u o u i R X C R R 1 s C R s R C 1 s R C (其中 s j ω ) H(s)\frac{u_{o} }{u_{i} } \frac{R }{X_{C}R} \frac{R }{\frac{1}{sC}R} \fra…

Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户附数据代码

Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户|附数据代码 最近我们被客户要求撰写关于银行拉新活动的研究报告,包括一些图形和统计输出。 项目背景:银行的主要盈利业务靠的是贷款&…

撰写开发信利器,高效工具助你赢在起点

ZohoCampaigns是电子邮件营销平台,提供创建、发送和分析邮件方案。其优势包括易用性、丰富模板、精准筛选、自动化和详细报告。外贸人员可用其高效发送开发信,追踪效果并优化策略,促进业务增长。 一、为什么选择Zoho Campaigns? …

协程5 --- 栈切换

文章目录 ucontext相关函数例子ucontext_t结构 setjump、longjump相关函数例子jmp_buf结构 汇编实现解析图示 ucontext 相关函数 #include <ucontext.h> int getcontext(ucontext_t *ucp);初始化ucp结构体&#xff0c;将当前上下文保存在ucp中。 int setcontext(const …

【Linux】Pinctrl子系统和GPIO子系统

Pinctrl子系统 在许多soc内部包含了多个pin控制器&#xff0c;通过pin控制器的寄存器&#xff0c;我们可以配置一个或者一组引脚的功能和特性。Linux内核为了统一各soc厂商的pin脚管理&#xff0c;提供了pinctrl子系统。该系统的作用&#xff1a; 在系统初始化的时候&#xf…

《Vue3 报错》Uncaught TypeError: s.finally is not a function

解决方案&#xff1a; 新建文件 my-polyfill.js // 当浏览器环境不支持Promise.prototype.finally if (!Promise.prototype[finally]) {Promise.prototype[finally] function(callback) {let P this.constructor;return this.then(value > P.resolve(callback()).then(…

RabbitMQ 七种工作模式介绍

目录 1.简单模式队列 2.WorkQueue(⼯作队列) 3 Publish/Subscribe(发布/订阅) 4 Routing(路由模式) 5.Topics(通配符模式) 6 RPC(RPC通信) 7 Publisher Confirms(发布确认) RabbitMQ 共提供了7种⼯作模式供我们进⾏消息传递,接下来一一介绍它的实现与目的 1.简单模式队列…

数组类算法【leetcode】

704. 二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 二分查找 用于有序数组中&#xff0c;没有重复的数组。…

Pandas 数据分析工具详细教程

Pandas 数据分析工具详细教程 Pandas 是一个强大的 Python 数据分析库&#xff0c;广泛应用于数据科学、数据分析和机器学习等领域。它提供了高效的数据操作和分析功能&#xff0c;使得数据处理变得简单而高效。本文将详细介绍 Pandas 的基本概念、数据结构、常用操作及其在数…

基于 EventBridge + DashVector 打造 RAG 全链路动态语义检索能力

作者&#xff1a;肯梦 本文将演示如何使用事件总线&#xff08;EventBridge&#xff09;&#xff0c;向量检索服务&#xff08;DashVector&#xff09;&#xff0c;函数计算&#xff08;FunctionCompute&#xff09;结合灵积模型服务 [ 1] 上的 Embedding API [ 2] &#xff0…

GooglePlay: 应用和游戏的内容分级

对于后台私信的开发者们,希望能够携带详细过审记录和拒审邮件一同发来,方便我们尽快解决问题 应用与游戏 为您的应用或游戏选择类别和标签选择要添加的标签选择类别并添加标签类别示例与应用、游戏以及两者中所投放广告的内容分级相关的要求应用如何获得内容分级内容分级的用…

将Notepad++添加到右键菜单【一招实现】

一键添加注册表 复制以下代码保存为 Notepad.reg&#xff0c;将红框内路径修改为自己电脑的“Notepad.exe路径”后&#xff0c;再双击运行即可。 Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\shell\NotePad] "Notepad" "Icon""D:\\N…

[复健计划][紫书]Chapter 7 暴力求解法

7.1 简单枚举 例7-1 Division uva725 输入正整数n&#xff0c;按从小到大的顺序输出所有形如abcde/fghij n的表达式&#xff0c;其中a&#xff5e;j恰好为数字0&#xff5e;9的一个排列&#xff08;可以有前导0&#xff09;&#xff0c;2≤n≤79。枚举fghij&#xff0c;验证a…

【测试工具篇一】全网最强保姆级教程抓包工具Fiddler(2)

本文接上篇Fiddler介绍&#xff0c;开始讲fiddler如何使用之前&#xff0c;给大家讲讲http以及web方面的小知识&#xff0c;方便大家后面更好得理解fiddler使用。 目录 一、软件体系结构---B/S与C/S架构 B/S架构 C/S架构 二、HTTP基础知识 什么是http请求和响应? http协…

如何基于pdf2image实现pdf批量转换为图片

最近为了将pdf报告解析成为文本和图片&#xff0c;需要将大量多页的pdf文件拆分下单独的一页一页的图像&#xff0c;以便后续进行OCR和图像处理&#xff0c;因此就需要实现将pdf2image&#xff0c;本文主要结合开源的pdf2image和poppler&#xff0c;实现了pdf转换为png格式图片…

【Linux】Linux下查看cpu信息指令(top/mpstat/iostat/pidstat)说明

top命令 top(1) - Linux manual page (man7.org) top查看总的CPU利用率 us: 用户空间消耗的CPU资源占比&#xff0c;进程在用户态执行函数调用&#xff0c;编解码消耗的都是us sy: 内核空间消耗的CPU资源占比&#xff0c;进程调用系统调用达到内核后会增加sy的消耗 ni&…

Java学习者的福音:SpringBoot教学辅助平台

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理教学辅助平台的相关信息成为必然。开发合适…

csrf令牌

csrf get请求 路由 // index.php Route::get(/, function () {// return view(welcome);return view(login); });Route::get(d3,function(Request $request){echo "输入的内容是" . "<font color>".$request -> input(mytext)."</fon…