js数据结构第二弹:列表

本文介绍了JavaScript中列表的抽象数据类型定义,包括listSize、pos等属性及insert、append、remove等方法。接着详细阐述了如何实现列表类,如添加、查找和删除元素的操作。还讨论了使用迭代器访问列表的优势,并给出一个基于列表的应用场景,涉及从文件读取数据、创建列表及客户检出电影的功能。

1. 列表的抽象数据类型定义

listSize(属性) 列表的元素个数
pos(属性) 列表的当前位置
length(属性) 返回列表中元素的个数
clear(方法) 清空列表中的所有元素
toString(方法) 返回列表的字符串形式
getElement(方法) 返回当前位置的元素
insert(方法) 在现有元素后插入新元素
append(方法) 在列表的末尾添加新元素
remove(方法) 从列表中删除元素
front(方法) 将列表的当前位置设移动到第一个元素
end(方法) 将列表的当前位置移动到最后一个元素
prev(方法) 将当前位置后移一位
next(方法) 将当前位置前移一位
currPos(方法) 返回列表的当前位置
moveTo(方法) 将当前位置移动到指定位置

2. 实现列表类

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;列表 | 35
	    this.end = end;
	    this.prev = prev;
	    this.next = next;
	    this.length = length;
	    this.currPos = currPos;
	    this.moveTo = moveTo;
	    this.getElement = getElement;
	    this.length = length;
	    this.contains = contains;
	    }

1.append: 给列表添加元素

  //给列表的最后一个位置添加一个新的元素,待插入成功后,更新列表中的元素个数
    function append(element) {
    	this.dataStore[this.listSize++] = element;
    	}

2.find: 在列表中查找某一元素

function find(element) {
	for (var i = 0; i < this.dataStore.length; ++i) {
    	if (this.dataStore[i] == element) {
	    	return i;
    	}
    		} 
		    return -1;
}

3.remove: 从列表中删除元素
remove() 方法:该方法通过使用find()方法返回元素的位置对 dataStore 数组进行截取,如果删除成功,返回 true , 并将 listSize 的值减1,更新列表长度,否则返回 false

function remove(element) {
	var foundAt = this.find(element);
	if (foundAt > -1) {
    	this.dataStore.splice(foundAt,1);
    	--this.listSize;
    	return true;
    	} 
return false;
}

4.length: 列表中有多少个元素

function length() {
	return this.listSize;
	}

5.toString: 显示列表中的元素

function toString() {
	return this.dataStore;
	}

6. insert: 向列表中插入一个元素
该方法需要传入两个参数,第一个参数表示待插入的元素,第二个参数表示待插入元素的前一个元素,用于确定插入元素的位置,并调用 splice 方法更改列表数组,插入成功后更新 listSize 并返回 true , 否则返回 false;

function insert(element, after) {
    var insertPos = this.find(after);
    if (insertPos > -1) {
	    this.dataStore.splice(insertPos+1, 0, element);
	    ++this.listSize;
	    return true;
    } 
    return false;
    }

7.clear: 清空列表中所有的元素
该方法使用 delete 操作符删除 dataStore 数组 , 接着创建新的数组,并将其 listSize 和 pos 初始化设为 1 。

  function clear() {
    	delete this.dataStore;
    	this.dataStore = [];
    	this.listSize = this.pos = 0;
    	}

8. contains: 判断给定值是否在列表中

function contains(element) {
	for (var i = 0; i < this.dataStore.length; ++i) {
		if (this.dataStore[i] == element) {
		return true;
		}
	} 
	return false;
	}

9. 遍历列表 getElement()

//直接取对应的元素就好
 function getElement(){
    return this.dataStore[this.pos];
}

3. 使用迭代器访问列表

方法front()、 end()、 prev()、 next() 和 currPos 就实现了 cList 类的一个迭代器。 以下是和使用数组索引的方式相比, 使用迭代器的一些优点。
• 访问列表元素时不必关心底层的数据存储结构。
• 当为列表添加一个元素时, 索引的值就不对了, 此时只用更新列表, 而不用更新迭代器。
• 可以用不同类型的数据存储方式实现 cList 类, 迭代器为访问列表里的元素提供了一种统一的方式。

1.front:将列表的位置移到第一个位置上

//该方法只要将 pos 置为 0 即可

function front(){
    this.pos = 0 ;
}

2.end:将列表的位置移到最后一个位置上

//同上,该方法只要将 pos 置为列表长度减 1 即可,因为数组下标从 0 开始嘛

function end(){
    this.pos = this.listSize - 1;
}

3.prev:将当前位置前移一位

//只要将 pos 的位置减 1 即可,但要主要不能越界

function prev(){
    if( this.pos > 0 ){
        this.pos --;
    }else{
        console.log('您当前已在首位');
    }
}

4.next:将当前位置后移一位

//同理,只要将 pos 的位置加 1 即可,但要主要不能越界

function next(){
    if( this.pos < this.listSize - 1 ){
        ++this.pos;
    }else{
        console.log('您当前已在末尾');
    }
}

5.moveTo:将当前位置移动到指定位置

//直接改变 pos 的值即可,注意输入的合法性

function moveTo( position ){
    if( position < 0 || position > (this.listSize - 1) ){
        console.log('请输入正确的位置');
    }else{
        this.pos = position;
    }
}

6.currPos:返回列表的当前位置

//只需将 pos 直接返回即可

function currPos(){
    return this.pos;
}

4. 一个基于列表的应用

1.从文件中读取数据

function createArr(file) {
var arr = read(file).split("\n");
for (var i = 0; i < arr.length; ++i) {
    arr[i] = arr[i].trim();
    //使用 trim() 方法删除每个数组元素末尾的空格
    } 
return arr;
}

2.将数组 movies 中的元素保存到一个列表中

var movieList = new List();
for (var i = 0; i < movies.length; ++i) {
    movieList.append(movies[i]);
    }

3.显示清单

function displayList(list) {
    for (list.front(); list.currPos() < list.length(); list.next()) {
	    if (list.getElement() instanceof Customer) {
	    //使用 instanceof 操作符判断该元素是否是 Customer 对象。
		    print(list.getElement()["name"] + ", " +
		    list.getElement()["movie"]);
	    } 
	    else {
		    print(list.getElement());
	    }
    }
}

4.创建一个新列表 customers, 用来保存在系统中检出电影的客户

var customers = new List();
function Customer(name, movie) {
	this.name = name;
	this.movie = movie;
	}

5.创建一个允许客户检出电影的函数

function checkOut(name, movie, filmList, customerList) {
    if (movieList.contains(movie)) {
	    var c = new Customer(name, movie);
	    customerList.append(c);
	    filmList.remove(movie);
    } 
    else {
	    print(movie + " is not available.");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值