您的位置:首页 > 编程语言 > Java开发

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);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: