世上焉有無雙數,萬般玄機誰可知,我本杯中一浮游,何來笑談青蓮久
--山鬼Sakura
大家好,這裡是山鬼,一個熱愛古風的漢子,很高興與大家相識,講到資料結構,我與它之間還有一段不解之緣。
那時的我還是一個初涉計算機程式設計的懵懂高中少年,記得那是一個陽光不算明媚的下午,計算機課上的老師炒著股,我們坐在各自的電腦前,偷偷的打著區域網下的Dota,依稀記得那一場我們勝了,歡呼著,雀躍著,哪怕只是同學之間的小比賽,只是不知何時,老師悄然的出現,沉默了一切,這是一切故事的開始。
老師顯然有些氣憤,說要告訴班主任,取消計算機課,我慌了,一時激動之下,站了起來,向老師發起了挑戰,如果我程式設計贏了他,就不許告訴班主任,要是輸了,也不許告訴班主任(就任憑處置),題目一人出兩題,emmmm,他沒說話,隨手開啟了我對面的一臺電腦,顯然是默許,我有些心虛,但還是鼓起勇氣開啟了編輯器,比試的內容是幾個基礎的程式設計題,最後一題是一個迴文,前面的幾題邏輯簡單,實現起來也較為輕鬆,沒有人出現問題,只是最後一題,我試了好幾種方法,都沒能成功,心灰意冷的我只能放棄,想著以後沒有計算機課的生活會是如何。萬萬沒想到,最後結果是平局,誰也沒贏,原因是老師的程式碼執行後測試出現了問題,於是這件事就在時間的推移中漸漸被淡忘,直到我開始接觸了資料結構資料結構,顧名思義,是一種資料的結構,結構是框架,資料是內容,能成為結構的資料,從來不會是單一的,也就是說,這是一種由眾多資料在一定規律的排列方式下形成的結構體,目前常用的有列表,連結串列,圖,樹等,但是這是已有的通用結構,而我們在開發的過程中也會偶爾突發奇想,創新出新的資料儲存結構,這也是資料結構
在資料結構中,基本的實現都已依存與資料的存與讀的方式,比如先入先出,先入後出等
這裡舉個簡單的例子
function List() {
this.length=0; //可用作長度的儲存或者最後一個資料的index
this.Data=[]; //用作資料的儲存
//this.getIndex=getIndex; 獲取到指定元素的索引
//this.clear=clear; 清除資料
//this.append=appened; 新增資料
//this.remove=remove; 移除某一元素
//this.insert=insert; 插入某一元素
//this.MoveTo=MoveTo; 將元素進行調整
}複製程式碼
然後我們來實現其所需要的功能
List.prototype.append=function(ele) {
// 往資料中新增元素,並且將List的長度增加1
this.Data.push(ele);
this.length++;
return true;
};
List.prototype.remove= function(ele) {
//獲取要移除元素的索引,然後判斷是否存在,如果在則移除,總長度減1
var pos=this.getIndex(ele);
if(pos>-1){
this.Data.splice(pos,1);
this.length--;
return true;
}else{
return false;
}
};
List.prototype.getIndex=function(target){
//判斷元素是否存在,如果存在就返回其索引
for(var i=0;i<=this.length-1;++i){
if(this.Data[i]==target){return i;}
else{
if(i==this.length-1){return -1;}
}
}
};
List.prototype.insert=function(ele,index){
//判斷要插入的值是否在List總長度內,如果在則插入,不在則直接新增到最後
if(index>this.length){
this.append(ele);
}else{
this.Data.splice(index,0,ele);
this.length++;
}
};
List.prototype.MoveTo=function(pos1,pos2){
//資料的交換,需要考慮到資料的存在性
if(pos1>this.length || pos2>this.length){
//通過判斷pos是否在Data長度之內來做處理
var min=Math.min(pos2,pos1);
var max=Math.max(this.length,min);
if(max==this.length){
var data=this.Data[min];
this.remove(min);
this.append(data);
return true;
}else{
return false;
}
}else{
var ele1=this.Data[pos1];
var ele2=this.Data[pos2];
this.Data[pos2]=ele1;
this.Data[pos1]=ele2;
return true;
}
};
List.prototype.clear=function(){
//資料的清除
this.Data=[];
};
複製程式碼
這時候我們來做測試
var b=new List();
b.append(1);
b.append("heiej");
b.insert(2,1);
b.MoveTo(0,1);
b.remove(1);
output:2 1 heiej
複製程式碼
直到如今,我才明白老師當初為什麼出現錯誤,不是因為因為邏輯錯誤,而是在條件判斷的時候忽略了一些條件的可能性。
有人說故事到這裡就要結束了,誰知道呢,總之吧,希望我的文章可以給你帶來一些感想。
因為平時上課的原因,我會保持每週最少兩更.see you;