javascript數據結構與算法——列表

 前言: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;
}
相關文章
相關標籤/搜索