您的位置:首页 > 其它

自己写的一个解析运算式并得到结果的方法(最后是以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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐