数据结构(Javascript版)
正在学习数据结构,学的是C语言版的,把里面的例子用Javascript实现了一遍,如果有什么错误的话欢迎提出(持续更新)。
完整代码:https://github.com/CJWbiu/Data_structure
一、线性表
- 一般线性表合并:演示
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 }

浙公网安备 33010602011771号