Javascript數(shù)據(jù)結(jié)構(gòu)與算法之列表詳解
前言:在日常生活中,人們經(jīng)常要使用列表,比如我們有時(shí)候要去購(gòu)物時(shí),為了購(gòu)物時(shí)東西要買全,我們可以在去之前,列下要買的東西,這就要用的列表了,或者我們小時(shí)候上學(xué)那段時(shí)間,每次考完試后,學(xué)校都會(huì)列出這次考試成績(jī)前十名的同學(xué)的排名及成績(jī)單,等等這些都是列表的列子。我們計(jì)算機(jī)內(nèi)也在使用列表,那么列表適合使用在什么地方呢?不適合使用在什么地方呢?
適合使用在:當(dāng)列表的元素不是很多的情況下,可以使用列表,因?yàn)閷?duì)列表中的元素查找或者排序時(shí),效率還算非常高,反之:如果列表元素非常多的情況下,就不適合使用列表了。
一:列表的抽象數(shù)據(jù)類型定義
為了設(shè)計(jì)列表的抽象數(shù)據(jù)類型,我們需要給出列表的定義,包括列表應(yīng)該擁有哪些屬性,應(yīng)該在列表上執(zhí)行哪些操作等。
列表是一組有序的數(shù)據(jù)。每個(gè)列表中的數(shù)據(jù)項(xiàng)稱為元素。在javascript中,列表中的元素可以是任意數(shù)據(jù)類型。列表中可以保存多少元素并沒有事先約定。但是實(shí)際使用時(shí)元素?cái)?shù)量受到程序內(nèi)存的限制。
現(xiàn)在我們想設(shè)計(jì)一個(gè)列表,那么我們可以想想實(shí)現(xiàn)一個(gè)列表,他們應(yīng)該包含哪些屬性和方法,當(dāng)然我下面的設(shè)計(jì)都是根據(jù) "javascript數(shù)據(jù)結(jié)構(gòu)與算法" 書上的demo來(lái)設(shè)計(jì)的,為止我們可以學(xué)習(xí)下,如果以后我們編寫程序時(shí),該如何來(lái)設(shè)計(jì)我們自己的抽象類來(lái)作為一個(gè)參考,我們現(xiàn)在學(xué)習(xí)書上的demo最主要的是學(xué)習(xí)他們中的設(shè)計(jì)思想及編寫代碼的方式。他們有如下屬性;
1. listSize(屬性):使用一個(gè)listSize變量來(lái)保存列表中元素的個(gè)數(shù)。
2. pos(屬性): 列表的當(dāng)前位置,元素的索引。
3. dataStore(屬性): 初始化一個(gè)空數(shù)組來(lái)保存元素的個(gè)數(shù)。如果我們想取得具體的列表中的元素 可以使用上面的pos屬性;如 dataStore[pos];
所有的方法;如下列表解釋,不一一介紹了。
二:如何實(shí)現(xiàn)列表類
根據(jù)上面定義的列表抽象數(shù)據(jù)類型,我們可以實(shí)現(xiàn)如下一個(gè)List類,如下通過(guò)構(gòu)造函數(shù)+原型模式。
function List() {
// 列表的元素個(gè)數(shù)
this.listSize = 0;
// 列表的當(dāng)前位置 是第幾個(gè)
this.pos = 0;
// 初始化一個(gè)空數(shù)組來(lái)保存列表元素
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;
},
// 返回列表中元素的個(gè)數(shù)
length: function() {
return this.listSize;
},
// 顯示列表中的元素
toString: function(){
return this.dataStore;
},
/*
* 在指定元素后面插入一個(gè)元素
* @param element 當(dāng)前的元素
* @param elementAfter 把當(dāng)前的元素插入到此元素后面
*/
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;
},
// 將列表中的當(dāng)前元素移動(dòng)到第一個(gè)位置
front: function(){
this.pos = 0;
},
// 將列表中當(dāng)前的元素移動(dòng)到最后一個(gè)位置
end: function(){
this.pos = this.listSize - 1;
},
// 將當(dāng)前位置 后移一位
prev: function(){
if(this.pos > 0) {
--this.pos;
}
},
// 將當(dāng)前位置 前移一位
next: function(){
if(this.pos < this.listSize - 1) {
++this.pos;
}
},
// 返回列表的當(dāng)前位置
curPos: function(){
return this.pos;
},
// 將當(dāng)前位置移動(dòng)到指定位置
moveTo: function(n) {
this.pos = n;
},
// 返回當(dāng)前位置的元素
getElement:function(){
return this.dataStore[this.pos];
}
};
如上:實(shí)現(xiàn)一個(gè)列表類,包含上面的如上那么多方法,當(dāng)然我們也可以擴(kuò)展一些其他的方法,來(lái)豐富實(shí)現(xiàn)列表類,最主要可以學(xué)習(xí)如上編碼方式。
- JS無(wú)限樹狀列表實(shí)現(xiàn)代碼
- js實(shí)現(xiàn)無(wú)限級(jí)樹形導(dǎo)航列表效果代碼
- JavaScript實(shí)現(xiàn)LI列表數(shù)據(jù)綁定的方法
- JS實(shí)現(xiàn)左邊列表移到到右邊列表功能
- JS實(shí)現(xiàn)的合并兩個(gè)有序鏈表算法示例
- JavaScript數(shù)據(jù)結(jié)構(gòu)之雙向鏈表和雙向循環(huán)鏈表的實(shí)現(xiàn)
- JavaScript數(shù)據(jù)結(jié)構(gòu)之單鏈表和循環(huán)鏈表
- 如何使用JavaScript實(shí)現(xiàn)棧與隊(duì)列
- JS使用數(shù)組實(shí)現(xiàn)的隊(duì)列功能示例
- JavaScript基于數(shù)組實(shí)現(xiàn)的棧與隊(duì)列操作示例
- JS中的算法與數(shù)據(jù)結(jié)構(gòu)之列表(List)實(shí)例詳解
相關(guān)文章
JavaScript實(shí)現(xiàn)的伸展收縮型菜單代碼
這篇文章主要介紹了JavaScript實(shí)現(xiàn)的伸展收縮型菜單代碼,可實(shí)現(xiàn)JavaScript響應(yīng)鼠標(biāo)事件動(dòng)態(tài)遍歷及修改頁(yè)面元素屬性的功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10JavaScript實(shí)現(xiàn)添加及刪除事件的方法小結(jié)
這篇文章主要介紹了JavaScript實(shí)現(xiàn)添加及刪除事件的方法,實(shí)例總結(jié)了javascript對(duì)事件的添加及刪除的技巧,涉及javascript事件綁定的方法及瀏覽器兼容的相關(guān)注意事項(xiàng),需要的朋友可以參考下2015-08-08通過(guò)JavaScript使Div居中并隨網(wǎng)頁(yè)大小改變而改變
自己的頁(yè)面太難看了,要居中沒居中,要顏色沒顏色,但是無(wú)論是怎么樣都得使登錄的框居中吧,下面與大家分享下通過(guò)JavaScript可以簡(jiǎn)單的使Div在頁(yè)面上居中,隨著網(wǎng)頁(yè)大小的改變做出相應(yīng)的改變2013-06-06JavaScript數(shù)據(jù)類型學(xué)習(xí)筆記分享
這篇文章主要為大家分享了JavaScript數(shù)據(jù)類型學(xué)習(xí)筆記,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09