表达式求值

var	 operate={
			'gcd':{fun:function(a,b){return b==0?a:arguments.callee(b,a%b);},precedence:9,isPrefix:true},
			'+u':{fun:function(a){return a;},precedence:9,isPrefix:true},
			'-u':{fun:function(a){return -a;},precedence:9,isPrefix:true},
			'+':{fun:function(a,b){return a+b;},precedence:6,isPrefix:false},
			'-':{fun:function(a,b){return a-b;},precedence:6,isPrefix:false},
			'*':{fun:function(a,b){return a*b;},precedence:8,isPrefix:false},
			'/':{fun:function(a,b){return a/b;},precedence:8,isPrefix:false}
			};
function getResult(){

	var input = document.myform.inputText.value
	var RPolishArray =[];
	RPolishArray = toRPolish(input);
	document.myform.RPolish.value = RPolishArray;
	var result = calculate(RPolishArray);
	document.myform.sunText.value = result;

}
/**
* 计算逆波兰表达式的值
*/

			
function calculate(RPolishArray){
	var item='';
	var stack =[];

	for(var i = 0;i < RPolishArray.length;i++){
		item=RPolishArray[i];
		if((/\d/).test(item)){
			
			stack.push(item*1);
		}else if(item in operate){
			var len=operate[item].fun.length;
			args=stack.splice(stack.length-len,len);
			stack.push(operate[item].fun.apply(null,args));
			}
	}	
	return stack.pop();
}

/**
* 把普通算术表达式转换为逆波兰表达式
*/
function toRPolish(input){   
    var token=null;
    isUnary=true;
 //   ([0-9]+|[*+-\/()])/
    var tokens=input.match(/(?![a-zA-Z_])\d+\.?\d*|[*+-\/(),]|\w+/g);
    var output = [];  
    var opStack = [];  
    for(var i = 0;i < tokens.length;i++){ 
	var lastToken=token;
	var token=tokens[i];
	if(isUnary){token=token=='-'?'-u':token; token=token=='+'?'+u':token;}
	isUnary=false;
        if(token.match(/\d+\.\d+|\d+/)){  

                output.push(token);  
 

        }  
	else  if(token=='('){  
			isUnary=true;
                        opStack.push(token);  
        }  
	else if(token==')'){  
                    while(opStack[opStack.length-1]!='('){  
                        if(opStack.length==0)throw("括号不匹配");
			output.push(opStack.pop());  

                    }  
                
		//    if(opStack[opStack.length-1]=='(' )
                      opStack.pop();
	}
	else if(token==','){  
                    while(opStack[opStack.length-1]!='('){  
                        if(opStack.length==0)throw("括号不匹配");
			output.push(opStack.pop());  

                    }  
                
	}	
	else if( token in operate){ 
		isUnary=true;
		
		while(opStack.length&&
			opStack[opStack.length-1]!='('&&
			(!operate[token].isPrefix && operate[token].precedence <= operate[opStack[opStack.length-1]].precedence ||
			operate[token].isPrefix && operate[token].precedence < operate[opStack[opStack.length-1]].precedence)
			){  
				output.push(opStack.pop());  
		}  
			opStack.push(token);
	}
	else {
		throw(token+"未定义此函数");
	
	}
                  

    }             
    while(opStack.length >0){  
        output.push(opStack.pop());  
    }  
 
    return output;  
} 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值