JavaScript数据结构与算法——列表详解(上)
列表是一组有序的数据,每个数组中的数据项称为元素。数组相关知识不够了解的伙伴可以阅读本人上篇博客在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 = 0this.pos = 0this.dataStore = [] // 初始化一个用于保存列表元素的空数组this.clear = clearthis.find = findthis.toString = toStringthis.insert = insertthis.append = appendthis.remove = removethis.front = frontthis.end = endthis.prev = prevthis.next = nextthis.hasNext = hasNextthis.hasPrev = hasPrevthis.length = lengththis.currPos = currPosthis.moveTo = moveTothis.getElement = getElementthis.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.dataStorethis.dataStore.length = 0this.listSize = 0this.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)从前到后遍历列表
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数据结构与算法——列表详解(上)完结
有错误欢迎指出,谢谢。下篇将分析一下列表适合解决的实际问题。
晚安~~
JavaScript数据结构与算法——列表详解(上)相关推荐
- JavaScript数据结构与算法——列表详解(下),基于Nodejs实现一个列表应用
1.上篇回顾: 上篇我们实现了一个列表类,并添加了一些属性,实现了比较多的方法,本文章将与大家一起使用列表实现一个图书借阅查询系统.需要使用JavaScript数据结构与算法--列表详解(上)中写好的 ...
- JavaScript数据结构与算法——链表详解(上)
注:与之前JavaScript数据结构与算法系列博客不同的是,从这篇开始,此系列博客采用es6语法编写,这样在学数据结构的同时还能对ECMAScript6有进一步的认识,如需先了解es6语法请浏览ht ...
- JavaScript数据结构与算法——链表详解(下)
在JavaScript数据结构与算法--链表详解(上)中,我们探讨了一下链表的定义.实现原理以及单链表的实现.接下来我们进一步了解一下链表的其他内容. 1.双向链表 双向链表实现原理图: 与单向链表不 ...
- JavaScript数据结构与算法——队列详解(下)
接下来会借助本人另一篇文章JavaScript数据结构与算法--队列详解(上)中实现的队列类及其方法实现一个应用. 配对问题 需求分析:在一个文件中保存着一份男女混合的数据,名称前以B开头表示男士,以 ...
- JavaScript数据结构与算法——数组详解(下)
1.二维与多维数组 JavaScript只支持一维数组,但是通过在数组里保存数组元素的方式,可以轻松创建多维数组. 1.1 创建二维数组 二维数组类似一种由行和列构成的数组表格,在JavaScript ...
- JavaScript数据结构与算法——栈详解
1.栈基本知识 栈是一种特殊的列表,栈的元素只能通过列表的一端访问,这一端成为栈顶,栈具有先进后出的特点,要想访问栈底的元素,就必须将上边的元素先拿出来.对栈的操作主要是入栈和出栈,通过push()和 ...
- JavaScript数据结构与算法——队列详解(上)
队列基本知识 队列是一种与列表很像的数据结构,只是队列只能在尾部插入元素,在队首删除元素.队列用于存放按顺序排列的元素,先进先出,就像食堂排队一样,后来的只能排在后面,先来的先拿饭,一种井然有序的感觉 ...
- JavaScript数据结构与算法——数组详解(上)
1.JS中的数组 JS中的数组是一个特殊的对象,用来表示偏移量的索引是该对象的属性,索引可能是整数,但是这些数字索引会在内部转换成字符串类型(因为JS对象中的属性名必须是字符串).数组在JS中只是一种 ...
- c++数据结构中 顺序队列的队首队尾_数据结构与算法—队列详解
前言 栈和队列是一对好兄弟,前面我们介绍过数据结构与算法-栈详解,那么栈的机制相对简单,后入先出,就像进入一个狭小的山洞,山洞只有一个出口,只能后进先出(在外面的先出去).而队列就好比是一个隧道,后面 ...
最新文章
- java 取pdf表格内容数据_Java 在PDF中添加表格
- 谷歌生物医学专用翻译_文献翻译|知云翻译,写论文必备~
- 数据分析进阶 数据质量
- bzoj2424 订货
- java实现原数组根据下标分隔成两个子数组并且在原数组中交换两个子数组的位置...
- chrome扩展之3:一步步跟我学开发一个表单填写扩展
- python for everybody作业和测试答案_Python第九,十章练习题 (第五周作业)
- cip协议服务器,控制及信息协议(CIP)
- C++基础::类设计的几大原则
- python单词的含义-python 前面几个单词含义
- 爱客影视 程序存在文件写入漏洞 分析
- Tomcat环境配置 以及报错500的问题
- php居中显示代码,css居中代码是什么
- 教你学习JavaScript的this入门到进阶最全用法
- GoLang之Go 语言与鸭子类型的关系(1)
- docker端口映射后连不上的问题
- 向量叉积和点积混合运算_叉乘点乘混合运算公式
- win7利用映射网络驱动器功能管理网站FTP空间
- vue引入svg图片
- ubuntu中安装软件的方法