使用js构造数组/列表/栈/队列/链表对象

2016-09-04  本文已影响633人  escawn

数组

js中本身就有数组对象,数组中的每一项都可以保存任何类型的数据.且ECMAScript 数组的大小是可以动态调整的,即可以随着数据的添加自动增长以容纳新增数据。接下来创建的列表、队列、链表等对象都是基于数组的。

1. 数组的构造

数组的创建也有构造函数和对象字面量两种方法。在使用 Array 构造函数时也可以省略 new 操作符。

var colors = Array(3); // 创建一个包含 3 项的数组
var names = Array("Greg"); // 创建一个包含 1 项,即字符串"Greg"的数组
2.数组的方法

(1)数组的转换方法toString( )

(2)数组的连接方法join( )

var colors = ["red", "green", "blue"];
    alert(colors.join(","));       //red,green,blue
    alert(colors.join("||"));      //red||green||blue

(3)数组栈方法

(4)数组队列方法

(5)数组重排列方法

(6)数组的操作方法

(7)数组的位置方法

(8)数组的迭代方法
每个方法都接收两个参数:要在每一项上运行的函数和 (可选的)运行该函数的作用域对象——影响 this 的值。传入这些方法中的函数会接收三个参数:数组项的值、该项在数组中的位置和数组对象本身。

(9)数组的归并方法

 var values = [1,2,3,4,5];
    var sum = values.reduce(function(prev, cur, index, array){
        return prev + cur;
    });
    alert(sum); //15

</br>

列表

其实列表与数组的作用与定义都十分相似。每个列表中的数据项称为元素,列表中的元素可以是任意数据类型。列表中可以保存多少元素并没有事先限定,实际使用时元素的数量受到程序内存的限制。

1. 列表的构造
function List(){
  this.listSize = 0;
  this.dataStore = [];
  this.pos = 0;
}
List.prototype = {
  constructor:List;
  //向列表添加数据
  addElement:function(element){
    this.dataStore[this.listSize++] = element;
  }
  
  //查找列表中的数据
  findElement:function(element){
    //不用indexOf()方法是因为只能返回找到的第一个元素的位置
    var arr = [];
    for (var i = 0; i < this.dataStore.length; ++i) {
      if (this.dataStore[i] == element) { 
        arr.push(i);
      }
    }
    return arr;
}

  //从列表删除数据
  removeElement:function(element){
    var foundAt = this.findElement(element);
    if (foundAt.length>0){
      for(var i=0;i<foundAt.length;i++){
        this.dataStore.splice(foundAt[i],1); 
        --this.listSize;
      }
      return true;
    }
    return false;
  }

  //列表中有多少个元素
  length:function(){
    function length() { 
      return this.listSize;
    }
  }

  //向列表中插入一个元素
  insertElement:function(element,index){
    //假设插入是指插入到列表中某个位置上
    this.dataStore.splice(index,0,element);
    return true;
  }

  //清空列表
  clearList:function(){
    delete this.dataStore; 
    this.dataStore = []; 
    this.listSize= 0;
  }

  //将列表的当前位置移动到第一个元素
  front:function() { 
    this.pos = 0;
  }

  //将列表的当前位置移动到最后一个元素
  end:function() { 
    this.pos = this.listSize-1;
  }
  
  //将当前位置前移一位
  pre:function() { 
    if (this.pos > 0) {
       --this.pos; 
    }
  }

  //将当前位置后移一位
  next:function() { 
    if (this.pos < this.listSize-1) {
     ++this.pos; 
    }
  }

  //将当前位置移动到指定位置
  moveTo:function(position) { 
    this.pos = position;
  }
}
2. 列表的属性
3. 列表的方法

</br>

栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶。栈被称为一种后入先出(LIFO,last-in-first-out)的数据结构。

1. 栈的构造函数
function Stack(){
  this.top = 0;
  this.dataStore = [];
}
Stack.prototype = {
  constructor:Stack;
 //向栈中添加元素
  push:function(element){
    this.dataStore[this.top++] = element;
  }

  //栈顶元素出栈,并返回
  pop:function(){
    return this.dataStore[--this.top];
  }

  //返回栈顶元素
  peek:function() { 
    return this.dataStore[this.top-1];
  }

  //清空栈
  clear:function(){
    this.dataStore.length = 0;
  }

  
}
2. 栈的属性
3. 栈的方法

</br>

队列

队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素。队列用于存储按顺序排列的数据,先进先出(First-In-First-Out,FIFO)

1. 队列的构造
function   Queue(){ 
  this.dataStore = [];
}
Queue.prototype = { 
  constructor:Queue;
  //向队尾添加一个元素
  enqueue:function(element){
    this.dataStore.push(element);  
  }

  //删除队首的元素
  dequeue:function(){
    return this.dataStore.shift();
  }

  //读取队首的元素
  front:function(){
    return this.dataStore[0];
  }

  //读取队尾的元素:
  end:function(){
    return this.dataStore[this.dataStore.length-1];
  }
}
2. 队列的属性
3. 队列的方法

</br>

链表

链表是由一组节点组成的集合。每个节点都使用一个对象的引用指向它的后继。指向另一个节点的引用叫做链。数组元素靠它们的位置进行引用,链表元素则是靠相互之间的关系进行引用。

1. 链表的构造
//链表上的节点
function Node(element){
  this.element = element;
  this.next = null;
}

//链表
function LinkedList(){
  this.head = new Node("head");
}

LinkedList.prototype = {
  constructor:LinkedList;
  //寻找节点
  find:function(item){
    var currNode = this.head; 
    while (currNode.element != item) {
      currNode = currNode.next; }
     return currNode;
  }

  //插入节点
  insert:function(new,item){
    var newNode = new Node(new);
    var current = this.find(item);
    newNode.next = current.next;
    current.next = newNode;
  }

  //寻找这个节点的上一个节点
  findPrevious:function(item){
    var currNode = this.head;
    while (!(currNode.next == null) &&(currNode.next.element != item)) { 
      currNode = currNode.next;
    }
    return currNode;
  }

  //删除节点
  remove:function(item){
    var pre = this.findPrevious(item);
    pre.next = pre.next.next; 
  }
}
2. 链表的属性
3. 链表的方法
上一篇 下一篇

猜你喜欢

热点阅读