import java.math.BigDecimal;
import java.util.regex.*;
import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
class AlgorithmStringFormulationParseCalculator
{
public static void main(String []args)
{
Scanner sc =new Scanner(System.in);//scanner 用于扫入;
String s=sc.nextLine();//string是不变的用了SB,insert后match.start()就变了。用于配
StringBuilder sb=new StringBuilder(s);//用于插
Pattern p=Pattern.compile("[\\+\\-\\*\\/]");//用于匹配,提供插点,不是split,split,有破坏性
Matcher m=p.matcher(s);//是String s的match,所以下面次序要处理一下
BigDecimal bd=new BigDecimal("0.0");
for (int i=0;m.find();i++)//但StringBuilder insert后就变化,下次的位置就变了所以用for,多一个记数,
//find() is boolean 又类似next()有递进功能
{
int j=m.start();//m.start()像sc=new Scanner(System.in);出现一次return一个值
String s0=m.group();//同上
if (s0.equals("-")==false)
{
sb.insert(j+2*i," ");//注意if 和else的{}//中级数学逻辑,高级用乘方去想
sb.insert(j+2+2*i," ");
}
else
{
sb.insert(j+2*i, " ");//取负数保证双插
}
}
System.out.println(sb);
String s1=new String(sb);//不能直接等于
Scanner sc1=new Scanner(s1);//sc不接受sb,sb被插的命, 插完再扫;
List<String> ll=new ArrayList<String>();
while(sc1.hasNext())
{
ll.add(sc1.next());//index,initial value done
}
System.out.println(ll);
for (String s2:ll)
{
int j=ll.indexOf(s2);
switch(s2)
{
case "/" : ll.set(j+1,Double.toString(Double.valueOf(ll.get(j-1))/Double.valueOf(ll.get(j+1))));
ll.set(j-1,"0"); ll.set(j,"0");System.out.println(ll);break;
case "*" : ll.set(j+1,Double.toString(Double.valueOf(ll.get(j-1))*Double.valueOf(ll.get(j+1))));
ll.set(j-1,"0"); ll.set(j,"0");System.out.println(ll);break;
case "+" : ll.set(j,"0");break;
//case "+" : ll.set(j+1,Double.toString(Double.valueOf( ll.get(j-1))+Double.valueOf(ll.get(j+1))));
//ll.set(j-1,"0"); ll.set(j,"0");System.out.println(ll);break;
//11.set(j,"0");break;也行
}
}
for (int i=0;i<ll.size();i++)
{
bd=bd.add(new BigDecimal(ll.get(i)));//Double除没问题,但除后相加要用BigDecimal
//BigDecimal要用String构造,用Double有误差
}
System.out.println(bd);
}
}
String处理
最新推荐文章于 2022-04-19 18:34:23 发布