package org.cgz.practice;
import java.util.Stack;
import java.util.StringTokenizer;
class Caculator {
/**
* 计算算术表达式的结果
* @param expression 表达式字符串
* @return
*/
public static double caculate(String expression) {
//存储操作数的栈
Stack<Double> operandStack = new Stack<Double>();
//存储操作符的栈
Stack<Character> operatorStack = new Stack<Character>();
//拆分表达式
StringTokenizer tokens = new StringTokenizer(expression, "()+-/*", true);
while(tokens.hasMoreTokens()) {
String token = tokens.nextToken().trim();
if(token.length()==0) {
continue;
}else if(token.charAt(0)=='+' || token.charAt(0)=='-') {
//+或-的优先级比较低,因此需要计算前面所有的表达式
while(!operatorStack.isEmpty() &&
(operatorStack.peek()=='+' ||
operatorStack.peek()=='-' ||
operatorStack.peek()=='*' ||
operatorStack.peek()=='/')) {
processAnOperator(operandStack,operatorStack);
}
operatorStack.push(token.charAt(0));
}else if(token.charAt(0)=='*' || token.charAt(0)=='/') {
//*或/优先级较高,需要看下一个操作符才能进行计算
operatorStack.push(token.charAt(0));
}else if(token.trim().charAt(0)=='(') {
operatorStack.push('(');
}else if(token.trim().charAt(0) == ')') {
//计算()中的表达式的值
while(operatorStack.peek() != '(') {
processAnOperator(operandStack,operatorStack);
}
//弹出'('
operatorStack.pop();
}else {
//将操作数入栈
operandStack.push(new Double(token));
}
}
//计算剩下的表达式的结果
while(!operatorStack.isEmpty()) {
processAnOperator(operandStack, operatorStack);
}
//返回最后的结果
return operandStack.pop();
}
/**
* 取出栈中的操作数和操作符 进行计算,并将结果push到operandStack
* @param operandStack
* @param operatorStack
*/
private static void processAnOperator(Stack<Double> operandStack,Stack<Character> operatorStack) {
char op = operatorStack.pop();
double op1 = operandStack.pop();
double op2 = operandStack.pop();
if(op=='+') {
operandStack.push(op2+op1);
}else if(op=='-') {
operandStack.push(op2-op1);
}else if(op=='*') {
operandStack.push(op2*op1);
}else if(op=='/') {
operandStack.push(op2/op1);
}
}
}
public class CaculatorTest {
public static void main(String[] args) {
System.out.println(Caculator.caculate("3+2*(5+6/2)"));
}
}
计算结果:
19.0