/*表达式求值,先转换成后缀表达式,再计算。 //从中缀表达式中从左往右依次取出数据 //如遇到操作数,直接输出到后缀的队列里。 //如果遇到操作符(包括括号),这里再定义一个存放操作符的栈,则: //i.如果操作符是'(',入栈 //ii.如果操作符是')',则把栈里的操作符依次出栈并插入到后缀序列后面,直到遇到')'. //iii.如果操作符不是‘(’和‘)’,则: // (1). 如果操作符的优先级比top的优先级高,则入栈 // (2).如果操作符优先级等于或小于top优先级,则将top出栈并插入到后缀序列后面,pop后,再比较栈顶元素的优先级,重复iii,直到把此操作符 插入,将此操作符入栈。 如果中序队列里的数据已经读取完毕,记录操作符的栈里,还有操作符的话,依次出栈插入到后缀序列的后面。 此时中缀就已经转换为后缀表达式。*/ //然后对后缀表达式从前到后扫描,遇到数据入栈,遇到操作符则弹出两个数字进行计算,然后将计算结果入栈,重复操作,当扫描完毕后,栈定的元素便是结果 import java.util.*; public class Biaodashi1 { public static void main(String args[]){ Scanner in=new Scanner(System.in); while(in.hasNext()){ String str=in.nextLine(); System.out.printf("%.0f\n",f2(str)); } } public static double f2(String str){ Stack<String> stack=new Stack<String>(); Queue<String> queue=new LinkedList<String>(); String str1[]=str.split(" "); for(int i=0;i<str1.length;i++){ if(str1[i].compareTo("*")==0 || str1[i].compareTo("/")==0){ while(stack.size()>0){ String temp2=stack.peek(); if(temp2.compareTo("*")==0 ||temp2.compareTo("/")==0){ queue.offer(stack.pop()); }else{ break; } } stack.push(str1[i]); }else if(str1[i].compareTo("+")==0 || str1[i].compareTo("-")==0){ while(stack.size()>0){ String temp2=stack.peek(); if(temp2.compareTo("*")==0 ||temp2.compareTo("/")==0 ||temp2.compareTo("+")==0 ||temp2.compareTo("-")==0){ queue.offer(stack.pop()); }else{ break; } } stack.push(str1[i]); }else if(str1[i].compareTo("(")==0){ stack.push(str1[i]); }else if(str1[i].compareTo(")")==0){ String temp1=stack.pop(); while(temp1.compareTo("(")!=0){ queue.offer(temp1); temp1=stack.pop(); } }else{ queue.offer(str1[i]); } } while(stack.size()>0){ queue.offer(stack.pop()); } Stack<String> res=new Stack<String>(); while(queue.size()>0){ String temp3=queue.poll(); if(temp3.compareTo("+")==0 || temp3.compareTo("-")==0 || temp3.compareTo("*")==0 || temp3.compareTo("/")==0){ double num1=Double.parseDouble(res.pop()); double num2=Double.parseDouble(res.pop()); if(temp3.compareTo("+")==0){ res.push((num1+num2)+""); }else if(temp3.compareTo("-")==0){ res.push((num2-num1)+""); }else if(temp3.compareTo("*")==0){ res.push((num2*num1)+""); }else{ res.push((num2/num1)+""); } }else{ res.push(temp3); } } return Double.parseDouble(res.pop()); } }
表达式求值-中序表达式转换成后序表达式然后求值
猜你喜欢
转载自blog.csdn.net/anhuibozhoushatu/article/details/83823948
今日推荐
周排行