标签:数组 12px exp 部分 ber test target https ack
任务:用js写算法,实现一个网页四则运算计算器
效果:
成果链接:codepen@cuphoria
js实现思路:
表达式计算算法:
代码: 1 var expr 2 var clear=false;
3 var token=/[\/\*\-\+]/g; 4 var digit=/[0-9]/; 5 var maxWidth=window.screen.width; 6 var maxHeight=window.screen.height; 7 function best(t)//优先级比较 8 { 9 if(t=="%") return 0; 10 if(t=="+"||t=="-") return 1; 11 if(t=="/"||t=="*") return 2; 12 } 13 function cal(expr) 14 { 15 var num=expr.split(token);//数值分割出字符串成立数组 16 var t=expr.split("");//符号同 17 t=t.filter(function(val) {return !digit.test(val);}); 18 var numarr=[],tarr=[]; 19 tarr.push("%");//定义一个栈顶符号,优先级最低 20 var i=0,j=0; 21 var top=tarr.length; 22 numarr.push(parseInt(num[j],10));//第一个数值先入栈 23 while(top!=1||i!=t.length)//当符号栈只剩下一个符号,所有符号都运算完毕时,退出循环 24 { 25 top=tarr.length-1;//每次更新栈顶长度下标
26 if(best(t[i])>best(tarr[top])) {tarr.push(t[i]);numarr.push(parseInt(num[++j],10));++i;}//比较优先级高时 28 else 29 { 30 var a=numarr[numarr.length-1];//优先级小于等于时 31 var b=numarr[numarr.length-2]; 32 var c; 33 if(tarr[top]=="+") c=a+b; 34 else if(tarr[top]=="-") c=b-a; 35 else if(tarr[top]=="*") c=a*b; 36 else if(tarr[top]=="/") c=b/a; 37 numarr.pop(); 38 numarr.pop(); 39 numarr.push(c); 40 tarr.pop(); 41 } 42 } 43 return numarr[0]; 44 } 45 $(document).ready(function(){ 46 $("body").css({"width":maxWidth}); 47 $("button").click(function(){ 48 if(clear==true){expr=""; clear=false;}//清空 49 var text = $(this).attr("value"); 50 if(token.test(text)||digit.test(text)) 51 {expr+=text;} 52 if(text==="AC"){expr="";} 53 if(text==="CE") {expr=expr.slice(0,-1);} 54 if(text==="="){ 55 expr=cal(expr); 56 clear=true; 57 } 58 $(".textbox").val(expr); 59 }); 60 });
注意:在此算法下如果连输两个符号,只有第一个符号有效,但不会报错,其他错误都会显示not a number
标签:数组 12px exp 部分 ber test target https ack
原文地址:https://www.cnblogs.com/cuphoria/p/9870622.html