javascript数据结构与算法——列表
2024-10-20 18:58:10
前言:
1. 数据的存储结构顺序不重要,也不必对数据进行查找,列表就是一种很好的数据存储结构;
2.此列表采用仿原生数组的原型链上的方法来写,具体可以参考MDN数组介绍,并么有用prototype来构造。
3. 使用迭代器,可以不必关心数据的存储方式,以实现对列表的遍历。在下面的front()、end()、prev()、next()和currPos()就实现了实例类的一个迭代器,具有以下优点:
a. 访问列表时不必关心底层的数据存储结构;
b. 可以用不同的类型的数据存储方式来是实现实例类,迭代器为访问列表里的元素提供了一种统一的方式。
<一> 列表的抽象数据类型定义
1. 列表是一组有序的数据。每个列表中的数据项称为元素。在javascript中,列表中的元素可以是任意的数据类型。列表中的可以保存多少元素并么有限制,实际使用时元素的数量受到内存的限制。
2. 列表对应的属性和方法
listSize(属性) | 列表中元素的个数 |
pos(属性) | 列表的当前位置 |
length(属性) | 返回列表中元素的个数 |
clear(方法) | 清空列表中所有的元素 |
toString(方法) | 返回列表的字符串形式 |
getElement(方法) | 返回当前位置的元素 |
insert(方法) | 在现有元素后插入新元素 |
append(方法) | 在列表的末尾添加新元素 |
remove(方法) | 在列表中删除元素 |
front(方法) | 将列表的当前位置移动到第一个元素位置 |
end(方法) | 将列表的当前位置移动到最后一个元素位置 |
prev(方法) | 将当前位置后移一位 |
next(方法) | 将当前位置前移一位 |
hasNext(方法) | 判断是否还有下一位 |
hasPrev(方法) | 判断是否还有上一位 |
currPos(方法) | 返回列表的当前位置 |
moveTo(方法) | 将当前位置移动到指定位置 |
3. 模拟列表来构造函数以及对应迭代器
/*
* 列表完整抽象数据类型定义
* */
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;
} function append(element) {
this.dataStore[this.listSize++] = element;
}
function find(element) {
for(var i = 0; i < this.dataStore.length; i++){
if(this.dataStore[i] === element){
return i;
}
}
return -1;
}
function remove(element) {
var foundAt = this.find(element);
if(foundAt > -1){
this.dataStore.splice(foundAt,-1);
--this.listSize;
return true
}
return false;
}
function length() {
return this.listSize;
}
function toString() {
// 该方法返回的是一个数组,而不是一个字符串,但列表的含义是为了显示列表的当前状态,所以返回数组比较合理
return this.dataStore;
}
function insert(element, after) {
var insertPos = this.find(after);
if(insertPos > -1){
this.dataStore.splice(insertPos,0,after);
++this.listSize;
return true
}
return false;
}
function clear() {
delete this.dataStore;
this.listSize = this.pos = 0;
this.dataStore.length = 0;
}
// 判断一个元素是否在列表中
function contains(element) {
for(var i = 0; i < this.dataStore.length; i++){
if(this.dataStore[i] === element){
return true
}
return false;
}
}
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 getElement() {
return this.dataStore[this.pos];
}
function hasNext() {
return this.pos < this.listSize;
}
function hasPrev() {
return this.pos >= 0;
}
最新文章
- ASP .NET MVC 之Entity Framework入门教程及源码
- 使用pyInstaller发布PathMerge的exe版本(py转换成exe)
- js 获取鼠标选中值
- java使用jsch连接linux
- linux shell执行中需要交互输入回车,Yes/NO Y/N
- Java数组的复制Arrays.copyOf()、System.arraycopy()、nums.clone()
- Android 学习笔记之Volley(八)实现网络图片的数据加载
- oracle数据库登录连接很慢;kettle连接oracle 报 IO 错误,socket time out 问题解决记录
- IDS 源镜像端口添加
- Linux系统编程-----进程fork()
- vue-cli ——解决多次复用含有Echarts图表组件的问题
- 根据设备width(375)动态设置font-size
- 小白的CTF学习之路7——内存与硬盘
- Mysql5.5安装
- Python_内置函数2_44
- 学习C++,应该循序渐进的看哪些书?
- Camstar :新加的modeling对象没有在 modeling的下拉框中显示
- hdu3374解题报告
- 新手小白Linux(Centos6.5)部署java web项目(mysql5.7安装及相关操作)
- Java8 改进的匿名内部类:
热门文章
- 【视频开发】opencv不能读取MP4格式文件
- idea springboot启动报SLF4J:Failed to load class “org.slf4j.impl.StaticLoggerBinder”
- 【转帖】为什么有了Compose和Swarm,还会有Kubernetes的出现?
- 简单工厂(SimpleFactory)模式
- Python学习之路:列表(List)的append()、extend()与insert()方法
- collections模块之defaultdict()与namedtuple()方法简单介绍
- hadoop功能与用途
- 表单提交学习笔记(一)—利用jquery.form提交表单(后台.net MVC)
- C# 的ToString 常用方法
- P1018 乘积最大(DP)