io.shmilyhe.convert.tools.ExpCalculate3 Maven / Gradle / Ivy
package io.shmilyhe.convert.tools;
import java.util.ArrayList;
import java.util.Stack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ExpCalculate3 {
private static double doubleCal(double a1, double a2, char operator) throws Exception {
switch (operator) {
case '+':
return a1 + a2;
case '-':
return a1 - a2;
case '*':
return a1 * a2;
case '/':
return a1 / a2;
default:
break;
}
throw new Exception("illegal operator!");
}
private static int getPriority(String s) throws Exception {
if(s==null) return 0;switch(s) {
case "(":return 1;
case "+":;
case "-":return 2;
case "*":;
case "/":return 3;
default:break;
}throw new Exception("illegal operator!");
}
private static String toSufExpr(String expr) throws Exception {
System.out.println("将"+expr+"解析为后缀表达式...");/*返回结果字符串*/
StringBuffer sufExpr= new StringBuffer();/*盛放运算符的栈*/
Stack operator = new Stack();
operator.push(null);//在栈顶压人一个null,配合它的优先级,目的是减少下面程序的判断
/*将expr打散分散成运算数和运算符*/
Pattern p= Pattern.compile("(?");
Matcher m =p.matcher(expr);
while(m.find()) {
String temp=m.group();if (temp.matches("[+\\-*/()]")) { //是运算符
if (temp.equals("(")) { //遇到左括号,直接压栈
operator.push(temp);
System.out.println("'('压栈");
}else if (temp.equals(")")) { //遇到右括号,弹栈输出直到弹出左括号(左括号不输出)
String topItem = null;
while (!(topItem = operator.pop()).equals("(")) {
System.out.println(topItem+"弹栈");
sufExpr.append(topItem+" ");
System.out.println("输出:"+sufExpr);
}
}else {//遇到运算符,比较栈顶符号,若该运算符优先级大于栈顶,直接压栈;若小于栈顶,弹栈输出直到大于栈顶,然后将改运算符压栈。
while(getPriority(temp) <=getPriority(operator.peek())) {
sufExpr.append(operator.pop()+" ");
System.out.println("输出sufExpr:"+sufExpr);
}
operator.push(temp);
System.out.println("\""+temp+"\""+"压栈");
}
}else {//遇到数字直接输出
sufExpr.append(temp+" ");
System.out.println("输出sufExpr:"+sufExpr);
}
}
String topItem= null;//最后将符合栈弹栈并输出
while(null != (topItem =operator.pop())) {
sufExpr.append(topItem+" ");
}return sufExpr.toString();
}
public static String getResult(String expr) throws Exception {
System.out.println("计算"+expr);
/*数字栈*/
Stack number = new Stack();
/*符号栈*/
Stack operator = new Stack();
operator.push(null);// 在栈顶压人一个null,配合它的优先级,目的是减少下面程序的判断
/* 将expr打散为运算数和运算符 */
//Pattern p = Pattern.compile("(? tokens = new ArrayList();
int offset =0;
StringBuilder part=new StringBuilder();
for(int i=0;i0&&offset>0){tokens.add(part.toString());
tokens.add(String.valueOf(exp.charAt(i)));
part=new StringBuilder();
}else{
part.append(ch);
}
break;
case '/':
case '*':
case '(':
case ')':
if(part.length()>0)tokens.add(part.toString());
tokens.add(String.valueOf(exp.charAt(i)));
part=new StringBuilder();
offset=0;
break;
default:
part.append(ch);
break;
}
offset+=1;
}
return tokens.toArray(new String[tokens.size()]);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy