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、付费专栏及课程。

余额充值