前言:

  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;
}

javascript数据结构与算法——列表的更多相关文章

  1. javascript数据结构与算法---列表

    javascript数据结构与算法---列表 前言:在日常生活中,人们经常要使用列表,比如我们有时候要去购物时,为了购物时东西要买全,我们可以在去之前,列下要买的东西,这就要用的列表了,或者我们小时候 ...

  2. JavaScript数据结构与算法-列表练习

    实现列表类 // 列表类 function List () { this.listSize = 0; // 列表的元素个数 this.pos = 0; // 列表的当前位置 this.dataStor ...

  3. 为什么我要放弃javaScript数据结构与算法(第七章)—— 字典和散列表

    本章学习使用字典和散列表来存储唯一值(不重复的值)的数据结构. 集合.字典和散列表可以存储不重复的值.在集合中,我们感兴趣的是每个值本身,并把它作为主要元素.而字典和散列表中都是用 [键,值]的形式来 ...

  4. javascript数据结构与算法--高级排序算法

    javascript数据结构与算法--高级排序算法 高级排序算法是处理大型数据集的最高效排序算法,它是处理的数据集可以达到上百万个元素,而不仅仅是几百个或者几千个.现在我们来学习下2种高级排序算法-- ...

  5. javascript数据结构与算法-- 二叉树

    javascript数据结构与算法-- 二叉树 树是计算机科学中经常用到的一种数据结构.树是一种非线性的数据结构,以分成的方式存储数据,树被用来存储具有层级关系的数据,比如文件系统的文件,树还被用来存 ...

  6. javascript数据结构与算法--散列

    一:javascript数据结构与算法--散列  一:什么是哈希表? 哈希表也叫散列表,是根据关键码值(key,value)而直接进行访问的数据结构,它是通过键码值映射到表中一个位置来访问记录的,散列 ...

  7. javascript数据结构与算法---队列

    javascript数据结构与算法---队列 队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素.队列用于存储按顺序排列的数据,先进先出,这点和栈不一样(后入先出).在栈中,最后入栈的元素 ...

  8. javascript数据结构与算法---栈

    javascript数据结构与算法---栈 在上一遍博客介绍了下列表,列表是最简单的一种结构,但是如果要处理一些比较复杂的结构,列表显得太简陋了,所以我们需要某种和列表类似但是更复杂的数据结构---栈 ...

  9. javascript数据结构与算法---检索算法(顺序查找、最大最小值、自组织查询)

    javascript数据结构与算法---检索算法(顺序查找.最大最小值.自组织查询) 一.顺序查找法 /* * 顺序查找法 * * 顺序查找法只要从列表的第一个元素开始循环,然后逐个与要查找的数据进行 ...

随机推荐

  1. 【C/C++开发】C++11的模板类型判断——std::is_same和std::decay

    C++11的模板类型判断--std::is_same和std::decay 问题提出:有一个模板函数,函数在处理int型和double型时需要进行特殊的处理,那么怎么在编译期知道传入的参数的数据类型是 ...

  2. sync 简单实现 父子组件的双向绑定

    这里主要是对vue文档中的sync进行一个再解释: 如果自己尝试的话,最好在已经使用emit 和prop实现了双向绑定的组件中尝试,以免出现不必要的错误: <!DOCTYPE html> ...

  3. Vue项目引入百度地图

    先去百度开放平台申请ak.http://lbsyun.baidu.com/ 进来之后 按照步骤走,先登录百度账号,然后申请成为开发者,然后申请ak密钥 填写完毕后提交,会给你邮箱发个激活邮件 点击申请 ...

  4. [转帖]技术人眼中的Facebook Libra

    技术人眼中的Facebook Libra https://www.jianshu.com/p/ddc733077749 比特币 以太坊 EOS Libra 0.8352019.07.01 14:15: ...

  5. [Linux] 在 Ubuntu 19.10 上开启 SSH 服务并允许远程登录

    在 Ubuntu 19.10 上安装 SSH,并开启服务 0.检查并确认系统当前是否已安装SSH: sudo ps -e | grep ssh 如果只有 ssh-agent 说明 ssh-server ...

  6. 彻底理解Runnable和Thread的区别

    昨天去面试,面试官问了一个问题:Runnable和Thread有什么区别,因为针对这个问题以前有背过,并且网上大多数都是这些结论,所以脱口而出: 1.Thread有单继承的问题: 2.Runnable ...

  7. 手撕面试官系列(三):微服务架构Dubbo+Spring Boot+Spring Cloud

    文章首发于今日头条:https://www.toutiao.com/i6712696637623370248/ 直接进入主题 Dubbo (答案领取方式见侧边栏) Dubbo 中 中 zookeepe ...

  8. QT 学习基础问题记录

    1. connect 函数 需要先创建发送者和接收者实例,并且信号函数和槽函数如果有参数,需要在 connect 函数使用时指定相关参数类型. 2.窗口控件设置 设置窗口的最大化.最小化.问号提示等控 ...

  9. 0-python变量及基本数据类型

    目录 1.变量2.字符串3.布尔类型4.整数5.浮点数6.日期 1.变量 1.1.变量的定义 - 类似于标签 1.2.变量的命名规则 - (强制)变量名只能包含数字.字母.下划线 - (强制)不能以数 ...

  10. python+selenium实现自动化百度搜索关键词

    通过python配合爬虫接口利用selenium实现自动化打开chrome浏览器,进行百度关键词搜索. 1.安装python3,访问官网选择对应的版本安装即可,最新版为3.7. 2.安装seleniu ...