as解析字符串表达式,四则运算(2)

1.as解析字符串表达式,四则运算结果。

2.传入字符串表达式infix.如:“(2-8/4-7*2)/3“

3.返回计算后的结果,String类型。

private function evalString(infix:String):String{ var opArray:Array = new Array(); //栈底标记 opArray[0] = '@'; var op:Number = 1; var postfix:Array = new Array(); var post:Number = 0; //保存计算结果 var res:Number = 0; var i, j; var tempString:String = new String(); //计算两个数 function Caculate(opSign:String) { if (opSign == '+') { res = postfix[post-2]+postfix[post-1]; } else if (opSign == '-') { res = postfix[post-2]-postfix[post-1]; } else if (opSign == '*') { res = postfix[post-2]*postfix[post-1]; } else if (opSign == '/') { if (!postfix[post-1]) { trace("Expression Error!"); } else { res = postfix[post-2]/postfix[post-1]; } } postfix[post-1] = 0; postfix[post-2] = res; post--; } //扫描中缀表达式 for (i=0; i<infix.length; i++) { switch (infix.charAt(i)) { //左括号就直接入栈 case '(' : opArray[op] = infix.charAt(i); op++; break; //右括号则退栈计算,直到遇见一个左括号 case ')' : for (j=op-1; j>0; j--) { if (opArray[j] != '(') { Caculate(opArray[j]); opArray[j] = '#'; } else { opArray[j] = '#'; break; } } op = j; break; case '*' : case '/' : //如果栈顶的运算符为*或/,则先退栈,再入栈,否则直接入栈 if (opArray[op-1] == '*') { op--; Caculate(opArray[op]); opArray[op] = '#'; } else if (opArray[op-1] == '/') { op--; Caculate(opArray[op]); opArray[op] = '#'; } opArray[op] = infix.charAt(i); op++; break; case '+' : case '-' : //如果栈顶的运算符不是左括号也不是栈底,则先退栈计算,再入栈 if (opArray[op-1] != '(' && opArray[op-1] != '@') { op--; Caculate(opArray[op]); opArray[op] = '#'; } opArray[op] = infix.charAt(i); op++; break; default : //如果是数字字符或者小数点则转化为数字存入数组 //如果下一个字符是运算符则把当前数字存入数组 tempString += infix.charAt(i); var temp:String = new String(); temp = infix.charAt(i+1); if (temp != '.' && (temp>'9' || temp<'0')) { postfix[post] = parseFloat(tempString); post++; tempString = ""; } //trace(postfix); } } //扫描完成,全部退栈 for (j=op-1; j>0; j--) { if (opArray[j] != '@') { Caculate(opArray[j]); opArray[j] = '#'; } else { break; } } //返回结果 return postfix[0]; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值