自己写的一个解析运算式并得到结果的方法(最后是以Double型表示,中间是以BigDecimal计算中间结果的,临时起意写的,没有注释)
2011-07-26 12:07
971 查看
package calcutor;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Calcutor{
public static BigDecimal getResult(ArrayList<String> list){
if(list.size() == 3){
if("+".equals(list.get(2))){
return new BigDecimal(list.get(0)).add(new BigDecimal(list.get(1)));
}else if("-".equals(list.get(2))){
return new BigDecimal(list.get(0)).subtract(new BigDecimal(list.get(1)));
}else if("*".equals(list.get(2))){
return new BigDecimal(list.get(0)).multiply(new BigDecimal(list.get(1)));
}else if("/".equals(list.get(2))){
return new BigDecimal(list.get(0)).divide(new BigDecimal(list.get(1)),1000,BigDecimal.ROUND_UP);
}else if("^".equals(list.get(2))){
return new BigDecimal(Integer.parseInt(list.get(0))^Integer.parseInt(list.get(1)));
}
}
ArrayList<String> list1 = new ArrayList<String>();
for(int i = 0;i<list.size();i++) {
if(PriorityEnum.getEnumList().contains(list.get(i))){
list1.addAll(list.subList(0, i-2));
String s = "";
if("+".equals(list.get(i))){
s = new BigDecimal(list.get(i-2)).add(new BigDecimal(list.get(i-1))).toString();
}else if("-".equals(list.get(i))){
s = new BigDecimal(list.get(i-2)).subtract(new BigDecimal(list.get(i-1))).toString();
}else if("*".equals(list.get(i))){
s = new BigDecimal(list.get(i-2)).multiply(new BigDecimal(list.get(i-1))).toString();
}else if("/".equals(list.get(i))){
s = new BigDecimal(list.get(i-2)).divide(new BigDecimal(list.get(i-1)),1000,BigDecimal.ROUND_UP).toString();
}else if("^".equals(list.get(i))){
s = "" + new BigDecimal(Integer.parseInt(list.get(0))^Integer.parseInt(list.get(1)));
}
list1.add(s);
list1.addAll(list.subList(i+1, list.size()));
list = null;
return getResult(list1);
}
}
return BigDecimal.ZERO;
}
public static ArrayList<String> readFormula(String formula){
ArrayList<String> list1 = new ArrayList<String>();
ArrayList<String> list2 = new ArrayList<String>();
String s = "";
for(int i = 0; i< formula.length() ;i++){
if(!isC(formula.charAt(i))){
list1.add(s);
list1.add(""+formula.charAt(i));
s = "";
} else {
s += formula.charAt(i);
}
}
if(s != null && s.length() != 0){list1.add(s);}
for (String string : list1) {
if(string != null && string.length() != 0){list2.add(string);}
}
list2.trimToSize();
return list2;
}
public static boolean isNumber(String target){
if(target == null || target.length() == 0){
return false;
}
Pattern pattern =
Pattern.compile("[0-9]+\\.?[0-9]*");
Matcher matcher = pattern.matcher(target);
return matcher.matches();
}
public static boolean isC(char c){
String target = ""+c;
if(target == null || target.length() == 0){
return false;
}
Pattern pattern =
Pattern.compile("[0-9]?\\.?");
Matcher matcher = pattern.matcher(target);
return matcher.matches();
}
public static ArrayList<String> sort(ArrayList<String> list){
ArrayList<String> list1 = new ArrayList<String>();
ArrayList<String> list2 = new ArrayList<String>();
list1.add("#");
list.add("#");
for (String str : list) {
if(isNumber(str)){
list2.add(str);
} else{
if(")".equals(str)){
while(list1.size() > 0){
if("(".equals(list1.get(list1.size()-1))){
list1.remove(list1.size()-1);
break;
}
list2.add(list1.get(list1.size()-1));
list1.remove(list1.size()-1);
}
} else{
if(PriorityEnum.getIcp(str) > PriorityEnum.getIsp(list1.get(list1.size()-1))){
list1.add(str);
}else{
while(list1.size() > 0){
if(PriorityEnum.getIcp(str) < PriorityEnum.getIsp(list1.get(list1.size()-1))){
if(!")".equals(list1.get(list1.size()-1)) && !"(".equals(list1.get(list1.size()-1)) && !"#".equals(list1.get(list1.size()-1))){
list2.add(list1.get(list1.size()-1));
}
list1.remove(list1.size()-1);
} else {
break;
}
}
if(PriorityEnum.getIcp(str) > PriorityEnum.getIsp(list1.get(list1.size()-1))){
list1.add(str);
}
}
}
}
}
list1 = null;
list2.trimToSize();
return list2;
}
}
package calcutor;
import java.util.ArrayList;
public enum PriorityEnum {
First("#", 0, 0)
,Left("(", 8,1)
,Right(")", 1,8)
,Divide("/",4,5)
,Multi("*",4,5)
,Mul("%",4,5)
,Head("^",6,7)
,Plus("+",2,3)
,Minus("-",2,3);
private final String param;
private final int icp;
private final int isp;
private PriorityEnum(String param, int icp, int isp) {
this.param = param;
this.icp = icp;
this.isp = isp;
}
@Override
public String toString() {
return this.param;
}
public String getParam() {
return this.param;
}
public static int getIcp(String param) {
for (PriorityEnum v : values()) {
if(v.getParam().equals(param)){
return v.icp;
}
}
return 0;
}
public static int getIsp(String param) {
for (PriorityEnum v : values()) {
if(v.getParam().equals(param)){
return v.isp;
}
}
return 0;
}
public static ArrayList<String> getEnumList(){
ArrayList<String> list = new ArrayList<String>();
for (PriorityEnum v : values()) {
list.add(v.getParam());
}
list.trimToSize();
return list;
}
}
package calcutor;
import java.util.ArrayList;
import java.util.Scanner;
public class Run {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
//String s = "11+12*(13-14)-15/16*(12+1.5*(3+5.2))";
//String s = "12.6 + 13.5*6";
s =s .replace(" ", "");
ArrayList<String> list = Calcutor.readFormula(s);
ArrayList<String> list1 = Calcutor.sort(list);
for (String string : list1) {
System.out.print(string+" ");
}
System.out.println();
System.out.println(Calcutor.getResult(list1).doubleValue());
double a = 1*13*15*(5+9)*(12.0/9+9*(3+5));
System.out.println(12^14);
System.out.println(a);
}
}
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Calcutor{
public static BigDecimal getResult(ArrayList<String> list){
if(list.size() == 3){
if("+".equals(list.get(2))){
return new BigDecimal(list.get(0)).add(new BigDecimal(list.get(1)));
}else if("-".equals(list.get(2))){
return new BigDecimal(list.get(0)).subtract(new BigDecimal(list.get(1)));
}else if("*".equals(list.get(2))){
return new BigDecimal(list.get(0)).multiply(new BigDecimal(list.get(1)));
}else if("/".equals(list.get(2))){
return new BigDecimal(list.get(0)).divide(new BigDecimal(list.get(1)),1000,BigDecimal.ROUND_UP);
}else if("^".equals(list.get(2))){
return new BigDecimal(Integer.parseInt(list.get(0))^Integer.parseInt(list.get(1)));
}
}
ArrayList<String> list1 = new ArrayList<String>();
for(int i = 0;i<list.size();i++) {
if(PriorityEnum.getEnumList().contains(list.get(i))){
list1.addAll(list.subList(0, i-2));
String s = "";
if("+".equals(list.get(i))){
s = new BigDecimal(list.get(i-2)).add(new BigDecimal(list.get(i-1))).toString();
}else if("-".equals(list.get(i))){
s = new BigDecimal(list.get(i-2)).subtract(new BigDecimal(list.get(i-1))).toString();
}else if("*".equals(list.get(i))){
s = new BigDecimal(list.get(i-2)).multiply(new BigDecimal(list.get(i-1))).toString();
}else if("/".equals(list.get(i))){
s = new BigDecimal(list.get(i-2)).divide(new BigDecimal(list.get(i-1)),1000,BigDecimal.ROUND_UP).toString();
}else if("^".equals(list.get(i))){
s = "" + new BigDecimal(Integer.parseInt(list.get(0))^Integer.parseInt(list.get(1)));
}
list1.add(s);
list1.addAll(list.subList(i+1, list.size()));
list = null;
return getResult(list1);
}
}
return BigDecimal.ZERO;
}
public static ArrayList<String> readFormula(String formula){
ArrayList<String> list1 = new ArrayList<String>();
ArrayList<String> list2 = new ArrayList<String>();
String s = "";
for(int i = 0; i< formula.length() ;i++){
if(!isC(formula.charAt(i))){
list1.add(s);
list1.add(""+formula.charAt(i));
s = "";
} else {
s += formula.charAt(i);
}
}
if(s != null && s.length() != 0){list1.add(s);}
for (String string : list1) {
if(string != null && string.length() != 0){list2.add(string);}
}
list2.trimToSize();
return list2;
}
public static boolean isNumber(String target){
if(target == null || target.length() == 0){
return false;
}
Pattern pattern =
Pattern.compile("[0-9]+\\.?[0-9]*");
Matcher matcher = pattern.matcher(target);
return matcher.matches();
}
public static boolean isC(char c){
String target = ""+c;
if(target == null || target.length() == 0){
return false;
}
Pattern pattern =
Pattern.compile("[0-9]?\\.?");
Matcher matcher = pattern.matcher(target);
return matcher.matches();
}
public static ArrayList<String> sort(ArrayList<String> list){
ArrayList<String> list1 = new ArrayList<String>();
ArrayList<String> list2 = new ArrayList<String>();
list1.add("#");
list.add("#");
for (String str : list) {
if(isNumber(str)){
list2.add(str);
} else{
if(")".equals(str)){
while(list1.size() > 0){
if("(".equals(list1.get(list1.size()-1))){
list1.remove(list1.size()-1);
break;
}
list2.add(list1.get(list1.size()-1));
list1.remove(list1.size()-1);
}
} else{
if(PriorityEnum.getIcp(str) > PriorityEnum.getIsp(list1.get(list1.size()-1))){
list1.add(str);
}else{
while(list1.size() > 0){
if(PriorityEnum.getIcp(str) < PriorityEnum.getIsp(list1.get(list1.size()-1))){
if(!")".equals(list1.get(list1.size()-1)) && !"(".equals(list1.get(list1.size()-1)) && !"#".equals(list1.get(list1.size()-1))){
list2.add(list1.get(list1.size()-1));
}
list1.remove(list1.size()-1);
} else {
break;
}
}
if(PriorityEnum.getIcp(str) > PriorityEnum.getIsp(list1.get(list1.size()-1))){
list1.add(str);
}
}
}
}
}
list1 = null;
list2.trimToSize();
return list2;
}
}
package calcutor;
import java.util.ArrayList;
public enum PriorityEnum {
First("#", 0, 0)
,Left("(", 8,1)
,Right(")", 1,8)
,Divide("/",4,5)
,Multi("*",4,5)
,Mul("%",4,5)
,Head("^",6,7)
,Plus("+",2,3)
,Minus("-",2,3);
private final String param;
private final int icp;
private final int isp;
private PriorityEnum(String param, int icp, int isp) {
this.param = param;
this.icp = icp;
this.isp = isp;
}
@Override
public String toString() {
return this.param;
}
public String getParam() {
return this.param;
}
public static int getIcp(String param) {
for (PriorityEnum v : values()) {
if(v.getParam().equals(param)){
return v.icp;
}
}
return 0;
}
public static int getIsp(String param) {
for (PriorityEnum v : values()) {
if(v.getParam().equals(param)){
return v.isp;
}
}
return 0;
}
public static ArrayList<String> getEnumList(){
ArrayList<String> list = new ArrayList<String>();
for (PriorityEnum v : values()) {
list.add(v.getParam());
}
list.trimToSize();
return list;
}
}
package calcutor;
import java.util.ArrayList;
import java.util.Scanner;
public class Run {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
//String s = "11+12*(13-14)-15/16*(12+1.5*(3+5.2))";
//String s = "12.6 + 13.5*6";
s =s .replace(" ", "");
ArrayList<String> list = Calcutor.readFormula(s);
ArrayList<String> list1 = Calcutor.sort(list);
for (String string : list1) {
System.out.print(string+" ");
}
System.out.println();
System.out.println(Calcutor.getResult(list1).doubleValue());
double a = 1*13*15*(5+9)*(12.0/9+9*(3+5));
System.out.println(12^14);
System.out.println(a);
}
}
相关文章推荐
- 输入一个表达式,没有括号,数字小于0-9之间,输出计算结果,所有的中间结果化为整形。 例如: 输入:3+8×2/9-2 输出:2
- 输入一个表达式,没有括号,数字小于0-9之间,输出计算结果,所有的中间结果化为整形。 例如: 输入:3+8×2/9-2 输出:2
- 输入一个表达式,没有括号,数字小于0-9之间,输出计算结果,所有的中间结果化为整形。 例如: 输入:3+8×2/9-2 输出:2
- 计算两个数组的交集,并去掉重复的元素,把最后结果存入其中的一个数组中。
- Android5.0 计算器计算结果不准确和结果末尾的多余的‘0’没有省略的解决方法
- 字符串的原型扩展一个方法来解析url(String.prototype.pro)-自己写的一个方法
- SQL中条件和比较关键字Case的使用方法(case的结果就是得到了一个值)
- 解决Adb connection Error:远程主机强迫关闭了一个现有的连接。 Connection attempts: 1 真机没有连接得最后方法
- JS 二进制计算,如何得到一个负数的二进制表示
- Canvas画弧线方法(不知道的时候自己设计算法,结果一个悲剧啊。)
- asp.net 自己封装数据库操作一个类中一个自定义方法Execute(),非常实用,省去了麻烦的中间过程,动态参数
- 自己写的一个用栈方法来计算的数学表达式
- ZOJ 1205题解本来是一道大数运算水题,可是却纠结了很久,原因是没能真正读懂题意,要求的计算必须是一一对应输出即使前面出现几个0最后也要把前面的0输出,看别人用C++自己还是两个都提交了结果还是C占的内存少。
- js一个方法中的两个语句中间加alert弹出和不加alert弹出执行结果不一样
- 定义一个“点”(Point)类用来表示三维空间中的点(有三个坐标)。要求如下: (1)可以生成具有特定坐标的点对象。 (2)提供可以设置三个坐标的方法。 (3)提供可以计算该“点”距原点距离平方的方法。 (4)编写主类程序验证。
- 使用了博客园的备份后得到一个xml文件,不知道有没有css或者xslt文件可以在本地阅读文章,在网上找了半天也没有找到解决办法,难道要自己写?
- 定义一个学生类,有六个属性,一个打招呼的方法,一个计算自己总分数和平均分的方法
- 编写一个程序,要求用户输入下限整数和一个上限整数,然后,依次计算从下限到上限的每一个整数的平方的加和,最后显示结果
- 用javadoc提取此注释文档,并产生一个HTML文件,最后通过浏览器查看结果 直接Tools>Generate javadoc
- 用VS2010编写C程序时,最后的输出语句只是屏幕闪了一下,屏幕没有结果,解决方法