Android画曲线之字符串运算

       最近想做一个画曲线工具,就是根据输入表达式(如:y=3*x ) 画曲线。首先遇到的问题是如何将字符串表达式运算求值,如这样一个表达式:   String    expression="1-(3*(5-3)+4/2)-3*cos(PI-PI/2)";如何运算呢?

       观察发现,每个括号()内都是一个小的表达式,首先要算出最小括号里的表达式值,才能运算较大括号里的表达式值,然后才能运算最大括号的表达式....最后才能运算整个表达式,这不就是递归么,跳出递归的条件是子表达式没有括号。 

直接上代码吧.

 

/**
 * 运算器
 * @author Saber
 *
 */
public class Calculator {

	//运算符
	private static  enum Operator{
		add,sub,mutip,div;		
		 public static Operator getOperator(String operator){
			if(operator.equals("+")){
				return add;
			}else
			if(operator.equals("-")){
				return sub;
			}else
			if(operator.equals("*")){
				return mutip;
			}else
			if(operator.equals("/")){
				return mutip;
			}
			return null;
		}
		
	}
	//函数
	private final String[] functions={"cos","sin"};
	//表达式变量
	private final String[] params={"x"};
	
	
	//递归计算
	public static float calculate(String expression){
		String  noBracketExp="";//无括号的表达式
		String  subExp="";//括号内的子表达式
		for(int i=0;i<expression.length();i++){
			String c=String.valueOf(expression.charAt(i));
			if("(".equals(c)){//遇到括号就递归
				int bracket=0;
				for(int j=i+1;j<expression.length();j++){
					i++;
					c=String.valueOf(expression.charAt(j));
					if(c.equals("("))bracket++;else if(c.equals(")")) bracket--;
					if(bracket==-1)break;
					subExp+=c;
				}
				noBracketExp+=calculate(subExp);
				subExp="";
			}else noBracketExp+=c;
		}
		
		return szys(noBracketExp);
	}
		
	//是否是乘除运算符
	private static boolean isMutipOrDivideOperator(String operator){
		return Operator.getOperator(operator)==Operator.mutip||Operator.getOperator(operator)==Operator.div;
	}
		
	//简单四则运算,输入的表达式没有括号
	private static float szys(String expression){
		expression=expression.replaceAll("\\-", "+-");
		String[] exps=expression.split("\\+");//视表达式为积之和
		float result=0;
		for(String exp:exps){
			result+=multipAndDivide(exp);
		}
		
		return result;
	}
	
	//乘除运算
	private static float multipAndDivide(String exp){
		exp+="*1";//因为遇到运算符才计算,所以多加一个运算符,不影响结果。
		String p1="";
		String p2="";
		String operator="";
		for(int i=0;i<exp.length();i++){
			String s=String.valueOf(exp.charAt(i));
			if(isMutipOrDivideOperator(s)){//乘除运算符
				operator=s;
				if(operator.length()>0&&p1.length()>0&&p2.length()>0){
					p1=szys(Float.valueOf(p1),operator,Float.valueOf(p2))+"";
					p2="";
				}
			}else if(operator.length()==0){
				p1+=s;
			}else{
				p2+=s;
			}
		}
		
		return Float.valueOf(p1);
	}
	
	//两个数进行四则运算
	private static float szys(float p1,String operator,float p2){
		if(operator.equals("+")){
			return p1+p2;
		}else if(operator.equals("-")){
			return p1-p2;
		}else if(operator.equals("*")){
			return p1*p2;
		}else if(operator.equals("/")){
			if(p2==0)return 0;else return p1/p2;
		}else return 0;
	}
	
	
	public static void main(String[] args){
		System.out.println(szys(10,"+",10));
		System.out.println(multipAndDivide("-3*3"));
		System.out.println(szys("10-2*2/2+4*2/2"));
		System.out.println(calculate("10-2*(5*2-2*(4-2)+4)+2"));
	}

	
	
}

 

 

以上没涉及函数计算,处理函数也简单,只需要判断括号前边字符串是否是函数,如果是就套入计算。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值