/**
* 線性表的順序存儲
* 經過內存地址的連續性來顯示數據元素間的邏輯關係
* 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)
複製代碼