山鬼的数据结构坑(初篇)

1,268 阅读4分钟
世上焉有无双数,万般玄机谁可知,我本杯中一浮游,何来笑谈青莲久

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