最近想做一个画曲线工具,就是根据输入表达式(如: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"));
}
}
以上没涉及函数计算,处理函数也简单,只需要判断括号前边字符串是否是函数,如果是就套入计算。
分享到:
相关推荐
在Android平台上,开发一个能处理字符串运算的计算器是一项挑战性的任务。这个计算器应用程序允许用户输入一个完整的数学表达式,如 "2 + 3 * (4 - 5)",然后通过字符串解析和运算来得出结果。以下是一些关于实现...
"Android存储字符串数据到txt文件" Android存储字符串数据到txt文件是Android开发中的一种常见需求,对于大多数开发者来说,存储字符串数据到txt文件是一种非常有用的功能。今天,我们将详细介绍如何在Android中...
### Matlab中的字符串运算 在Matlab这一强大的计算环境中,字符串处理是不可或缺的一部分,尤其是在涉及到文本数据的处理、分析以及各种编程需求时。本篇将基于提供的文件内容,深入探讨Matlab中字符串运算的相关...
在Android开发中,有时我们需要对字符串进行操作,例如替换特定字符。`replaceAll`函数就是Java(也是Android)中处理字符串替换的一个重要方法。这个方法来自`String`类,允许我们用新的字符串替换掉原字符串中匹配...
在Android开发中,理解和操作字符串以及16进制数值是至关重要的技能,尤其是在处理数据传输、存储或解析二进制数据时。这篇文章将深入探讨如何在Android平台上进行字符串与16进制之间的转换。 首先,我们要明白...
总之,Android的EditText字符串过滤器InputFilter是一个强大的工具,它允许开发者定制输入行为,提高应用的数据验证和用户体验。理解并熟练掌握InputFilter的使用,对于Android开发者来说是非常重要的技能之一。
g.drawString("字符串s1的长度为:"+n1,5,70); g.drawString("字符串s2的前缀是否为we? "+s2.startsWith("we"),5,90); String s3[]={"door","apple","Applet","girl","boy"}; g.drawString("s3=door,apple,Applet,...
在Android开发中,处理图像数据是一项常见的任务,而Bitmap和String是两个核心的数据类型,分别代表位图图像和文本字符串。Bitmap对象用于存储和显示图像,而String则常用于保存和传输文本信息。本篇文章将深入探讨...
《Delphi7字符串四则运算解析》 在编程领域,Delphi7是一款经典的面向对象的集成开发环境(IDE),尤其适合开发Windows桌面应用程序。本文将深入探讨如何在Delphi7中实现字符串四则运算,这对于那些需要处理动态...
【标题】:“计算器(字符串运算)” 在编程领域,实现一个计算器来处理字符串形式的运算表达式是一项常见的任务。这个“计算器(字符串运算)”项目旨在处理用户输入的复杂数学表达式,例如“-(1+(2-3)*4-(3+...
isMobileSimple : 验证手机号(简单) isMobileExact : 验证手机号(精确) isTel : 验证电话号码 isIDCard15 : 验证身份证号码15位 isIDCard18 : 验证身份证号码18位 isEmail : 验证邮箱 isURL : 验证URL ...
在编程领域,特别是Android和Java开发中,经常需要处理字符串并从中截取特定部分。"截取特定部分字符串"这个话题涉及到字符串操作的基础知识,它包括查找字符串的开始位置、结束位置,然后提取这两个位置之间的子...
在Android应用开发中,有时我们需要根据特定的业务需求动态地执行字符串表示的代码,例如,通过接口配置来跳转到不同的Activity。这个场景通常出现在插件化开发、动态加载或运行时权限处理等复杂场景中。本文将详细...
四则运算解析器是一种计算机程序,它能够接收包含加、减、乘、除等四则运算符的字符串表达式,并将其转化为可执行的计算过程。这个解析器通常用于解决基础的数学问题,对于编程初学者来说,理解并实现这样一个解析器...
在Android开发过程中,为了实现应用的国际化或多语言支持,开发者通常会使用`strings.xml`文件来存储各种字符串资源。这些字符串资源不仅可以被直接引用显示在界面上,还可以通过格式化的方式动态填充变量值,从而...
在Android开发中,判断一个字符串是否符合日期格式是一项常见的任务,尤其在处理用户输入或者解析数据时。这个任务可以通过多种方式来实现,涉及到日期时间处理、正则表达式以及Java或Android提供的日期解析类。以下...
在Android开发中,为了使应用能够适应不同语言和地区的用户,字符串国际化的概念至关重要。它允许开发者将应用的文本资源分离出来,以便于根据不同国家和地区的需求进行翻译和定制。下面我们将详细探讨Android字符串...
标题提到的"Android-一款自动对dex文件中的字符串进行加密Android插件工具"是指用于增强应用安全性的技术实践,特别是针对 Dex 文件(Dalvik 可执行文件)中的字符串进行加密。在Android系统中,Dex文件包含了应用...
本篇文章将深入探讨如何在Android应用中发送POST请求,并解析返回的JSON字符串。 首先,我们要理解POST请求的基本原理。POST请求是HTTP协议中的一个方法,用于向服务器提交数据,这些数据会附在请求体中。在Android...