JavaScript数据结构 (手打代码)
array:
数组创建:
var troop=new Array(); //创建一个长度为6的数组
var troop=new Array(,,,,,);
数组方法:
var str="I love javascript";
var single=str.split(""); //'I',' ','l','o',.....
var mutipy=str.split(" "); //'I','love','javascript' var troop=new Array(2,5,6,8,9,4,1,2);
var index=troop.indexOf(2); //index=0 var names=['jack','mike','molly'];
var str=names.join(); //str='jack,mike,molly' var nums=[];
nums.push(3,4);
nums.shift(1,2); //nums=[1,2,3,4];
nums.pop(); //nums=[1,2,3];
nums.shift(); //nums=[2,3];
nums.splice(0,1,5,6) //nums=[5,6,3];
对数组元素进行操作(不产生新数组)
var nums=[2,4,6,8];
function isEven(num){return num%2==0;}
function square(num){return num*num;}
nums.forEach(square); //对数组所有元素平方
var swit=nums.every(isEven); //判断数组元素是否均为偶数,若是,返回true; 产生新数组:
filter,map 二元数组:
for(var i=0;i<5;i++)
troop[i]=[];
栈和列表其实就是对数组和数组方法的封装,所以我省略不写。
链表:
var linkLIst=function(){
var Node=function(element){
this.element=element;
this.next=null;
};
this.length=0;
this.head=new Node("head"); //定义链表头,长度,同时,定义了四个方法。
this.append=append;
this.insert=insert;
this.remove=remove;
this.display=display; function append(element){
var newNode=new Node(element); //链表在末尾添加新节点,注意的是,node.next仍是node类型,故在添加新节点时要调用节点构造函数
var thisNode=this.head;
this.length++;
if(thisNode.element==null) //在写循环语句或者判断语句的时候要注意,一个空节点是没有element元素的,
{ //因此要先确保thisNode为非空节点,该if判断语句才能正常运行,不然会报错。
thisNode.element=element;
}else{
while(thisNode.next)
{
thisNode=thisNode.next;
}
thisNode.next=newNode;
}
};
function insert(elementbe,element){
var nodebe=this.head;
this.length++;
var insertNode=new Node(element);
while(!(nodebe.element===elementbe)){
nodebe=nodebe.next;
};
var nodeafter=nodebe.next;
nodebe.next=insertNode;
insertNode.next=nodeafter;
};
function remove(element){
var nodeDelete=this.head;
while(!(nodeDelete.next.element===element))
{
nodeDelete=nodeDelete.next;
};
var nodeAfter=nodeDelete.next.next; //next可叠加多次
nodeDelete.next=nodeAfter;
};
function display(){
var thisNode=this.head;
var str="";
while(thisNode){
str+=thisNode.element+" ";
thisNode=thisNode.next;
}
return str;
}
};
var newlist=new linkLIst(); //如果调用构造函数为什么用new不太理解,可以参考上一篇博文我对this的简析
newlist.append("1");newlist.append("2");newlist.append("3");newlist.append("4");newlist.insert("3","5")
var str=newlist.display();
alert(str);
字典:字典类型实际上和数组差不多,但要关注的是,字典类型的键通常为字符串,不是像数组中从0递增,因此,在展示全部元素时与数组有所区别
var myDictionary=function(){
this.dataStore=new Array();
this.add=add;
this.find=find;
this.showAll=showAll;
this.remove=remove;
function add(key,value){
this.dataStore[key]=value;
};
function find(key){
return this.dataStore[key];
};
function remove(key){
delete this.dataStore[key]; //这个方法只删除key对应的值
};
function showAll(){
var arr=new Array(),i=0;
for (var key in this.dataStore) //key实际上是数组里面的元素?
{ //某本书上有错误的范例(var key in Object.keys(this.dataStore)),该语句中key的值为0,1,2,3....故只适用于一般数组
arr[i++]=key+" "+this.dataStore[key];
}
return arr;
};
};
var dict=new myDictionary();
dict.add("one","Mike");dict.add("two","John");dict.add("three","Molly");
var show=dict.showAll();
alert(show);
hash table(散列表):
var hashTable=function(){
this.table=new Array(137); //先定义表的大小,因为后面的哈希值要通过表大小来确定
this.simpleHash=simpleHash; //求得哈希值
this.showDistro=showDistro; //展示所有元素,返回一个字符串
this.put=put; //将新元素加入表中 function simpleHash(data){
var hash=0;
for(var i=0;i<data.length;i++)
{
hash+=data.charCodeAt(i); //函数charCodeAt()返回字符串某个元素的ASC码值,这里用循环得到字符串ASC码值之和
}
return hash % 137; //将码值之和除以表大小,所得余数为键,这样可以确保键的数值大小始终小于表的大小
};
function showDistro(){
var i=0;
str="";
while(i++<this.table.length)
{
if(this.table[i]!=null) //由上面哈希表创建过程可知哈希表有一些键值是未定义的,因此要过滤掉这些元素
{
str+=i+" "+this.table[i]+" .";
}
}
return str;
};
function put(data){
var i=simpleHash(data);
this.table[i]=data;
}; };
var tab=new hashTable();
tab.put("abc");tab.put("sdf");
var output=tab.showDistro();
alert(output);
分析上面代码,可以发现一个问题,两个字符串asc码值之和相同,那么后者会把前者覆盖,这个问题有三种解决方法,一为将hash值转换过程改善,通常采用的是与等比数列相乘,二为在哈希表中创建链表,这样,即使哈希值相同,所有的元素都能展现,三为将后来者往下移,填补到空缺的位置。
function betterHash(data){ //第一种方法。
var hashNum=0; //用betterHash代替原有方法,可以使数据更分散。
for(var i=0;i<data.length;i++){
hashNum=data.charCodeAt(i)+hashNum*37 //注意的是这里要乘一个质数,当然,不同的质数效果不同,实际情况要多次实验?
}
return hashNum;
}
二叉树:
var BST=function(){
this.root=null;
this.add=add;
this.remove=remove;
this.showAll=showAll;
var Node=function(data,left,right){
this.data=data;
this.left=left;
this.right=right;
}; function add(data){
var newNode=new Node(data,null,null)
if(this.root===null){
this.root=newNode;
}else{
var lastNode=this.root;
while(lastNode){
if(data>lastNode.data){ //按数据大小排序
if(lastNode.right!=null){
lastNode=lastNode.right;
}else{
lastNode.right=newNode;return;
}
}else{
if(lastNode.left!=null){
lastNode=lastNode.left;
}else{
lastNode.left=newNode;return;
}
}
};
}
};
function remove(data){
var deleteNode=this.root;
while(deleteNode){
if(deleteNode.data>data){
deleteNode=deleteNode.left;
}else if(deleteNode.data<data){
deleteNode=deleteNode.right;
}else if(deleteNode.data===data){
deleteNode=null;
}
};
};
function putStr(data){
var newInsert=$("<p></p>");
newInsert.html(data);
$("body").append(newInsert);
}; function showAll(Node) {
if (!(Node.data === null)) {
putStr(Node.data); //此句放前为先序,放中间为中序,放后面为后序
if(Node.left!=null){
showAll(Node.left);
}
if(Node.right!=null){
showAll(Node.right);
}
}
return;
};
};
var tt=new BST();
tt.add(2);tt.add(3);tt.add(7);tt.add(1);tt.add(9);tt.add(4);tt.add(5);alert(tt.root.data);
tt.showAll(tt.root);
二叉树的难点是遍历,由于二叉树只有向下通道,而没有向上通道,所以一般采用迭代遍历。
图:图的难点在于深度搜索算法和广度搜索算法的实现
var Graph=function (v){
this.vertices=v; //顶点个数
this.edges=0; //边的条数
this.adj=[];
//下面是深度,广度搜索算法实现的条件,将所有元素先标记为未访问。
this.mark=[];
for(var i=0;i<this.vertices;i++){
this.mark[i]=false;
}
//
for(var i=0;i<this.vertices;i++){
this.adj[i]=[]; //将每个顶点相邻元素放入一个数列,则一共有V个数列,并且,数列长度必小于V
}
this.add=add;
this.showGraph=showGraph;
this.deepSearch=deepSearch;
this.wideSearch=wideSearch;
function add(v,w){
this.adj[v].push(w); //这个图类是无指向性的图。
this.adj[w].push(v);
this.edges++;
};
function putStr(data){
var str=$("#output").html();
str+=data;
$("#output").html(str);
};
function showGraph(){
for(var i=0;i<this.vertices;i++){
putStr(i+" ->");
for(var j=0;j<this.vertices;j++){
if(this.adj[i][j]!=null){
putStr(this.adj[i][j]+" ");
}
}
putStr('|');
}
}; function deepSearch(v){
this.mark[v]=true;
putStr("mark:"+v+"visited!"); //深度搜索算法中,从顶端元素一直探索到最远路径,然后,再探索另一条路径。
alert(this.adj[v]); //实现方法也较为简单,依次递归调用函数取得当前元素相邻、未访问过的元素,这样,可以得到最深的图。
for (var i=0;i<this.adj[v].length;i++){
if(this.mark[this.adj[v][i]]!=true){
this.deepSearch(this.adj[v][i]);
}
}
};
function wideSearch(v){
var queue=[];
queue.push(v);
this.mark[v]=true; for(var i=0;i<this.adj[v].length;i++){ //广度搜索算法中,先遍历与首元素相邻的元素,再遍历与这些元素相邻的元素,用队列可以完美解决这个问题,先将一级相邻元素
if(this.mark[this.adj[v][i]]!=true){ //放入队列中,然后挨个取出队列元素,将队列元素的相邻元素也放入队列中。
queue.push(this.adj[v][i]);
alert("push"+" "+this.adj[v][i]);
this.mark[this.adj[v][i]]=true;
}
}
putStr(queue.shift());
if(queue[0]!=null){
var out=queue.shift();
this.wideSearch(out);
}
};
};
JavaScript数据结构 (手打代码)的更多相关文章
- 学习javascript数据结构(三)——集合
前言 总括: 本文讲解了数据结构中的[集合]概念,并使用javascript实现了集合. 原文博客地址:学习javascript数据结构(三)--集合 知乎专栏&&简书专题:前端进击者 ...
- 学习javascript数据结构(二)——链表
前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...
- 学习javascript数据结构(一)——栈和队列
前言 只要你不计较得失,人生还有什么不能想法子克服的. 原文地址:学习javascript数据结构(一)--栈和队列 博主博客地址:Damonare的个人博客 几乎所有的编程语言都原生支持数组类型,因 ...
- javascript数据结构与算法--高级排序算法
javascript数据结构与算法--高级排序算法 高级排序算法是处理大型数据集的最高效排序算法,它是处理的数据集可以达到上百万个元素,而不仅仅是几百个或者几千个.现在我们来学习下2种高级排序算法-- ...
- javascript数据结构与算法-- 二叉树
javascript数据结构与算法-- 二叉树 树是计算机科学中经常用到的一种数据结构.树是一种非线性的数据结构,以分成的方式存储数据,树被用来存储具有层级关系的数据,比如文件系统的文件,树还被用来存 ...
- javascript数据结构与算法--散列
一:javascript数据结构与算法--散列 一:什么是哈希表? 哈希表也叫散列表,是根据关键码值(key,value)而直接进行访问的数据结构,它是通过键码值映射到表中一个位置来访问记录的,散列 ...
- javascript数据结构与算法---队列
javascript数据结构与算法---队列 队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素.队列用于存储按顺序排列的数据,先进先出,这点和栈不一样(后入先出).在栈中,最后入栈的元素 ...
- javascript数据结构与算法---栈
javascript数据结构与算法---栈 在上一遍博客介绍了下列表,列表是最简单的一种结构,但是如果要处理一些比较复杂的结构,列表显得太简陋了,所以我们需要某种和列表类似但是更复杂的数据结构---栈 ...
- javascript数据结构与算法---列表
javascript数据结构与算法---列表 前言:在日常生活中,人们经常要使用列表,比如我们有时候要去购物时,为了购物时东西要买全,我们可以在去之前,列下要买的东西,这就要用的列表了,或者我们小时候 ...
- Javascript 语言精粹 代码片段合集
Javascript 语言精粹 代码片段合集 标签:Douglas-Crockford Javascript 最佳实践 原文链接 更好的阅读体验 使用一个method 方法定义新方法 Function ...
随机推荐
- slave延迟很大优化方法
一般而言,slave相对master延迟较大,其根本原因就是slave上的复制线程没办法真正做到并发.简单说,在master上是并发模式(以InnoDB引擎为主)完成事务提交的,而在slave上,复制 ...
- 【读书笔记】【深入理解ES6】#8-迭代器(Iterator)和生成器(Generator)
循环语句的问题 var colors = ["red", "green", "blue"]; for (var i = 0, len = c ...
- Setup Automapper in ASP.NET Core
1.添加Nuget Package Install-Package AutoMapper.Extensions.Microsoft.DependencyInjection 2.修改Startup.cs ...
- js实现黑客帝国文字下落效果
突然想到这个效果便想实现以下. 当然免不了要百度一下,于是查找到 http://www.cnblogs.com/myvin/p/4775152.html这篇文章, 效果可以查看博文中的给出的效果图.那 ...
- Node.js学习笔记(三): 事件机制
大部分的nodejs核心api都建立在异步的事件驱动架构之上,所以events是Node.js 最重要的模块,它提供了唯一的接口.events 模块不仅用于用户代码与 Node.js 下层事件循环的交 ...
- python高精度浮点型计算的诡异错误
>>> from decimal import Decimal >>> a=Decimal(100.1) >>> b=Decimal(100.1) ...
- 【WC2013】糖果公园
Candyland 有一座糖果公园,公园里不仅有美丽的风景.好玩的游乐项目,还有许多免费糖果的发放点,这引来了许多贪吃的小朋友来糖果公园玩. 糖果公园的结构十分奇特,它由 nn 个游览点构成,每个游览 ...
- Vjios P1736 铺地毯【暴力,思维】
铺地毯 描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有n张地毯,编号从1到n.现在将这些地毯按照编号从小到大的顺序平行于坐标轴 ...
- 以太坊RPC机制与API实例
上一篇文章介绍了以太坊的基础知识,我们了解了web3.js的调用方式是通过以太坊RPC技术,本篇文章旨在研究如何开发.编译.运行与使用以太坊RPC接口. 关键字:以太坊,RPC,JSON-RPC,cl ...
- linux下python2升级python3,python2和python3并存
wget https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz 解压:tar -xzvf Python-3.6.4.tgz cd Pytho ...