前言:javascript
1. 數據的存儲結構順序不重要,也沒必要對數據進行查找,列表就是一種很好的數據存儲結構;java
2.此列表採用仿原生數組的原型鏈上的方法來寫,具體能夠參考MDN數組介紹,並麼有用prototype來構造。數組
3. 使用迭代器,能夠沒必要關心數據的存儲方式,以實現對列表的遍歷。在下面的front()、end()、prev()、next()和currPos()就實現了實例類的一個迭代器,具備如下優勢:app
a. 訪問列表時沒必要關心底層的數據存儲結構;函數
b. 能夠用不一樣的類型的數據存儲方式來是實現實例類,迭代器爲訪問列表裏的元素提供了一種統一的方式。this
<一> 列表的抽象數據類型定義spa
1. 列表是一組有序的數據。每一個列表中的數據項稱爲元素。在javascript中,列表中的元素能夠是任意的數據類型。列表中的能夠保存多少元素並麼有限制,實際使用時元素的數量受到內存的限制。prototype
2. 列表對應的屬性和方法code
listSize(屬性) | 列表中元素的個數 |
pos(屬性) | 列表的當前位置 |
length(屬性) | 返回列表中元素的個數 |
clear(方法) | 清空列表中全部的元素 |
toString(方法) | 返回列表的字符串形式 |
getElement(方法) | 返回當前位置的元素 |
insert(方法) | 在現有元素後插入新元素 |
append(方法) | 在列表的末尾添加新元素 |
remove(方法) | 在列表中刪除元素 |
front(方法) | 將列表的當前位置移動到第一個元素位置 |
end(方法) | 將列表的當前位置移動到最後一個元素位置 |
prev(方法) | 將當前位置後移一位 |
next(方法) | 將當前位置前移一位 |
hasNext(方法) | 判斷是否還有下一位 |
hasPrev(方法) | 判斷是否還有上一位 |
currPos(方法) | 返回列表的當前位置 |
moveTo(方法) | 將當前位置移動到指定位置 |
3. 模擬列表來構造函數以及對應迭代器blog
/* * 列表完整抽象數據類型定義 * */ 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; }