import java.util.Deque;
import java.util.LinkedList;
public class EvaluateArithmeticExpression {
public static void main(String[] args) {
System.out.println(evaluate("-4*2/2^3+3")==-4*2/Math.pow(2, 3)+3);
System.out.println(evaluate("12*1314/(1*4)+300")==12*1314/(1*4)+300);
System.out.println(evaluate("123-(14*4)/4+300")==123-(14*4)/4+300);
System.out.println(evaluate("12*4+300")==12*4+300);
}
public static int evaluate(String s){
Deque<Integer> vStack= new LinkedList<>();
Deque<Character> opStack= new LinkedList<>();
int i=0;
while(i<s.length()){
if(isNum(s,i))
i=getNum(s,vStack,i);
else if(isOp(s,i))
i=doOp(s,opStack,vStack,i);
}
doOp(opStack,vStack);
return vStack.pop();
}
private static int getNum(String s, Deque<Integer> vStack,int i){
int sign=1;
if(s.charAt(i)=='-' || s.charAt(i)=='+')
sign=s.charAt(i++)=='-'?-1:1;
int val=0;
while(i<s.length() && isNum(s,i))
val=val*10+s.charAt(i++)-'0';
vStack.push(sign*val);
return i;
}
private static int doOp(String s, Deque<Character> opStack,Deque<Integer> vStack,int i){
char op=s.charAt(i);
if(op=='(')
opStack.push(op);
else{
if(op==')'){
while(!opStack.isEmpty() && opStack.peekFirst()!='(')
doOp(opStack,vStack);
opStack.pop();
}
else{
while(!opStack.isEmpty() && prior(op)<=prior(opStack.peekFirst()))
doOp(opStack,vStack);
opStack.push(op);
}
}
return i+1;
}
private static int prior(char op){
switch(op){
case '+':
case '-': return 1;
case '*':
case '/': return 2;
case '^': return 4;
}
return 0;
}
private static void doOp(Deque<Character> opStack,Deque<Integer> vStack){
int b=vStack.isEmpty()?0:vStack.pop();
int a=vStack.isEmpty()?0:vStack.pop();
char op=opStack.pop();
int res=evaluate(a,b,op);
vStack.push(res);
}
private static int evaluate(int a, int b, char op){
switch(op){
case '+': return a+b;
case '-': return a-b;
case '/': return a/b;
case '*': return a*b;
case '^': return (int)Math.pow(a,b);
}
return 0;
}
private static boolean isNum(String s, int i){
return '0'<=s.charAt(i) && s.charAt(i)<='9';
}
private static boolean isOp(String s, int i){
return "()+-*/^".contains(String.valueOf(s.charAt(i)));
}
}
Nguồn
2014-08-02 19:58:22
là bài tập về nhà này? – 0605002
... và câu hỏi của bạn là gì? – 0605002
Có lẽ tốt nhất để đánh giá nó bằng cách phân tích biểu thức thành một cấu trúc cây của một số loại. –