最近想做一个画曲线工具,就是根据输入表达式(如: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"));
}
}
以上没涉及函数计算,处理函数也简单,只需要判断括号前边字符串是否是函数,如果是就套入计算。