calc.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. var Stack = function(){}
  2. Stack.prototype={
  3. Init:function(){
  4. this.STACKMAX = 100;
  5. this.stack = new Array(this.STACKMACK);
  6. this.top = -1;
  7. return this.stack;
  8. },
  9. isEmpty:function(){
  10. if(this.top==-1){
  11. return true;
  12. }
  13. else{
  14. return false;
  15. }
  16. },
  17. push:function(elem){
  18. if(this.top==this.STACKMAX-1){
  19. return "栈满";
  20. }
  21. else{
  22. this.top++;
  23. this.stack[this.top] = elem;
  24. }
  25. },
  26. pop:function(){
  27. if(this.top==-1){
  28. return "空栈,无法删除栈顶元素!";
  29. }
  30. else{
  31. var x = this.stack[this.top];
  32. this.top--;
  33. return x;
  34. }
  35. },
  36. peek:function(){
  37. if(this.top!=-1){
  38. return this.stack[this.top];
  39. }
  40. else{
  41. return "空栈,顶元素无返回值!";
  42. }
  43. },
  44. Clear:function(){
  45. this.top=-1;
  46. },
  47. Length:function(){
  48. return this.top+1;
  49. }
  50. }
  51. function toRPolish(s){
  52. var list=new Array();
  53. var op=new Stack();
  54. op.Init();
  55. //var num=str.match(/\d+(\.\d+)?/g);
  56. var i=0;
  57. while(i<s.length){
  58. var c=s.charAt(i);
  59. if(c>='0'&&c<='9'){
  60. var s1=s.substr(i);
  61. var m=s1.match(/\d+(\.\d+)?/g);
  62. if (m.length>0){
  63. s1=m[0];
  64. list.push(s1);
  65. }
  66. i=i+s1.length;
  67. continue;
  68. }else if(c=='('){
  69. op.push(c);
  70. }else if(c==')'){
  71. var p=op.pop();
  72. while(p!='('){
  73. list.push(p);
  74. p=op.pop();
  75. }
  76. }else if(c=='+'||c=='-'){
  77. while(!op.isEmpty()&&(op.peek()=='+'||op.peek()=='-'||op.peek()=='×'||op.peek()=='÷')){
  78. list.push(op.pop());
  79. }
  80. op.push(c);
  81. }else if(c=='×'||c=='÷'){
  82. while(!op.isEmpty()&&(op.peek()=='×'||op.peek()=='÷')){
  83. list.push(op.pop());
  84. }
  85. op.push(c);
  86. }
  87. i++;
  88. }
  89. while(!op.isEmpty()){
  90. list.push(op.pop());
  91. }
  92. return list;
  93. }
  94. function g(a,b,c){
  95. var v=0;
  96. a=parseFloat(a);
  97. b=parseFloat(b);
  98. switch (c){
  99. case '+':
  100. v=floatAdd(a,b);
  101. break;
  102. case '-':
  103. v=floatSub(a,b);;
  104. break;
  105. case '×':
  106. v=floatMul(a,b);;
  107. break;
  108. case '÷':
  109. v=floatDiv(a,b);;
  110. break;
  111. }
  112. return v;
  113. }
  114. function getResult(list,result){
  115. for (var i=0;i<list.length;i++){
  116. if(!isNaN(list[i])){
  117. result.push(list[i]);
  118. }else{
  119. var b=result.pop();
  120. var a=result.pop();
  121. var v=g(a,b,list[i]);
  122. result.push(v);
  123. }
  124. }
  125. return result.pop();
  126. }
  127. function calculate(input){
  128. console.log(input);
  129. var list=toRPolish(input);
  130. console.log(list);
  131. var result=new Stack();
  132. result.Init();
  133. return getResult(list, result);
  134. }
  135. //浮点数加法运算
  136. function floatAdd(arg1,arg2){
  137. var r1,r2,m;
  138. try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
  139. try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
  140. m=Math.pow(10,Math.max(r1,r2));
  141. return (arg1*m+arg2*m)/m;
  142. }
  143. //浮点数减法运算
  144. function floatSub(arg1,arg2){
  145. var r1,r2,m,n;
  146. try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
  147. try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
  148. m=Math.pow(10,Math.max(r1,r2));
  149. //动态控制精度长度
  150. n=(r1=r2)?r1:r2;
  151. return ((arg1*m-arg2*m)/m).toFixed(n);
  152. }
  153. //浮点数乘法运算
  154. function floatMul(arg1,arg2){
  155. var m=0,s1=arg1.toString(),s2=arg2.toString();
  156. try{m+=s1.split(".")[1].length}catch(e){}
  157. try{m+=s2.split(".")[1].length}catch(e){}
  158. return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m);
  159. }
  160. //浮点数除法运算
  161. function floatDiv(arg1,arg2){
  162. var t1=0,t2=0,r1,r2;
  163. try{t1=arg1.toString().split(".")[1].length}catch(e){}
  164. try{t2=arg2.toString().split(".")[1].length}catch(e){}
  165. r1=Number(arg1.toString().replace(".",""));
  166. r2=Number(arg2.toString().replace(".",""));
  167. return (r1/r2)*Math.pow(10,t2-t1);
  168. }
  169. module.exports = {
  170. calculate:calculate
  171. }