主要代码如下:
分割数字和操作符后
/**
* 分割数字和操作符,sin等
* @param str
* @return List
* @throws Exception
*/
public static List<String> getList(String str) throws Exception {
List<String> list = new ArrayList<String>();
FourBase fourBase = new FourBase();
char[] char_arr = str.toCharArray();
int start_index = 0, end_index = 0;
String substr = "";//(-29.78)+((3-8*(6-4))*10.8+2*(4+6*3))*3-1*7+4/2
for (int i = 0; i < char_arr.length; i++) {
if (char_arr[i] == FourBase.leftkuohao ) {
list.add(FourBase.leftkuohaoStr);
} else if (char_arr[i] ==FourBase.rightkuohao) {
list.add(FourBase.rightkuohaoStr);
}else if(FourBase.isSanJiaoSZM(char_arr[i]))
{
String sin="";
for(int j=0;j<4;j++)
{
sin=sin+char_arr[i+j];
}
i=i+3;
if(FourBase.isSanJiaoChar(sin))
list.add( sin);
else
{
System.out.println("表达式中三角函数不正确:"+sin);
System.out.println("系统退出");
System.exit(0);
}
}
else if (FourBase.isOperChar(char_arr[i]+"")) {
list.add(char_arr[i] + "");
} else if (fourBase.isNumChar(char_arr[i] + "")) {
start_index = i;
//i++;
while (i < char_arr.length && FourBase.isNumChar(char_arr[i] + "")) {
i++;
}
end_index = i;
i--;
substr = str.substring(start_index, end_index);
//System.out.println("end_index=" + i);
//System.out.println(substr);
//break;
list.add(substr);
//list.add(char_arr[i]);
} else if (FourBase.isNumChar(char_arr[i + 1] + "") && char_arr[i] == '-') {
start_index = i;
i++;
while (!FourBase.isOperChar(char_arr[i]+"") && i < char_arr.length) {
i++;
}
end_index = i;
substr = str.substring(start_index, end_index);
System.out.println("end_index=" + i);
System.out.println(substr);
//break;
list.add(substr);
}else if(char_arr[i] == ' ')
continue;
else
{
System.out.println("表达式含有不合规字母"+char_arr[i]);
throw new RuntimeException();
}
}
return list;
}
把负数的负号和数字连接起来,再去负数的括号
/**
* 把负数的负号和数字连接起来,再去负数的括号,例如把(, -, 29.78, )变成-29.78,方便用于计算
* @param list
* @return List
*/
public static List quFuNumKuohao(List list) {
List list1 = new ArrayList<String>();
for (int i = 0; i < list.size(); i++)
{
//-29.78
//System.out.println(FourBase.isNumeric(list.get(i + 1).toString()));
if(i==0&&list.get(i).toString().equals("-")&&FourBase.isNum(list.get(i+1).toString()))
{
list1.add(list.get(i).toString()+list.get(i+1).toString());
i+=1;
}else if(list.get(i).toString().equals(FourBase.leftkuohaoStr))
{
//(, -, 7,):(-7)
if(list.get(i+1).toString().equals("-")&&FourBase.isNum(list.get(i+2).toString())&&list.get(i+3).toString().equals(FourBase.rightkuohaoStr))
{
list1.add(list.get(i+1).toString()+list.get(i+2).toString());
i=i+3;
}else if(list.get(i+1).toString().equals("-")&&FourBase.isNum(list.get(i+2).toString())&&FourBase.isOperChar(list.get(i+3).toString()))
{//把负号和数字连接到一起,成为负数。(, -, 6, -, 4, ):(-6-4
list1.add(FourBase.leftkuohaoStr);
list1.add(list.get(i+1).toString()+list.get(i+2).toString());
list1.add(list.get(i+3).toString());
i=i+3;
}else
list1.add(list.get(i).toString());
}else
list1.add(list.get(i).toString());
}
return list1;
}
计算乘除,sin,cos,括号中的单运算等
/**
* 计算乘除,sin,cos,括号中的单运算等。
* @param list
* @return
*/
public static List exec(List list)
{
//list=getStr_Sin22(list);
List list1 = new ArrayList<String>();
List list11 = new ArrayList<String>();
List list2 = new ArrayList<String>();
Stack<String> vstack = new Stack<>();
//Stack<String> operstack = new Stack<>();
boolean flag = false;
String st1 = "", st2 = "", st3 = "", st4 = "", st5 = "";
double mm = 0.0;
for (int i = 0; i < list.size(); i++)
{
st1=list.get(i).toString();
vstack.push(st1);
if(vstack.size()>=3)
{
st1=vstack.pop();
st2=vstack.pop();
st3=vstack.pop();
//只计算乘除,3*7
if(FourBase.isNum(st3)&&FourBase.isOperCC(st2)&&FourBase.isNum(st1))
{
mm=FourBase.cal(st3,st2,st1);
System.out.println("计算乘除:"+st3+st2+st1+"="+mm);
vstack.push(mm+"");
}else if(st3.equals(FourBase.leftkuohaoStr)&&FourBase.isNum(st2)&&st1.equals(FourBase.rightkuohaoStr))
{// (, -27.0, ),去括号
System.out.println("去括号:"+st3+st2+st1+"="+st2);
vstack.push(st2+"");
}else if(FourBase.isSanJiaoChar(st3)&&FourBase.isNum(st2)&&st1.equals(FourBase.rightkuohaoStr))
{// sin(, -27.0, ),计算三角函数
double m1=FourBase.calSanjiao(st3,st2);
System.out.println("计算三角函数,例如sin()中的数"+st3+st2+st1+"="+m1);
vstack.push(m1+"");
}else
{
vstack.push(st3);
vstack.push(st2);
vstack.push(st1);
}
}
}
//System.out.println(valuestack);
list1=FourBase.zhuanhuan(vstack);
vstack.clear();
//System.out.println(list1);
System.out.println("中间过程计算字符串为:"+FourBase.listToStr(list1));
System.out.println("-----------------------");
for (int i = 0; i < list1.size(); i++) {
st1 = list1.get(i).toString();
vstack.push(st1);
if (vstack.size() >= 5) {
st1 = vstack.pop();
st2 = vstack.pop();
st3 = vstack.pop();
st4 = vstack.pop();
st5 = vstack.pop();
//三,(6*7),(6-7)
if (st5.equals(FourBase.leftkuohaoStr) && FourBase.isNum(st4)&&FourBase.isOperChar(st3)&&FourBase.isNum(st2)&&st1.equals(FourBase.rightkuohaoStr)) {
mm = FourBase.cal(st4,st3, st2);
System.out.println("计算()中的单运算:" + st5 + st4 + st3 + st2 + st1 + "="+mm);
//valuestack.push(st4);
vstack.push(mm + "");
}else if (FourBase.isSanJiaoChar(st5)&&FourBase.isNum(st4) && FourBase.isOperChar(st3)&&FourBase.isNum(st2)&& st1.equals(FourBase.rightkuohaoStr) )
{
//sin(8-6)
mm=FourBase.calSanjiao(st5,FourBase.cal(st4,st3,st2));
//valuestack.push(st4);
System.out.println("计算三角函数中的单运算:"+st5+st4+st3+st2+st1+"="+mm);
vstack.push(mm+"");
}
else if ((st5.equals(FourBase.leftkuohaoStr)||FourBase.isSanJiaoChar(st5))&& FourBase.isNum(st4)&& FourBase.isOperJJ(st3)&&FourBase.isNum(st2)&&FourBase.isOperJJ(st1))
{//(6-7-
mm = FourBase.cal(st4,st3, st2);
System.out.println("计算加减平级中的单运算:" + st4 + st3 + st2 + "="+mm);
//valuestack.push(st4);
vstack.push(st5 );
vstack.push(mm + "");
vstack.push(st1 );
}else {
//System.out.println("===" + st4 + st3 + st2 + st1);
vstack.push(st5);
vstack.push(st4);
vstack.push(st3);
vstack.push(st2);
vstack.push(st1);
}
}
}
//System.out.println(valuestack);
list2=FourBase.zhuanhuan(vstack);
//System.out.println(list2);
System.out.println("中间过程计算字符串为:"+FourBase.listToStr(list2));
System.out.println("-----------------------");
//如果没有*,/,则返回
if (!FourBase.isCunZaiCC(list2)) return list2;
return exec(list2);
}
只计算平级加减
/**
* 只计算平级加减,例如(-29.78)+2833.8-(-130.9)-(-3.5249986574463286)
* @param list
* @return
*/
public static List execPingJiJiajian(List list)
{
List list1 = new ArrayList<String>();
Stack<String> vstack = new Stack<>();
String st1 = "", st2 = "", st3 = "";
double mm=0;
for (int i = 0; i < list.size(); i++)
{
st1 = list.get(i).toString();
vstack.push(st1);
if (vstack.size() >= 3)
{
st1 = vstack.pop();
st2 = vstack.pop();
st3 = vstack.pop();
//-29.78, +, 2833.8
if (FourBase.isNum(st3) && FourBase.isOperJJ(st2)&&FourBase.isNum(st1)) {
mm = FourBase.cal(st3,st2, st1);
System.out.println("计算加减:" + st3 + st2 + st1 + "="+mm);
vstack.push(mm + "");
} else {
vstack.push(st3);
vstack.push(st2);
vstack.push(st1);
}
}
}
//System.out.println(valuestack);
list1=FourBase.zhuanhuan(vstack);
System.out.println("中间过程计算字符串为:"+FourBase.listToStr(list1));
System.out.println("---------");
if (list1.size()==1) return list1;
return execPingJiJiajian(list1);
}
执行字符串表达式
//执行字符串表达式
public static String exec(String str) throws Exception
{
try
{
System.out.println("分割数字和操作符后为:"+getList(str));
List list22=quFuNumKuohao(getList(str));
System.out.println("把负数的负号和数字连接起来,再去负数的括号:"+list22);
System.out.println("-----------------------------");
if(FourBase.checkStr(list22))
{
List list33=exec(list22);
System.out.println("计算乘除和括号后为:"+list33);
List list44=execPingJiJiajian(list33);
System.out.println("计算加减和括号后为:"+list44);
return list44.get(0).toString();
}else
return "表达式少左或者右括号,表达式不正确";
}catch(Exception e)
{
throw new Exception("表达式不正确");
}
}
}
MAIN方法调用
public class MainCalc
{
public static void main(String[] args) throws Exception{
/**/
// String str = "1+(10+2*20)*3" ;
//String str = "1+(10+2/20.0)*3-1*7" ;
//String str="-29.78+((3-8*(6-4))*10.8+2*(4+6*3))*3-1*7+4/2";
//String str = "-29.78+(3-8*(-6-4))*10.8";
//String str = "((8))*sin(8-2*cos(6+5/4))*9/5-6*(7+2.36)";
String str = "((-29.78))+ (( sin(3-8))*(-6-4))*10.8+2*(4+6.7*3)*3-1*(7+4)/2*(-7*((4-3/5)))-4*sin(6.7-2*cos(6-7/5+tan(7*3.1-3))+4-7)-7+50-5*(-3)";
//String str="(sin(3))";
System.out.println("要计算的字符串为:"+str);
System.out.println("计算结果是:"+FourCalcSanJiao.exec(str));
}
}
主要结果和过程见上篇
2021-8-29