Java实现表达式求值(原创,跟书上的不一样)
2014-07-01 23:23
357 查看
import java.util.Scanner; import java.util.Stack; /** * 不想用书上的方法,所以就自己创造了这种方法 * @author LiuZhenhua * */ public class Main { /** * @param args */ public static void main(String[] args) { Scanner sc = new Scanner(System.in); //读数据 Main instance=new Main(); int result =0; boolean correct = true; try { result = instance.cal(sc.next()); } catch (Exception e) { // TODO: handle exception correct =false; } sc.close(); if(correct){ System.out.println(result); } System.out.println(correct); } public int cal(String expression){ if(expression== null){ throw new NullPointerException("传入的表达式为null"); } String s=rmAddAndSub(rmMulAndDiv(rmBracket(expression))); return Integer.parseInt(s); } /** * 去除表达式中的括号 * @param expression * @return */ private String rmBracket(String expression){ StringBuilder b=new StringBuilder(expression); Stack<Integer> stack=new Stack<Integer>(); for(int i=0;i<b.length();i++){ char c=b.charAt(i); switch(c){ case '(' : stack.push(i);break; case ')' : int index=stack.pop(); String s=b.substring(index+1, i);//括号里面的内容 b.replace(index, i+1, rmMulAndDiv(s)); break; } } return b.toString(); } /** * 去除表达式中的乘除法 * @param expression * @return */ private String rmMulAndDiv(String expression){ StringBuilder b=new StringBuilder(expression); int pre=-1;//前一个加减运算符的位置 for(int i=0;i<b.length();i++){ char c=b.charAt(i); switch(c){ case '+' : pre=i;break; case '-' : { if(i==0 || b.charAt(i-1)=='+' || b.charAt(i-1)=='-' || b.charAt(i-1)=='*' || b.charAt(i-1)=='/'){ break ; } pre=i; break; } case '*' : { int left=Integer.parseInt(b.substring(pre+1, i));//左操作数 int j; for(j=i+1;j<b.length();j++){ char tmp=b.charAt(j); if(tmp=='+' || tmp=='-' || tmp=='*' || tmp=='/'){ break; } } int right=Integer.parseInt(b.substring(i+1, j));//右操作数 int r=left*right; String rep=String.valueOf(r); b.replace(pre+1, j, rep); i=pre+rep.length(); //重新定位i break; } case '/' :{ int left=Integer.parseInt(b.substring(pre+1, i));//左操作数 int j; for(j=i+1;j<b.length();j++){ char tmp=b.charAt(j); if(tmp=='+' || tmp=='-' || tmp=='*' || tmp=='/'){ break; } } int right=Integer.parseInt(b.substring(i+1, j));//右操作数 int r=left/right; String rep=String.valueOf(r); b.replace(pre+1, j, rep); i=pre+rep.length(); //重新定位i break; } } } return rmAddAndSub(b.toString()); } /** * 去除表达式中的加减法 * @param expression * @return */ private String rmAddAndSub(String expression){ expression="+"+expression; int r = 0; int pre_operator_index = expression.length(); for(int i = pre_operator_index-1;i>=0;i--){ char c = expression.charAt(i); if(c=='-'){ int op_number = Integer.parseInt(expression.substring(i+1, pre_operator_index) ); if(expression.charAt(i-1)=='-'){ //加 r+=op_number; i--; }else if(expression.charAt(i-1)=='+'){ r-=op_number; i--; }else{ r-=op_number; } pre_operator_index = i; }else if(c=='+'){ //加 int addend = Integer.parseInt(expression.substring(i+1, pre_operator_index) ); r+=addend; pre_operator_index = i; } } return String.valueOf(r); } }
相关文章推荐
- 表达式求值,Java实现
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java)
- 利用栈实现算术表达式求值(Java语言描述)
- java后缀表达式实现表达式求值
- 用栈来实现表达式求值【Java版】
- java实现任意四则运算表达式求值算法
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java)
- JAVA实现字符串表达式求值
- 利用 Lambda 表达式实现 Java 中的惰性求值
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java)
- 中缀表达式转换为前缀及后缀表达式并求值(java实现)
- 表达式求值 - Java实现
- 利用栈实现算术表达式求值(Java语言描述)
- [原创]表达式求值:经典算法 <Java版本>
- java实现算术表达式求值
- 数据结构习作之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java) (技术含量少许)
- 利用栈实现算术表达式求值(Java语言描述)
- 奇怪的表达式求值 (java实现)
- Java实现-逆波兰表达式求值
- 表达式求值--栈(c++/java实现)