/* 思路: 使用两个栈,一个存储数,一个存储运算符 再给运算符设置优先级,通过对优先级的判断,来实现运算控制 */ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Deque; import java.util.HashMap; import java.util.Stack; public class Main { public static void main(String[] args) throws IOException { //优先级 HashMap<Character, Integer> priority=new HashMap<Character, Integer>(); priority.put('+', 0); priority.put('-', 0); priority.put('*', 1); priority.put('/', 1); priority.put('#', -1); Stack<Double> numStack=new Stack<>(); Stack<Character> opStack=new Stack<>(); BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String line=""; while(true) { line=reader.readLine(); if(line==null||line.length()==1) { break; } //去除输入字符串中的空格 line=line.replaceAll(" ",""); //使用#作为for循环终止符号 line=line+"#"; //使用temple去提取数字 String temple=""; for(int i=0;i<line.length();i++) { char c=line.charAt(i); if(c>='0'&&c<='9') { temple=temple+c; }else { Double num=Double.valueOf(temple); numStack.push(num); temple=""; //当前运算符优先级<=opStack栈顶运算符优先级时,不断弹栈,弹出所有>=当前运算符优先级的运算符 //并将运算结果放回numStack中 while(!opStack.isEmpty()&&priority.get(c)<=priority.get(opStack.peek())) { Double num1=numStack.pop(); Double num2=numStack.pop(); char op=opStack.pop(); if(op=='+') { numStack.push(num2+num1); } if(op=='-') { numStack.push(num2-num1); } if(op=='/') { numStack.push(num2/num1); } if(op=='*') { numStack.push(num2*num1); } } if(c=='#') { break; } opStack.push(c); } } Double result=numStack.pop(); System.out.printf("%.2f",result); System.out.println(); } } }