列表

本文共--字 阅读约--分钟 | 浏览: -- Last Updated: 2021-04-18

列表的抽象数据类型定义

列表是一组有序的数据,每个列表中的数据项被称为元素,在JavaScript中,列表中的元素可以是任意数据类型。

不包含任何元素的列表称为空列表,列表中包含元素的个数用 listSize 表示,可以在列表末尾 append 一个元素,也可以在一个给定元素后或列表的起始位置 insert 一个元素,使用 remove 的方法从列表中删除元素,使用 clear 方法清空列表中所有的元素。

还可以使用 toString 方法显示列表中所有的元素,使用 getElement 方法显示当前元素,列表拥有描述元素位置的属性 pos。列表有前有后分别对应 frontend。使用 next 方法可以从当前元素移动到下一个元素,使用 prev 方法可以移动到当前元素的前一个元素。还可以使用 moveTo 方法直接移动到指定位置,使用 currPos 方法来获取列表中的当前位置。

实现

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;
  // listSize++ 先复制后++ 所以先为当前列表最后添加一个元素,然后为listSize 加1
}

// 删除元素
function remove(element) {
  var foundAt = this.find(element)
  if (foundAt > -1) {
    this.dataStore.splice(foundAt, 1)
    --this.listSize
    return true
  }
  return false
}
// 查找元素
function find(element) {
  for (var i = 0; i < this.dataStore.length; ++i) {
    if (this.dataStore[i] === element) {
      return i;
    }
  }
  return -1;
}

function length() {
  return this.listSize;
}

// 显示列表中的元素
function toString() {
  // 具体如何显示,应该按照应用逻辑来实现
  console.log(this.dataStore.join('\n'))
  return this.dataStore;
}

function insert(element, after) {
  var insertPos = this.find(after)
  if (insertPos > -1) {
    this.dataStore.splice(insertPos + 1, 0, element)
    ++this.listSize;
    return true
  }
  return false
}

function clear() {
  delete this.dataStore
  this.dataStore.length = 0
  this.listSize = this.pos = 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
}

示例

// example 1
var names = new List();
names.append('Clayton')
names.append('Raymond')
names.append('Cynthia')
names.append('Jennifer')
names.append('Bryan')
names.append('Danny')

names.front();
console.log(names.getElement()) // 'Clayton'
names.next();
console.log(names.getElement()); // 'Raymond'
names.next();
names.next();
names.prev();
console.log(names.getElement()); // 'Cynthia'

// example 2
// 使用迭代器访问列表
// 从前往后
for (names.front(); names.hasNext(); names.next()) {
  console.log(names.getElement());
}

// 从后往前
for (names.end(); names.hasPrev(); names.prev()) {
  console.log(names.getElement());
}