| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- function isOperator(value) {
- var operatorString = '+-*/()×÷';
- return operatorString.indexOf(value) > -1;
- }
- function getPrioraty(value) {
- if(value == '-' || value == '+') {
- return 1;
- } else if(value == '*' || value == '/' || value == '×' || value == '÷' ) {
- return 2;
- } else{
- return 0;
- }
- }
- function prioraty(v1, v2) {
- return getPrioraty(v1) <= getPrioraty(v2);
- }
- function outputRpn(exp) {
- var inputStack = [];
- var outputStack = [];
- var outputQueue = [];
- var firstIsOperator = false;
- exp.replace(/\s/g,'');
- if(isOperator(exp[0])){
- exp = exp.substring(1);
- firstIsOperator = true;
- }
- for(var i = 0, max = exp.length; i < max; i++) {
- if(!isOperator(exp[i]) && !isOperator(exp[i-1]) && (i != 0)) {
- inputStack[inputStack.length-1] = inputStack[inputStack.length-1] + exp[i] + '';
- } else {
- inputStack.push(exp[i]);
- }
- }
- if(firstIsOperator) {
- inputStack[0] = -inputStack[0]
- }
- while(inputStack.length > 0) {
- var cur = inputStack.shift();
- if(isOperator(cur)) {
- if (cur == '(') {
- outputStack.push(cur);
- } else if (cur == ')') {
- var po = outputStack.pop();
- while(po != '(' && outputStack.length > 0) {
- outputQueue.push(po);
- po = outputStack.pop();
- }
- } else {
- while(prioraty(cur,outputStack[outputStack.length - 1]) && outputStack.length > 0) {
- outputQueue.push(outputStack.pop());
- }
- outputStack.push(cur)
- }
- } else {
- outputQueue.push(Number(cur));
- }
- }
- if(outputStack.length > 0){
- while (outputStack.length > 0) {
- outputQueue.push(outputStack.pop());
- }
- }
- return outputQueue;
- }
- function calRpnExp(rpnArr) {
- var stack = [];
- for(var i = 0, max = rpnArr.length; i < max; i++) {
- if(!isOperator(rpnArr[i])) {
- stack.push(rpnArr[i]);
- } else {
- var num1 = stack.pop();
- var num2 = stack.pop();
- if(rpnArr[i] == '-') {
- var num = num2 - num1;
- } else if(rpnArr[i] == '+') {
- var num = num2 + num1;
- } else if(rpnArr[i] == '*' || rpnArr[i] == '×') {
- var num = num2 * num1;
- } else if(rpnArr[i] == '/' || rpnArr[i] == '÷') {
- var num = num2/num1;
- }
- stack.push(num);
- }
- }
- return stack[0];
- }
- export function calCommonExp(exp) {
- var rpnArr = outputRpn(exp);
- return calRpnExp(rpnArr)
- }
|