Js中常见的数据结构(Data Structure)
创始人
2024-04-01 18:37:10
0

目录

一、数组(Array)

1. 数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。

2.连续的内存空间和相同类型的数据(随机访问的前提)。

3.优点:两限制使得具有随机访问的特性缺点:删除,插入数据效率低。

4.对内存空间要求高,需要一块连续的内存空间。

二、集合的方法(Set)

1.add():向集合中添加元素

2.remove():从集合中移除某个元素

3.has():判断集合中是否存在某个元素

4.clear():删除列表中的所有元素

5.size():返回集合中元素的个数

6.values():返回集合中的所有元素

7.union():返回两个集合的并集

8.insertSection():返回两个集合的交集

9.difference():返回两个集合的差集

10.isSubSet():判断一个集合是否为另一个集合的子集

三、冒泡算法

四、队列(Queue)

1.enqueue():添加

2.dequequ():删除

3.front():返回第一个元素

4.isEmpty():是否为空

5.size():获取元素个数

6.toString():转字符串

五、优先级对列(PriorityQueue)

六、链表(Linked List)

1.append():增加新节点

2.insert():向任意位置插入数据

3.get():获取元素

4.indexOf():返回元素所在下标,不存在就返回-1

5.updata():修改元素的值

6.removeAt():删除元素   通过  下标

7.remove():通过元素 

8.isEmpty():是否为空

9.size():获取元素个数

10.toString():转字符串

七、双向链表(DoublyLinked List)

1.append():增加新节点

2.insert():向任意位置插入数据

3.get():获取元素

4.indexOf():返回元素所在下标,不存在就返回-1

5.updata():修改元素的值

6.removeAt():删除元素   通过  下标

7.remove():通过元素 

8.isEmpty():是否为空

9.size():获取元素个数

10.toString():转字符串

11.forwardString():正向遍历

12.backwardString():反向遍历

八、栈(Stack)

1.push():入栈

2.pop():出栈

3.peek():返回栈顶元素

4.isEmpty():是否为空

5.size():返回栈的元素个数

6.toString():将栈元素以字符串形式返回


一、数组(Array)

1. 数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。

2.连续的内存空间和相同类型的数据(随机访问的前提)。

3.优点:两限制使得具有随机访问的特性缺点:删除,插入数据效率低。

4.对内存空间要求高,需要一块连续的内存空间。

二、集合的方法(Set)

1.add():向集合中添加元素

        add(value){if(this.has(value))  return  false;this.items[value] = value;return  true;}

2.remove():从集合中移除某个元素

      remove(value){if(!this.has(value))   return  false;delete  this.items[value];return  true;}

3.has():判断集合中是否存在某个元素

has(value){return  this.items.hasOwnProperty(value);// return  this.items.value == null;}

4.clear():删除列表中的所有元素

     clear(){this.items = {};}

5.size():返回集合中元素的个数

    size(){return  Object.keys(this.items).length;}

6.values():返回集合中的所有元素

       values(){return  Object.values(this.items);}

7.union():返回两个集合的并集

     // 并集union(other){//    this   other let  arr = this.values(this).concat(other.values());let  newMS = new MySet();arr.forEach(value => {newMS.add(value);})return  newMS;}

8.insertSection():返回两个集合的交集

    // 交集insertSection(other){// this  other// 从this中拿到每一个元素判断other中是否包含let  newMS = new  MySet();let  arr = this.values();arr.forEach(value => {if(other.has(value)){newMS.add(value);}})return  newMS;}

9.difference():返回两个集合的差集

     // 差集difference(other){// this   otherlet  newMS = new  MySet();let  arr = this.values();arr.forEach(value => {if(!other.has(value)){newMS.add(value);}})return  newMS;}

10.isSubSet():判断一个集合是否为另一个集合的子集

  // 子集isSubSet(other){// this是否是other的子集let  arr = this.values();let  is = true;arr.forEach(value => {if(!other.has(value)){is =  false;}})return  is;}}

完整代码:

class  MySet{constructor(){// 属性this.items = {};}// 方法add(value){if(this.has(value))  return  false;this.items[value] = value;return  true;}remove(value){if(!this.has(value))   return  false;delete  this.items[value];return  true;}has(value){return  this.items.hasOwnProperty(value);// return  this.items.value == null;}clear(){this.items = {};}size(){return  Object.keys(this.items).length;}values(){return  Object.values(this.items);}// 并集union(other){//    this   other let  arr = this.values(this).concat(other.values());let  newMS = new MySet();arr.forEach(value => {newMS.add(value);})return  newMS;}// 交集insertSection(other){// this  other// 从this中拿到每一个元素判断other中是否包含let  newMS = new  MySet();let  arr = this.values();arr.forEach(value => {if(other.has(value)){newMS.add(value);}})return  newMS;}// 差集difference(other){// this   otherlet  newMS = new  MySet();let  arr = this.values();arr.forEach(value => {if(!other.has(value)){newMS.add(value);}})return  newMS;}// 子集isSubSet(other){// this是否是other的子集let  arr = this.values();let  is = true;arr.forEach(value => {if(!other.has(value)){is =  false;}})return  is;}}let  ms1 = new  MySet();ms1.add(1);ms1.add(2);ms1.add(3);let  ms2 = new  MySet();ms2.add(4);ms2.add(1);ms2.add(2);ms2.add(3);let  ms3 = ms1.union(ms2);console.log(ms3);let  ms4 = ms1.insertSection(ms2);console.log(ms4);let  ms5 = ms1.difference(ms2);console.log(ms5);// console.log(ms2.has(1));console.log(ms1.isSubSet(ms2));

运行结果:

三、冒泡算法

完整代码:

 class  ArrayList{constructor(array){if(!array)  array = [];this.items = array;}// 1. 冒泡bubbleSort(){for(let i=0;i this.items[j+1]){// let  temp = this.items[j];// this.items[j] = this.items[j+1];// this.items[j+1] = temp;// ES6方法[this.items[j],this.items[j+1]] = [this.items[j+1],this.items[j]]}}}}}let  arr =  [-9,10,0,54,-13,-7,56,81,-5];let  list1 = new  ArrayList(arr);// 冒泡list1.bubbleSort();console.log(list1);

运行结果:

四、队列(Queue)

1.enqueue():添加

2.dequequ():删除

3.front():返回第一个元素

4.isEmpty():是否为空

5.size():获取元素个数

6.toString():转字符串

完整代码:

html文件代码:

    let  q = new  Queue();q.enqueue("leo");q.enqueue("lee");q.enqueue("marry");q.enqueue("bob");q.dequeue();console.log(q.toString());

js文件代码:

// 数据结构:队列class  Queue{constructor(array = []){// if(!array) array = [];this._items = array;}// 添加enqueue(item){this._items.push(item);}// 删除dequeue(){return  this._items.shift();}// 返回第一个元素front(){return  this._items[0];}// 是否为空isEmpty(){return  this._items.length === 0;}// 获取元素个数size(){return  this._items.length;}// 转字符串toString(){return  this._items.join(",");}
}

运行结果:

五、优先级对列(PriorityQueue)

完整代码:

html文件代码:

    let  pq = new  PriorityQueue();pq.enqueue("leo",1);pq.enqueue("lee",0);console.log(pq);

js文件代码:

// 数据结构:优先级队列// 辅助类
class  PriorityItem{constructor(item,priority){this.item = item;this.priority = priority;}
}class  PriorityQueue{constructor(array = []){this._items = array;}// 添加// priority  值越小代表优先级越高enqueue(item,priority = 9){let  pi = new  PriorityItem(item,priority);if(this._items.length == 0){this._items.push(pi);}else{let  is = false;for(let  i=0;i this._items[i].priority){//不用插入continue ;}else{this._items.splice(i,0,pi);is = true;break;}}if(!is){// pi的优先级比队列中所有的优先级都要低this._items.push(pi);}                                                                                                                                                                                                                    }}
}

运行结果:

六、链表(Linked List)

1.append():增加新节点

2.insert():向任意位置插入数据

3.get():获取元素

4.indexOf():返回元素所在下标,不存在就返回-1

5.updata():修改元素的值

6.removeAt():删除元素   通过  下标

7.remove():通过元素 

8.isEmpty():是否为空

9.size():获取元素个数

10.toString():转字符串

完整代码:

html文件代码:

  let  l = new LinkedList();l.append("leo");l.insert(0,"bob");l.insert(1,"marry");l.append("lee");console.log(l);console.log(l.get(1),l.indexOf("leo"));l.removeAt(2);console.log(l.toString());

js文件代码:

// 数据结构:链表// 节点类
class  Node{constructor(data){this.data = data;this.next = null;    //找到下一个数据}
}
class LinkedList{constructor(){this.head = null;    //头部指针指向第一个数据this.length = 0;}// 增加新节点append(data){// 创建节点对象let  newnode = new Node(data);if(this.length == 0){// 链表是空的this.head = newnode;}else{let  current = this.head;while(current.next != null){current = current.next;}// 当循环走完后,current代表链表中最后一个节点current.next = newnode;}this.length += 1;}// 向任意位置插入数据insert(position,data){// 越界处理if(position < 0 || position > this.length)return  false;let  newnode = new Node(data);if(position == 0){// 新节点的next指向原来的第一个节点newnode.next = this.head;// this.head指向新节点this.head = newnode;}else{// 当前节点let  current = this.head;// 上一个节点let  previous = null;let  index = 0;while(index < position){previous = current;current = current.next;index ++;}// 新节点指向currentnewnode.next = current;// previous指向新节点previous.next = newnode;}this.length += 1;return  true;}// 获取元素get(position){// 越界处理if(position < 0 || position >= this.length)return  false;let  current = this.head;let  index = 0;while(index < position){current = current.next;index ++;}return  current.data;}// 返回元素所在下标,不存在就返回-1indexOf(data){let  current = this.head;let  index = -1;let  count = 0;    //代表每一个元素的下标while(current != null){if(current.data === data){index = count;break;}count ++;current = current.next;}return  index;}// 修改元素的值updata(position,data){// 越界处理if(position < 0 || position >= this.length)return  false;let  current = this.head;let  index = 0;while(index < position){current = current.next;index ++;}current.data = data;return  true;}// 删除元素   通过  下标removeAt(position){// 越界处理if(position < 0 || position >= this.length)return  false;if(position == 0){this.head = this.head.next;}else{let  current = this.head;let  index = 0;while(index < position -1){current = current.next;index ++;}current.next = current.next.next;}this.length -= 1;return  true;}// 通过元素remove(data){let  position = this.indexOf(data);if(position == -1){return false;}else{return  this.removeAt(position);}}// 是否为空isEmpty(){return  this.head === null;}// 元素的个数size(){return  this.length;}// 转字符串toString(){let  current = this.head;let  str = "";while(current != null){str += current.data + ",";current = current.next;}return  str;}}

运行结果:

七、双向链表(DoublyLinked List)

1.append():增加新节点

2.insert():向任意位置插入数据

3.get():获取元素

4.indexOf():返回元素所在下标,不存在就返回-1

5.updata():修改元素的值

6.removeAt():删除元素   通过  下标

7.remove():通过元素 

8.isEmpty():是否为空

9.size():获取元素个数

10.toString():转字符串

11.forwardString():正向遍历

12.backwardString():反向遍历

完整代码:

html文件代码:

 let  dl = new DoublyLinkedList();dl.append("虞姬");dl.append("狄仁杰");dl.append("鲁班");dl.insert(0,"杨玉环");dl.insert(2,"安琪拉");console.log(dl.get(2));console.log(dl.update(2,"李白"));dl.removeAt(0);console.log(dl);console.log(dl.forwardString());console.log(dl.backwardString());

js文件代码:

// 数据结构:双向链表class  Node{constructor(data){this.prev = null;this.data = data;this.next = null;}
}
class  DoublyLinkedList{constructor(){this.head = null;this.tail = null;this.length = 0;}// 添加append(data) {let  newnode = new Node(data);if(this.length == 0){this.head = newnode;this.tail = newnode;}else{// 最后一个节点指向新节点this.tail.next = newnode;// 新节点的prev指向原来最后一个节点newnode.prev = this.tail;// tail指向最后一个节点(新节点)this.tail = newnode;}this.length += 1;}// 插入insert(position,data){if(position < 0 ||  position > this.length)  return  false;// 插入操作let  newnode = new  Node(data);if(this.length == 0 || position == this.length){// 列表是空的 或者   插入最后一个位置  相当于append的操作this.append(data);return  true;}else{if(position == 0){this.head.prev = newnode;newnode.next = this.head;this.head = newnode;}else{let  current = this.head;let  index = 0;while(index < position){current = current.next;index ++;}current.prev.next = newnode;newnode.prev = current.prev;newnode.next = current;current.prev = newnode;}this.length += 1;return  true;}}// 获取元素,内部使用_getNode(position){// 越界处理if(position < 0 || position >= this.length)  return null;let  current = this.head;let  index = 0;while(index < position){current = current.next;index ++;}return  current;}// 获取元素get(position){return  this._getNode(position).data;}// 获取下标indexOf(data){let  current = this.head;let  index = 0;while(current){if(current.data == data){return  index;}current  = current.next;index  ++;}return  -1;}// 修改元素update(position,data){let  node = this._getNode(position);if(!node)  return  false;node.data = data;return  true;}// 删除removeAt(position){// 需要删除的节点let  node = this._getNode(position);if(!node)  return  false;if(this.length == 1){this.head = null;this.tail = null;}else{if(position == this.length -1){// 最后一个this.tail = node.prev;this.tail.next = null;}else if(position == 0){// 第一个this.head = this.head.next;this.head.prev = null;}else{node.prev.next = node.next;node.next.prev = node.prev;}}this.length -= 1;return  true;}remove(data){return  this.removeAt(this.indexOf(data));}isEmpty(){return  this.length == 0;}size(){return  this.length;}toString(){return  this.forwardString();}// 正向遍历forwardString(){let  current = this.head;let  str = "";while(current){str += current.data + ",";current = current.next;}return  str;}// 反向遍历backwardString(){let  current = this.tail;let  str = "";while(current){str += current.data + ",";current = current.prev;}return  str;}}

运行结果:

八、栈(Stack)

1.push():入栈

2.pop():出栈

3.peek():返回栈顶元素

4.isEmpty():是否为空

5.size():返回栈的元素个数

6.toString():将栈元素以字符串形式返回

完整代码:

html文件代码:

 // 十进制转二进制let  stack = new  Stack();// let  str = "";function  ten2two(n){if(n < 1){// let str = stack.toString();return ;}n = parseInt(n);stack.push(n % 2);// 递归ten2two(n/2)}ten2two(21)console.log(stack.toString());

js文件代码:

// 数据结构:栈
class  Stack{constructor(array){if(!array) array = [];this._items = array;}// 入栈push(item){this._items.push(item);}// 出栈pop(){return  this._items.pop();}// 返回栈顶元素peek(){return  this._items[this._items.length-1];}// 是否为空isEmpty(){return  this._items.length === 0;}// 返回栈的元素个数size(){return  this._items.length;}// 将栈元素以字符串形式返回toString(){// let  str = "";let  arr = this._items.reverse();return  arr.join(",");}
}

运行结果:

相关内容

热门资讯

银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...