数据结构(Javascript版)

正在学习数据结构,学的是C语言版的,把里面的例子用Javascript实现了一遍,如果有什么错误的话欢迎提出(持续更新)。

完整代码:https://github.com/CJWbiu/Data_structure  

一、线性表

  1. 一般线性表合并:演示

    

 1  function addList(la,lb){
 2             var arrA=[],arrB=[];    //声明两个线性表
 3             
 4             //获取输入值
 5             arrA=la.value.split(',').map(function(item){return parseInt(item);});
 6             arrB=lb.value.split(',').map(function(item){return parseInt(item);});
 7             
 8             for(let i=0;i<arrB.length;i++){//取arrB中的第i个数字与arrA比较
 9                 for(var j=0;j<arrA.length;j++){
10                     if(arrB[i]==arrA[j]){
11                         break;
12                     }
13                 }
14                 if(j==arrA.length){//如果arrA中不存在arrB[i]将arrB[i]插入arrA中
15                     arrA.push(arrB[i]);
16                   
17                 }
18             }
19             
20             return arrA.join(',');
21         }

 

    2.有序线性表合并:演示

      

 1 function merge(la,lb){
 2             var arrA=la.value.split(',').map(function(item){return parseInt(item);});
 3             var arrB=lb.value.split(',').map(function(item){return parseInt(item);});
 4             var arrC=[],i=0,j=0;//arrC为合并后数组
 5             while((i<arrA.length)&&(j<arrB.length)){//当其中一个表遍历完则跳出循环
 6                 
 7                 if(arrA[i]<=arrB[j]){//依次摘取两表中较小的数插入到arrC中
 8                     
 9                     arrC.push(arrA[i]);
10                     i++;
11                 }else{
12                     console.log('b')
13                     arrC.push(arrB[j]);
14                     j++;
15                 }
16             }
17           
18             while(i<arrA.length){//arrB已遍历完,将arrA剩下的依次插入到arrC中
19                 arrC.push(arrA[i]);
20                 i++;
21             }
22             while(j<arrB.length){//arrA已遍历完,将arrB剩下的依次插入到arrC中
23                 arrC.push(arrB[j]);
24                 j++;
25             }
26             return arrC.join(',');
27          }

二、栈和队列:

  1.数制转换:演示

    

function transform(n,d){//输入十进制数n和需要转换的进制d
           var stack=[];//声明一个数组模拟栈
           while(n){    //每次将n%d入栈,再将n替换成n/d
               var m;
               if(d===16){//如果是16进制进行匹配
                   
                   switch(n%d){
                       case 10:m='a';break;
                       case 11:m='b';break;
                       case 12:m='c';break;
                       case 13:m='d';break;
                       case 14:m='e';break;
                       case 15:m='f';break;
                       default:m=n%d;break;
                   }
                   
               }else{
                   m=n%d;
               }
               stack.push(m);
               n=Math.floor(n/d);    //javascript中‘/’为除法运算,并非取整
           }
           
           return stack.reverse().join('');
       }

  2.括号匹配:演示

    

 1 function check(str){//传入需要检测的字符串
 2         var flag=1,stack=[];
 3 
 4         for(var i=0;i<str.length;i++){遍历字符串,检测每一个字符
 5           
 6           switch(str[i]){
 7             case '[':  
 8             case '(':
 9             case '{':stack.push(str[i]);break;//如果是[、(、{则入栈
10              //如果是]、)、}中的任意一个则判断栈顶元素是否与之匹配
11              //如果匹配则将栈顶元素出栈,否则报错,将flag设为0
12             case ')':if(stack[stack.length-1]=='('){
13             
14               stack.pop();
15               break;
16             }else{
17               flag=0;
18               break;
19             };
20             case ']':if(stack[stack.length-1]=='['){ //如果不于栈顶元素相匹配则错误
21               stack.pop();
22               break;
23             }else{
24               flag=0;
25               break;
26             };
27             case '}':if(stack[stack.length-1]=='{'){
28               stack.pop();
29               break;
30             }else{
31               flag=0;
32               break;
33             }
34           }
35 
36           if(!flag){break;};
37         }
38 
39         return flag;
40        }

   3.Fibonacci数列:

    递归版:演示

 1 function fib(n){//输入下标
 2         var result=0;
 3         if(n==0){    //数列第一个为0,第二个为1
 4           result=0;
 5         }else if(n==1){
 6           result=1;
 7         }else{
 8           result=fib(n-1)+fib(n-2);//从第三个开始,每个都等于前两个数之和
 9         }
10 
11         return result;    //返回指定下标对应的值
12        }

    非递归版:演示

 1 function fib(n){
 2         var f0=0,f1=1,f2,i;//数列前两个分别为0和1
 3         if(n==0){//如果n为0或1,则返回0或1
 4           return 0;
 5         }else if(n==1){
 6           return 1;
 7         }else{
 8           for(i=2;i<=n;i++){//从第2个开始遍历,每个都等于前两项之和
 9             f2=f0+f1;
10             f0=f1;//每遍历一个改变f1和f0的值,相当于他们所指的fib数列下标后移一位
11             f1=f2;
12           }
13         }
14         return f2;
15        }

  4.hanoi塔:演示  (打开控制台)

    

 1 function hanoi(n,A,B,C){
 2            
 3            if(n==1){
 4                move(1,A,C);    //将编号为1的圆盘从A柱移至C柱
 5                
 6                
 7            }else{
 8                hanoi(n-1,A,C,B);    //将n-1个从A移至B
 9                move(1,A,C);//将编号为n的圆盘移到C
10                
11                
12                hanoi(n-1,B,A,C); //将n-个圆盘从B移到C
13            }
14        }
15        function move(n,x,y){
16            console.log("将一个圆盘从"+x+"柱移到"+y+"柱");
17 
18        }

   5.杨辉三角形:演示

 1 function yanghui(n){
 2         var arr=[1,1],s=0,i,j,str='',t=0;//s为用于计算的一个辅助值,t为每次累加的起始位置
 3         for(i=1;i<n;i++){ //逐行计算
 4           arr.push(0);  //每行末尾添加一个0
 5           for(j=1;j<=i+2;j++){
 6             arr.push(s+arr[t]); //每两位相加等于下一行的数
 7             s=arr[t];//将s代表的位置进一位
 8             t++;
 9           }
10     
11         }
12         str='<p>'+arr.map(function(item){
13           if(item==0){
14             item="</p><p>";//匹配到0则换行;
15           }
16           return item;
17         }).join(' ')+'</p>';
18         return str;
19       }

 

posted @ 2017-09-17 23:45  法克大叔叔  阅读(489)  评论(0)    收藏  举报