前言:
最近在学习数据结构及算法,数据结构:列表,栈,队列,链表,字典,散列,集合,二叉树;算法:图和图算法,排序算法:冒泡、选择、插入、希尔、归并、快速,检索算法:顺序查找,二分查找;还有高级一点的动态规划和贪心算法,这些都会用js一一实现,算是记录下来,给自己以后复习用吧。
先上代码:列表
概念及定义:
列表是一组有序的数据,每个列表中数据被称为元素,元素的数量受内存控制。
不包括任何元素的列表称为空列表。
应用:
不需要很长序列查找元素或排序,元素不是很多。
js实现:
/**
* 一个简单的列表
* @constructor
*/
function List() {
this.dataSource = [];//初始化一个空数组来保存列表元素
this.listSize = 0; // 列表长度
this.pos = 0; // 当前位置
this.append = append; // 在列表的末尾添加元素
this.find = find; // 是否包含元素
this.getLength = getLength; // 获取列表的长度
this.remove = remove; // 从列表中删除当前元素
this.toString = toString; // 返回列表的字符串形式
this.insert = insert; //在当前位置元素的后面插入元素
this.clear = clear; // 清空列表
this.front = front; // 将列表的当前位置移动到第一个元素位置
this.end = end; // 将列表的当前位置移动到最后一个元素位置
this.getElement = getElement; // 返回当前位置的元素
this.prev = prev; // 将列表的当前位置向前移动一位
this.next = next; // 将列表的当前位置向后移动一位
this.currentPos = currentPos; // 返回列表的当前位置
this.moveTo = moveTo; // 将当前位置移动到指定位置
this.contains = contains; //是否包含该元素
this.loop = loop; // 列表的遍历器
}
/**
* 给列表最后添加元素的时候,列表元素个数+1
* @param element
*/
function append(element) {
this.listSize++;
this.dataSource.push(element);
}
/**
* @param element 如果传入的是对象,需要判断是否是对象以及两个对象是否相等
* @returns {number} 如果找到,返回位置,否则-1
*/
function find(element) {
for (var i = 0; i < this.dataSource.length; i++) {
if (this.dataSource[i] === element) {
return i;
}
}
return -1;
}
/**
* 返回列表元素的个数
* @returns {number}
*/
function getLength() {
return this.listSize;
}
/**
* 删除元素成功,元素个数-1
* @param element
* @returns {boolean}
*/
function remove(element) {
var removeIndex = this.find(element);
if (removeIndex !== -1) {
this.dataSource.splice(removeIndex, 1);
this.listSize--;
return true;
}
return false;
}
/**
* 返回要展示的列表
* @returns {string}
*/
function toString() {
return this.dataSource.toString();
}
/**
* 插入某个元素
* @param element 要插入的元素
* @param afterElement 列表中的元素之后
* @returns {boolean}
*/
function insert(element, afterElement) {
var insertIndex = this.find(afterElement);
if (insertIndex !== -1) {
this.dataSource.splice(insertIndex + 1, 0, element);
this.listSize++;
return true;
}
return false;
}
/**
* 清空列表中的所有元素
*/
function clear() {
delete this.dataSource;
this.dataSource = [];
this.listSize = this.pos = 0;
}
/**
* 将列表的当前位置移动到第一个元素
*/
function front() {
this.pos = 0;
}
/**
* 将列表的当前位置移动到最后一个元素
*/
function end() {
this.pos = this.listSize - 1;
}
/**
* 返回当前位置的元素
* @returns {*}
*/
function getElement() {
return this.dataSource[this.pos];
}
/**
* 将当前位置向前移动一位
*/
function prev() {
--this.pos;
}
/**
* 将当前位置向后移动一位
*/
function next() {
++this.pos;
}
/**
* 返回列表的当前位置
* @returns {number|*}
*/
function currentPos() {
return this.pos;
}
/**
* 移动到指定位置
* @param position
*/
function moveTo(position) {
this.pos = position;
}
/**
* 是否包含某个元素
* @param element
* @returns {boolean}
*/
function contains(element) {
if(!this.listSize) return false
var index = this.dataSource.indexOf(element)
return index
}
/**
* 迭代器:遍历出所有的元素及其位置
* @param function(index, data)
*/
function loop (cb) {
for(this.front();this.currentPos()<this.getLength();this.next()){
var loopItem = this.getElement();
var index = this.currentPos();
(function(index, loopItem){
cb(index, loopItem);
})(index, loopItem)
}
}
var name = new List()
// console.log(name);
name.append('小黑')
name.append('小白')
name.append('小红')
name.append('小紫')
console.log(name.getElement())
name.next()
console.log(name.getElement())
name.loop(function (index, looItem) {
console.log(index,looItem)
})
console.log(name.contains('小lan'))
复制代码