列表是一组有序的数据,每个数组中的数据项称为元素。数组相关知识不够了解的伙伴可以阅读本人上篇博客在JavaScript中,列表的元素可以是任意数据类型。列表中可以保存不定数量的元素,实际使用时元素的数量受到程序内存的限制。
本文将介绍如何创建一个简单的列表类,将根据给出的列表抽象数据类型定义,实现该抽象数据类型,在列表详解(下)中,将分析几个适合解决的实际问题。
1、列表的抽象数据类型定义
listSize(属性) | 列表的元素个数 |
pos(属性) | 列表当前位置 |
length(属性) | 返回列表中元素的个数 |
clear(方法) | 清空列表中所有的元素 |
toString(方法) | 返回列表的字符串形式 |
getElement(方法) | 返回当前位置的元素 |
insert(方法) | 在现有元素后插入新元素 |
append(方法) | 在列表的末尾添加新元素 |
remove(方法) | 从列表中删除元素 |
front(方法) | 将列表的当前位置移动到第一个元素 |
end(方法) | 将列表的当前位置移动到最后一个元素 |
prev(方法) | 将当前位置后移一位 |
next(方法) | 将当前位置前移一位 |
hasNext(方法) | 判断是否存在后一位 |
hasPrev(方法) | 判断是否存在前一位 |
currPos(方法) | 返回列表的当前位置 |
moveTo(方法) | 将当前位置移动到指定的位置 |
2、实现列表类
根据上边定义的列表抽象数据类型,可以直接实现一个List类。首先我们实现一个构造函数,并声明属性、方法。
function List() { this.listSize = 0 this.pos = 0 this.dataStore = [] // 初始化一个用于保存列表元素的空数组 this.clear = clear this.find = find this.toString = toString this.insert = insert this.append = append this.remove = remove this.front = front this.end = end this.prev = prev this.next = next this.hasNext = hasNext this.hasPrev = hasPrev this.length = length this.currPos = currPos this.moveTo = moveTo this.getElement = getElement this.contains = contains }
2.1 实现append(),给列表添加元素
function append(element) { console.log(this) this.dataStore[this.listSize++] = element }
当调用此方法添加元素时,变量listSize加1。
2.2、实现find(),查找列表中的元素
function find(element) { for (var i = 0; i < this.dataStore.length; i++) { if (this.dataStore[i] == element) { return i } } return -1 }
如果找到指定元素则返回该元素的索引,如果没找到,则返回-1
2.3、实现remove(),从列表中删除元素
实现原理:借助2.1中实现的find(),查找如需要删除的元素的索引,找到后借助数组方法splice(),删除指定的元素。
function remove(element) { var foundAt = this.find(element) if (foundAt > -1) { this.dataStore.splice(foundAt, 1) this.listSize-- return true } return false }
2.4、实现length(),统计列表中的元素
function length() { return this.listSize }
2.5、实现toString(),显示列表中的元素
function toString() { return this.dataStore.toString() }
2.6、实现insert(),向列表插入一个元素
function insert(element, after) { var insertPos = this.find(after) if (insertPos > -1) { this.dataStore.splice(insertPos + 1, 0, element) this.liseSize++ return true } return false }
2.7、实现clear(),实现清空列表元素
function clear() { delete this.dataStore this.dataStore.length = 0 this.listSize = 0 this.pos = 0 }
2.8、实现contains(),判断给定值是否包含于列表中
function contains(element) { for (var i = 0; i < this.dataStore.length; i++) { return true } return false }
2.9、实现遍历列表的各个方法
function front() { this.pos = 0 } function end() { this.pos = this.listSize - 1 } function prev() { this.pos-- } function next() { if (this.pos < this.listSize) { this.pos++ } } function currPos() { return this.pos } function moveTo(position) { this.pos = position } function hasNext() { return this.pos < this.listSize } function hasPrev() { return this.pos >= 0 } function getElement() { return this.dataStore[this.pos] }
测试:
在控制台新建一个List对象,往列表添加元素
开始测试:
3、使用迭代器访问列表
(1)从前到后遍历列表
扫描二维码关注公众号,回复:
121260 查看本文章
var tList = new List() tList.append('哈哈1') tList.append('哈哈2') tList.append('哈哈3') tList.append('哈哈4') tList.append('哈哈5') for (tList.front(); tList.hasNext(); tList.next()) { console.log(tList.getElement()) }
结果:
(2)从后到前遍历列表
var tList = new List() tList.append('哈哈1') tList.append('哈哈2') tList.append('哈哈3') tList.append('哈哈4') tList.append('哈哈5') for (tList.end(); tList.hasPrev(); tList.prev()) { console.log(tList.getElement()) }
结果:
JavaScript数据结构与算法——列表详解(上)完结
有错误欢迎指出,谢谢。下篇将分析一下列表适合解决的实际问题。
晚安~~