目录
一、数组(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(",");} }
运行结果: