線性表的順序存儲

/**
 * 線性表的順序存儲
 * 經過內存地址的連續性來顯示數據元素間的邏輯關係
 * js能夠採用數組來實現連續內存空間的分配(沒法採用指針動態分配)
 * 沒法採用 c 中的指針來分配空間,因此使用數組來分配空間
 * 
 * 優勢:可以隨機存取,下標訪問速度爲O(1),實現簡單
 * 缺點:刪除和插入數據須要移動元素,效率較低
 */

 class Sequence {
     /**
      * 初始化線性表
      * @param {Number/Array}} init 
      */
    constructor (init) {
        this.data = Array.isArray(init) ? new Array(...init) : new Array(init) // 分配連續的地址空間
        this.length = this.data.length

        this.RANGE_ERROR = 'range_error'
        this.SUCCESS = 'success'
        this.FATAL = 'FATAL'
        this.FAIL = 'fail'
    }
    /**
     * 根據下標,獲取順序表中的值
     * @param {*} pos 下標
     * @param {*} ele 接收值得變量
     */
    retrieve (pos, ele) {
        let status = this.RANGE_ERROR
        if (pos >= 0 && pos < this.data.length) {
            ele = this.data[pos]
            status = this.SUCCESS
        }
        return status
    }
    /**
     * 根據值,獲取下標
     * @param {*} val 進行匹配的值
     * @param {*} pos 接收下標的變量
     */
    locate (val, pos) {
        let status = this.RANGE_ERROR
        for (let i = 0; i < this.data.length; i++) {
            let ele = this.data[i]
            if (ele === val) {
                pos = i
                status = this.SUCCESS
                break
            }
        }
        return status
    }
    /**
     * 在指定的位置插入數據
     * @param {*} pos 須要插入數據的下標
     * @param {*} val 插入的值
     */
    insert (pos, val) {
        let status = this.RANGE_ERROR
        if (pos >= 0 && pos < this.data.length) {
            for (let i = this.data.length - 1; i >= pos; i--) {
                this.data[i + 1] = this.data[i]
            }
            this.data[pos] = val
            this.data.length++
            status = this.SUCCESS
        }
        return status
    }
    /**
     * 刪除指定下標的元素
     * @param {*} pos 下標
     */
    remove (pos) {
        let status = this.RANGE_ERROR
        if (pos >= 0 && pos < this.data.length) {
            for (let i = pos; i < this.data.length; i++) {
                this.data[pos] = this.data[pos + 1]
            }
            this.data.length--
            status = this.SUCCESS
        }
        return status
    }
    /**
     * 替換指定下標的元素值
     * @param {*} pos 下標
     * @param {*} val 替換的值
     */
    replace (pos, val) {
        let status = this.RANGE_ERROR
        if (pos >= 0 && pos < this.data.length) {
            this.data[pos] = val
            status = this.SUCCESS
        }
        return status
    }
    destory () {
        this.data = null
        this.data.length = 0
    }
    clear () {
        this.data = []
        this.data.length = 0
    }
    empty () {
        return this.data.length === 0
    }
    /**
     * 求指定下標的前驅
     * @param {*} pos 下標
     * @param {*} ele 接收前驅值的變量
     */
    prior (pos, ele) {
        let status = this.RANGE_ERROR
        if (pos >= 1 && pos < this.data.length) {
            ele = this.data[pos - 1]
            status = this.SUCCESS
        }
        return status
    }
    /**
     * 獲取指定下標的後繼
     * @param {*} pos 下標
     * @param {*} ele 接收後繼值的變量
     */
    next (pos, ele) {
        let status = this.RANGE_ERROR
        if (pos >= 0 && pos < this.data.length - 1) {
            ele = this.data[pos + 1]
            status = this.SUCCESS
        }
        return status
    }
    push (val) {
        this.data[this.data.length + 1] = val
    }
 }



 const a = new Sequence(5)
 a.insert(0, 0)
 a.insert(1, 1)
 console.log(a.data)
 a.remove(1)
 console.log(a.data)
複製代碼
相關文章
相關標籤/搜索