NYOJ 35 表达式求值
描述ACM队的mdd想做一个计算器,但是,他要做的不仅仅是一计算一个A+B的计算器,他想实现随便输入一个表达式都能求出它的值的计算器,现在请你帮助他来实现这个计算器吧。
比如输入:“1+2/4=”,程序就输出1.50(结果保留两位小数)
- 输入
- 第一行输入一个整数n,共有n组测试数据(n<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。
数据保证除数不会为0 - 输出
- 每组都输出该组运算式的运算结果,输出结果保留两位小数。
- 样例输入
-
2 1.000+2/4= ((1+2)*5+1)/4=
- 样例输出
-
1.50 4.00
1 import java.util.ArrayList; 2 import java.util.Iterator; 3 import java.util.Stack; 4 5 public class Main{ 6 private String s; 7 public Main(String s) 8 { 9 this.s=s; 10 } 11 //将前缀表达式字符串转换为字符串数组 12 private String[] convert() 13 { 14 ArrayList arraylist=new ArrayList(); 15 for(int i=0;i<s.length();i++) 16 { 17 if(s.charAt(i)>='0'&&s.charAt(i)<='9'||s.charAt(i)=='.')//如果为数字或者是小数点 18 { 19 String bridge=new String(""); 20 for(;i<s.length()&&(s.charAt(i)>='0'&&s.charAt(i)<='9'||s.charAt(i)=='.');i++)//要完整个数 21 bridge=bridge+Character.toString(s.charAt(i)); 22 arraylist.add(bridge); 23 i--;//退一步正位 24 } 25 else//如果为运算符 26 arraylist.add(Character.toString(s.charAt(i))); 27 } 28 Iterator it=arraylist.iterator(); 29 String[] temp=new String[arraylist.size()];//一个临时的字符串数组 30 int i=0; 31 while(it.hasNext()) 32 temp[i++]=(String)it.next(); 33 return temp; 34 } 35 //转换为中缀表达式并以字符串数组的形式返回 36 private String[] getPostfix(String[] temp) 37 { 38 String[] result=null; 39 ArrayList arraylist=new ArrayList();//用以存储中缀表达式 40 Stack stack=new Stack(); 41 stack.push(new String("#"));//以#作为符号栈的结尾 42 for(int i=0;i<temp.length;i++) 43 { 44 if(temp[i].charAt(0)>='0'&&temp[i].charAt(0)<='9') 45 arraylist.add(temp[i]); 46 else if(temp[i].equals("(")) 47 stack.push(temp[i]); 48 else if(temp[i].equals("*")||temp[i].equals("/")) 49 { 50 while(((String)stack.peek()).equals("*")||((String)stack.peek()).equals("/"))//如果栈顶为*/符号,则优先级高且先 51 arraylist.add((String)stack.pop()); 52 stack.push(temp[i]); 53 } 54 else if(temp[i].equals("+")||temp[i].equals("-")) 55 { 56 while(!((String)stack.peek()).equals("(")&&!((String)stack.peek()).equals("#"))//既不是“(”,也不是结尾时 57 arraylist.add((String)stack.pop()); 58 stack.push(temp[i]); 59 } 60 else if(temp[i].equals(")")) 61 { 62 while(!((String)stack.peek()).equals("(")) 63 arraylist.add((String)stack.pop()); 64 stack.pop();//消去一对() 65 } 66 else 67 break; 68 } 69 while(!((String)stack.peek()).equals("#")) 70 arraylist.add((String)stack.pop()); 71 result=new String[arraylist.size()]; 72 Iterator it=arraylist.iterator(); 73 int i=0; 74 while(it.hasNext()) 75 result[i++]=(String)it.next(); 76 return result;//转换成字符串数组并返回 77 } 78 //计算表达式的运算结果 79 private String getValue(String[] temp) 80 { 81 Stack stack=new Stack(); 82 for(int i=0;i<temp.length;i++) 83 { 84 if(temp[i].charAt(0)>='0'&&temp[i].charAt(0)<='9') 85 stack.push(temp[i]); 86 else if(temp[i].equals("+")) 87 stack.push(Double.toString(Double.parseDouble((String)stack.pop())+Double.parseDouble((String)stack.pop()))); 88 else if(temp[i].equals("-")) 89 stack.push(Double.toString(-(Double.parseDouble((String)stack.pop())-Double.parseDouble((String)stack.pop())))); 90 else if(temp[i].equals("*")) 91 stack.push(Double.toString(Double.parseDouble((String)stack.pop())*Double.parseDouble((String)stack.pop()))); 92 else if(temp[i].equals("/")) 93 try 94 { 95 stack.push(Double.toString(1/(Double.parseDouble((String)stack.pop())/Double.parseDouble((String)stack.pop())))); 96 } 97 catch(Exception ex) 98 { 99 System.out.println("除数不能为0"); 100 } 101 } 102 return (String)stack.pop(); 103 } 104 105 public String getResult()//封装为一个功能:即实现一个功能调用所需的方法 106 { 107 String[] temp=null; 108 String result=null; 109 temp=getPostfix(convert()); 110 result=getValue(temp); 111 return result; 112 } 113 114 public static void main(String[] args) 115 { 116 String str=new String("4.5/1.5+5*(60-20)/(35.7-25.7)"); 117 Main com=new Main(str); 118 System.out.println(str+" = "+com.getResult()); 119 } 120 }