zoukankan      html  css  js  c++  java
  • javascript数据结构与算法——列表

     前言:

      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;
    }
  • 相关阅读:
    Linux08:帮助与常用快捷键
    Android : 跟我学Binder --- (5) C++实现
    Linux应用调试 :使用gdb和gdbserver进行远程调试
    Mosquitto-1.5在Linux上的安装以及Android客户端的实现
    MySQL-8.0.15在Win10和Ubuntu上安装&使用
    Android : 跟我学Binder --- (4) 驱动情景分析
    Android : Android Studio 更新至gradle 4.10.1后Variants API变化
    Android : 跟我学Binder --- (3) C程序示例
    Android : 关于HTTPS、TLS/SSL认证以及客户端证书导入方法
    Android : 跟我学Binder --- (2) AIDL分析及手动实现
  • 原文地址:https://www.cnblogs.com/yyy6/p/7910527.html
Copyright © 2011-2022 走看看