/**
* 计算逆波兰表达式的值
*/
function calculate(RPolishArray){
var result = 0;
var tempArray = new Array(100);
var tempNum = -1;
for(i = 0;i < RPolishArray.length;i++){
if(RPolishArray[i].match(/\d/)){
tempNum++;
tempArray[tempNum] = RPolishArray[i];
}else{
switch(RPolishArray[i]){
case '+':
result = (tempArray[tempNum-1] *1) + (tempArray[tempNum] * 1);
tempNum--;
tempArray[tempNum] = result;
break;
case '-':
result = (tempArray[tempNum-1] *1) - (tempArray[tempNum] * 1);
tempNum--;
tempArray[tempNum] = result;
break;
case '*':
result = (tempArray[tempNum-1] *1) * (tempArray[tempNum] * 1);
tempNum--;
tempArray[tempNum] = result;
break;
case '/':
result = (tempArray[tempNum-1] *1) / (tempArray[tempNum] * 1);
tempNum--;
tempArray[tempNum] = result;
break;
}
}
}
result = tempArray[tempNum];
return result;
}
/**
* 把普通算术表达式转换为逆波兰表达式
*/
function toRPolish(input){
var regex = /(\(|\)|\+|\-|\*|\/)+/;
var array = input.split(regex);
var RPolish = ""
var isI = false;
num = 0;
var SymbolArray = new Array(100);
var SymbolNum = -1;
for(j = 0;j < input.length;j++){
if(input.charAt(j).match(/\d/)){
if(isI == false){
RPolish += ','
RPolish += array[num];
num++;
isI = true;
}
}
else{
if(SymbolNum == -1){
SymbolNum++;
SymbolArray[SymbolNum] = input.charAt(j);
}else{
if(input.charAt(j).match(/\(/) || SymbolArray[SymbolNum].match(/\(/)){
SymbolNum++;
SymbolArray[SymbolNum] = input.charAt(j);
}else if(input.charAt(j).match(/\)/)){
while(!SymbolArray[SymbolNum].match(/\(/)){
RPolish += ',';
RPolish += SymbolArray[SymbolNum];
SymbolNum--;
}
SymbolNum--;
}else if(compare(input.charAt(j),SymbolArray[SymbolNum])){
SymbolNum++;
SymbolArray[SymbolNum] = input.charAt(j);
}else if(!compare(input.charAt(j),SymbolArray[SymbolNum])){
RPolish += ',';
RPolish += SymbolArray[SymbolNum];
SymbolNum--;
if(SymbolNum >= 0){
if(SymbolArray[SymbolNum].match(/\(/)){
SymbolNum++;
SymbolArray[SymbolNum] = input.charAt(j);
}else if(!compare(input.charAt(j),SymbolArray[SymbolNum])){
RPolish += ',';
RPolish += SymbolArray[SymbolNum];
SymbolArray[SymbolNum] = input.charAt(j);
}else{
SymbolNum++;
SymbolArray[SymbolNum] = input.charAt(j);
}
}else{
SymbolNum++;
SymbolArray[SymbolNum] = input.charAt(j);
}
}
}
isI = false;
}
}
while(SymbolNum >=0){
RPolish += ',';
RPolish += SymbolArray[SymbolNum];
SymbolNum--;
}
regex = /,/;
var RPolishArray = RPolish.split(regex);
return RPolishArray;
}
function compare(a,b){
if((a.match(/\*/)||a.match(/\//))&&(b.match(/\+/)||b.match(/\-/))){
return true;
}else{
return false;
}
}