62,614
社区成员
发帖
与我相关
我的任务
分享
import java.util.Scanner;
import java.util.Stack;
public class Caculator {
public String compute(String expression) {
String exp = expression.trim();
char[] strs = exp.toCharArray();
Stack operatorStack = new Stack();
Stack valueStack = new Stack();
String topOperator = "";
String operandOne = "";
String operandTwo = "";
double result = 0.0;
for (int i = 0; i < strs.length; i++) {
String pointer = String.valueOf(strs[i]);
Character next = new Character(pointer.charAt(0));
switch (next.charValue()) {
case '+':
case '-':
case '*':
case '/':
if (operatorStack.isEmpty()) {
operatorStack.push(pointer);
} else {
topOperator = operatorStack.peek().toString();
Character a = new Character(topOperator.charAt(0));
while (priority(next) <= priority(a)) {
topOperator = operatorStack.pop().toString();
operandTwo = valueStack.pop().toString();
operandOne = valueStack.pop().toString();
Double num1 = Double.valueOf(operandOne);
Double num2 = Double.valueOf(operandTwo);
result = calculate(topOperator, num1, num2);
valueStack.push(String.valueOf(result));
}
operatorStack.push(pointer);
}
break;
case '(':
operatorStack.push(pointer);
break;
case ')':
topOperator = operatorStack.pop().toString();
while (topOperator != "(") {
operandTwo = valueStack.pop().toString();
operandOne = valueStack.pop().toString();
Double num1 = Double.valueOf(operandOne);
Double num2 = Double.valueOf(operandTwo);
result = calculate(topOperator, num1, num2);
valueStack.push(String.valueOf(result));
topOperator = operatorStack.pop().toString();
}
break;
default:
if (Character.isDigit(next.charValue())) {
valueStack.push(pointer);
} else {
System.out.println("表达式输入错误");
}
break;
}
}
while (!operatorStack.isEmpty()) {
System.out.println(valueStack);
System.out.println(operatorStack);
topOperator = operatorStack.pop().toString();
operandTwo = valueStack.pop().toString();
operandOne = valueStack.pop().toString();
Double num1 = Double.valueOf(operandOne);
Double num2 = Double.valueOf(operandTwo);
result = calculate(topOperator, num1, num2);
valueStack.push(String.valueOf(result));
}
return valueStack.peek().toString();
}
private int priority(Character op) // 计算运算符优先级
{
Character add = new Character('+');
Character reduce = new Character('-');
Character minus = new Character('*');
Character dive = new Character('/');
if ((op.equals(add)) || (op.equals(reduce))) {
return 1;
} else if ((op.equals(minus)) || (op.equals(dive))) {
return 2;
} else {
return 0;
}
}
public double calculate(String op, Double num1, Double num2) {
if ("+".equals(op)) {
return num1 .doubleValue()+ num2.doubleValue();
}
if ("-".equals(op)) {
return num1.doubleValue() - num2.doubleValue();
}
if ("*".equals(op)) {
return num1.doubleValue() * num2.doubleValue();
}
if ("/".equals(op)) {
if (num2.equals(new Double(0.0))) {
System.out.println("Error");
} else {
return num1.doubleValue() / num2.doubleValue();
}
}
return 0;
}
public static void main(String arg[]) {
String expression = "";
System.out.println("输入计算表达式:");
Scanner temp = new Scanner(System.in);
expression = temp.next();
System.out.println(expression);
Caculator b = new Caculator();
String res = b.compute(expression);
System.out.println("计算结果是:" + res);
}
}