山鬼的資料結構坑(初篇)

山鬼發表於2017-11-12
世上焉有無雙數,萬般玄機誰可知,我本杯中一浮游,何來笑談青蓮久

                                                                                                                       --山鬼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;


相關文章