题目简述:
合理输入一串算式,如“3.5+2*2.5-5”,输出计算结果,精确到小数点后两位。
代码示例:
import java.util.*;
import java.util.stream.Collectors;
public class Main {
private static Deque<Character> opr=new LinkedList<>();
private static Deque<Double> number=new LinkedList<>();
public static void main(String[] args) {
Scanner scaner=new Scanner(System.in);
String formual=scaner.nextLine();
char[] str=formual.toCharArray();
int i=0;
while(i<str.length){
char c=str[i];
if(isOpr(c)){//是符号位
Character peek=opr.peek();//前一个符号
while(peek!=null&&isHigherPro(peek,c)){
//是符号位并且符号位优先级更高
cal();
peek=opr.peek();
}
opr.push(c);
i++;
}
else{//是数字位
double num=0;//小数点前
double num2=0;//小数点后
int times=1;
boolean flag=false;//小数点不存在
while(i<str.length&&!isOpr(str[i])){
//数字位可能有多位,所以在循环中判断是否为符号位
if(str[i]=='.'){
flag=true;//小数点存在
}
else{
if(flag){
double val=str[i]-'0';
for(int j=0;j<times;j++){
val/=10.0;
}
num2+=val;
times++;
}
else{
num=num*10+(str[i]-'0');
}
}
i++;
}
number.push(num+num2);
}
}
while(!opr.isEmpty()) cal();
System.out.println(String.format("%.2f",number.peek()));
}
private static boolean isOpr(char c){//判断是否为符号位
return c=='+'||c=='-'||c=='*'||c=='/';
}
private static boolean isHigherPro(char peek,char c){
//判断是入栈的符号与在栈的符号优先级高低
return ((peek=='*'||peek=='/')||(c=='+'||c=='-'));
}
private static void cal(){
double a=number.pop();
double b=number.pop();
char c=opr.pop();
switch(c){
case '+':
number.push(b+a);//b先入栈,后出栈
break;
case '-':
number.push(b-a);
break;
case '*':
number.push(b*a);
break;
case '/':
number.push(b/a);
break;
}
}
}
输出结果示例:
3.5+2*2.5-5
3.50
参考链接:
1、https://www.bilibili.com/video/BV1Gv411T7pi?p=76&spm_id_from=pageDriver