算法学习
顺序表
数据结构
顺序表就是我们常用的数组
Array
代码展示
链表
链表结构及方法成员
在实现这些方法之前,先来看看它们的职责。
append(element):向列表尾部添加一个新的项。
insert(position, element):向列表的特定位置插入一个新的项。
remove(element):从列表中移除一项。
indexOf(element):返回元素在列表中的索引。如果列表中没有该元素则返回-1。
removeAt(position):从列表的特定位置移除一项。
isEmpty():如果链表中不包含任何元素,返回true,如果链表长度大于0则返回false。
size():返回链表包含的元素个数。与数组的length属性类似。
toString():由于列表项使用了Node类,就需要重写继承自JavaScript对象默认的
toString方法,让其只输出元素的值。
代码展示
function LinkedList() {
let Node = function(element){
this.element = element;
this.next = null;
};
let length = 0;
let head = null;
this.append = function(element){};
this.insert = function(position, element){};
this.removeAt = function(position){};
this.remove = function(element){};
this.indexOf = function(element){};
this.isEmpty = function() {};
this.size = function() {};
this.getHead = function(){};
this.toString = function(){};
this.print = function(){};
}
实现
队列
我们需要创建自己的类来表示一个队列。先从最基本的声明类开始:
function Queue() {
//这里是属性和方法
}
首先需要一个用于存储队列中元素的数据结构。我们可以使用数组,就像在上一章Stack类
中那样使用(你会发现Queue类和Stack类非常类似,只是添加和移除元素的原则不同):
let items = [];
接下来需要声明一些队列可用的方法。
enqueue(element(s)):向队列尾部添加一个(或多个)新的项。
dequeue():移除队列的第一(即排在队列最前面的)项,并返回被移除的元素。
front():返回队列中第一个元素——最先被添加,也将是最先被移除的元素。队列不
做任何变动(不移除元素,只返回元素信息——与Stack类的peek方法非常类似)。
isEmpty():如果队列中不包含任何元素,返回true,否则返回false。
size():返回队列包含的元素个数,与数组的length属性类似。
数据结构
代码展示
栈
我们将创建一个类来表示栈。让我们从基础开始,先声明这个类:
function Stack() {
//各种属性和方法的声明
}
首先,我们需要一种数据结构来保存栈里的元素。可以选择数组:
let items = [];
接下来,要为我们的栈声明一些方法。
push(element(s)):添加一个(或几个)新元素到栈顶。
pop():移除栈顶的元素,同时返回被移除的元素。
peek():返回栈顶的元素,不对栈做任何修改(这个方法不会移除栈顶的元素,仅仅返
回它)。
isEmpty():如果栈里没有任何元素就返回true,否则返回false。
clear():移除栈里的所有元素。
size():返回栈里的元素个数。这个方法和数组的length属性很类似。
代码展示
let Stack = (function () {
const items = new WeakMap();
class Stack {
constructor () {
items.set(this, []);
}
//其他方法
push(element){
let s = items.get(this); //{3}
s.push(element);
};
pop(){
let s = items.get(this);
let r = s.pop();
return r;
};
peek(){
return items[items.length-1];
};
isEmpty(){
return items.length == 0;
};
size(){
return items.length;
};
clear(){
items.set(this, []);
};
print(){
console.log(items.toString());
};
}
return Stack;
})();
字典
这是我们的Dictionary类的骨架:
function Dictionary() {
var items = {};
}
与Set类类似,我们将在一个Object的实例而不是数组中存储元素。
然后,我们需要声明一些映射/字典所能使用的方法。
set(key,value):向字典中添加新元素。
delete(key):通过使用键值来从字典中移除键值对应的数据值。
has(key):如果某个键值存在于这个字典中,则返回true,反之则返回false。
get(key):通过键值查找特定的数值并返回。
clear():将这个字典中的所有元素全部删除。
size():返回字典所包含元素的数量。与数组的length属性类似。
keys():将字典所包含的所有键名以数组形式返回。
values():将字典所包含的所有数值以数组形式返回。
散列表
我们将使用数组来表示我们的数据结构,该数据结构和上一章中的图表所用的非常相似。
和之前一样,我们从搭建类的骨架开始:
function HashTable() {
var table = [];
}
然后,给类添加一些方法。我们给每个类实现三个基本方法。
put(key,value):向散列表增加一个新的项(也能更新散列表)。
remove(key):根据键值从散列表中移除值。
get(key):返回根据键值检索到的特定的值。
在实现这三个方法之前,要实现的第一个方法是散列函数,它是HashTable类中的一个私有
方法:
var loseloseHashCode = function (key) {
var hash = 0; //{1}
for (var i = 0; i < key.length; i++) { //{2}
hash += key.charCodeAt(i); //{3}
}
return hash % 37; //{4}
};
更好的散列函数
var djb2HashCode = function (key) {
var hash = 5381;
for (var i = 0; i < key.length; i++) {
hash = hash * 33 + key.charCodeAt(i);
}
return hash % 1013;
};
单调队列
数据结构
代码展示
单调栈
数据结构
代码展示
树与二叉树
数据结构
代码展示