javascript數據結構與算法---列表javascript
前言:在平常生活中,人們常常要使用列表,好比咱們有時候要去購物時,爲了購物時東西要買全,咱們能夠在去以前,列下要買的東西,這就要用的列表了,或者咱們小時候上學那段時間,每次考完試後,學校都會列出此次考試成績前十名的同窗的排名及成績單,等等這些都是列表的列子。咱們計算機內也在使用列表,那麼列表適合使用在什麼地方呢?不適合使用在什麼地方呢?java
適合使用在:當列表的元素不是不少的狀況下,能夠使用列表,由於對列表中的元素查找或者排序時,效率還算很是高,反之:若是列表元素很是多的狀況下,就不適合使用列表了。算法
一:列表的抽象數據類型定義數組
爲了設計列表的抽象數據類型,咱們須要給出列表的定義,包括列表應該擁有哪些屬性,應該在列表上執行哪些操做等。數據結構
列表是一組有序的數據。每一個列表中的數據項稱爲元素。在javascript中,列表中的元素能夠是任意數據類型。列表中能夠保存多少元素並無事先約定。可是實際使用時元素數量受到程序內存的限制。app
如今咱們想設計一個列表,那麼咱們能夠想一想實現一個列表,他們應該包含哪些屬性和方法,固然我下面的設計都是根據 "javascript數據結構與算法" 書上的demo來設計的,爲止咱們能夠學習下,若是之後咱們編寫程序時,該如何來設計咱們本身的抽象類來做爲一個參考,咱們如今學習書上的demo最主要的是學習他們中的設計思想及編寫代碼的方式。他們有以下屬性;函數
1. listSize(屬性):使用一個listSize變量來保存列表中元素的個數。學習
2. pos(屬性): 列表的當前位置,元素的索引。this
3. dataStore(屬性): 初始化一個空數組來保存元素的個數。若是咱們想取得具體的列表中的元素 能夠使用上面的pos屬性;如 dataStore[pos];編碼
全部的方法;以下列表解釋,不一一介紹了。
二:如何實現列表類。
根據上面定義的列表抽象數據類型,咱們能夠實現以下一個List類,以下經過構造函數+原型模式。
function List() { // 列表的元素個數
this.listSize = 0; // 列表的當前位置 是第幾個
this.pos = 0; // 初始化一個空數組來保存列表元素
this.dataStore = []; } List.prototype = { // 給列表末尾添加元素
append: function(element) { var self = this; self.dataStore[this.listSize++] = element; }, // 從列表中刪除元素
remove: function(element) { var self = this; var curIndex = self.find(element); if(curIndex > -1) { self.dataStore.splice(curIndex,1); --self.listSize; return true; } return false; }, // 查找列表中的元素 返回索引
find: function(element) { var self = this; for(var i = 0,dataLen = self.dataStore.length; i < dataLen; i++) { if(self.dataStore[i] == element) { return i; } } return -1; }, // 返回列表中元素的個數
length: function() { return this.listSize; }, // 顯示列表中的元素
toString: function(){ return this.dataStore; }, /* * 在指定元素後面插入一個元素 * @param element 當前的元素 * @param elementAfter 把當前的元素插入到此元素後面 */ insert: function(element,elementAfter){ var self = this; var insertPos = self.find(elementAfter); if(insertPos > -1) { self.dataStore.splice(insertPos+1,0,element); ++self.listSize; return true; } return false; }, // 清空列表中的全部元素
clear: function() { delete this.dataStore; this.dataStore = []; this.listSize = this.pos = 0; }, // 判斷給定的元素是否在列表中
contains: function(element) { var self = this; for(var i = 0,ilen = self.dataStore.length; i < ilen; i++) { if(self.dataStore[i] == element) { return true; } } return false; }, // 將列表中的當前元素移動到第一個位置
front: function(){ this.pos = 0; }, // 將列表中當前的元素移動到最後一個位置
end: function(){ this.pos = this.listSize - 1; }, // 將當前位置 後移一位
prev: function(){ if(this.pos > 0) { --this.pos; } }, // 將當前位置 前移一位
next: function(){ if(this.pos < this.listSize - 1) { ++this.pos; } }, // 返回列表的當前位置
curPos: function(){ return this.pos; }, // 將當前位置移動到指定位置
moveTo: function(n) { this.pos = n; }, // 返回當前位置的元素
getElement:function(){ return this.dataStore[this.pos]; } };
如上:實現一個列表類,包含上面的如上那麼多方法,固然咱們也能夠擴展一些其餘的方法,來豐富實現列表類,最主要能夠學習如上編碼方式。