rpn.js 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. function isOperator(value) {
  2. var operatorString = '+-*/()×÷';
  3. return operatorString.indexOf(value) > -1;
  4. }
  5. function getPrioraty(value) {
  6. if(value == '-' || value == '+') {
  7. return 1;
  8. } else if(value == '*' || value == '/' || value == '×' || value == '÷' ) {
  9. return 2;
  10. } else{
  11. return 0;
  12. }
  13. }
  14. function prioraty(v1, v2) {
  15. return getPrioraty(v1) <= getPrioraty(v2);
  16. }
  17. function outputRpn(exp) {
  18. var inputStack = [];
  19. var outputStack = [];
  20. var outputQueue = [];
  21. var firstIsOperator = false;
  22. exp.replace(/\s/g,'');
  23. if(isOperator(exp[0])){
  24. exp = exp.substring(1);
  25. firstIsOperator = true;
  26. }
  27. for(var i = 0, max = exp.length; i < max; i++) {
  28. if(!isOperator(exp[i]) && !isOperator(exp[i-1]) && (i != 0)) {
  29. inputStack[inputStack.length-1] = inputStack[inputStack.length-1] + exp[i] + '';
  30. } else {
  31. inputStack.push(exp[i]);
  32. }
  33. }
  34. if(firstIsOperator) {
  35. inputStack[0] = -inputStack[0]
  36. }
  37. while(inputStack.length > 0) {
  38. var cur = inputStack.shift();
  39. if(isOperator(cur)) {
  40. if (cur == '(') {
  41. outputStack.push(cur);
  42. } else if (cur == ')') {
  43. var po = outputStack.pop();
  44. while(po != '(' && outputStack.length > 0) {
  45. outputQueue.push(po);
  46. po = outputStack.pop();
  47. }
  48. } else {
  49. while(prioraty(cur,outputStack[outputStack.length - 1]) && outputStack.length > 0) {
  50. outputQueue.push(outputStack.pop());
  51. }
  52. outputStack.push(cur)
  53. }
  54. } else {
  55. outputQueue.push(Number(cur));
  56. }
  57. }
  58. if(outputStack.length > 0){
  59. while (outputStack.length > 0) {
  60. outputQueue.push(outputStack.pop());
  61. }
  62. }
  63. return outputQueue;
  64. }
  65. function calRpnExp(rpnArr) {
  66. var stack = [];
  67. for(var i = 0, max = rpnArr.length; i < max; i++) {
  68. if(!isOperator(rpnArr[i])) {
  69. stack.push(rpnArr[i]);
  70. } else {
  71. var num1 = stack.pop();
  72. var num2 = stack.pop();
  73. if(rpnArr[i] == '-') {
  74. var num = num2 - num1;
  75. } else if(rpnArr[i] == '+') {
  76. var num = num2 + num1;
  77. } else if(rpnArr[i] == '*' || rpnArr[i] == '×') {
  78. var num = num2 * num1;
  79. } else if(rpnArr[i] == '/' || rpnArr[i] == '÷') {
  80. var num = num2/num1;
  81. }
  82. stack.push(num);
  83. }
  84. }
  85. return stack[0];
  86. }
  87. export function calCommonExp(exp) {
  88. var rpnArr = outputRpn(exp);
  89. return calRpnExp(rpnArr)
  90. }