之前做题遇到过,面试也面试到过,就是如何求解含有加减乘除和括号的表达式的值。今天刷书看到栈ADT结构这一章的时候
正好讲到了求解这种题目的思路。顺便自己写了点代码实现了一下,现在记录一下思路和简单实现。
思路很简单,建立一个存储操作符和括号的堆栈,输入是一个表达式的字符串,依次遍历,当是数字的时候,直接追加到输
出,遍历到操作符则入栈。当入栈一个操作符时,要注意两个判断,第一个是要依次弹出优先级高于或等于即将入栈的操作符;第
二如果当前遍历位置在“(”和“)”之间,则切记不可将入栈的“(”也弹出了。直到遍历到了“)”再依次弹出“(”之前的全部。
import java.util.*;
public class MathematicalCal {
private static HashMap<String, Integer> priority = new HashMap<String, Integer>() {
/**
*
*/
private static final long serialVersionUID = 3144136159818291600L;
{
put("(", 2);
put("×", 0);
put("÷", 0);
put("+", 1);
put("-", 1);
}
};
public static String converse(String expression) {
int len = expression.length();
Stack<String> operator = new Stack<>();
StringBuffer result = new StringBuffer();
for (int i = 0; i < len; i++) {
if (Character.isDigit(expression.charAt(i))) {
result.append(String.valueOf(expression.charAt(i)));
} else if (operator.isEmpty()) {
operator.push(String.valueOf(expression.charAt(i)));
} else {
if (expression.charAt(i) == ')') {
while (!(operator.peek().equals("("))) {
result.append(operator.pop());
}
operator.pop(); // remove '('
} else if (expression.charAt(i) == '(') {
operator.push("(");
} else {
while (!(operator.isEmpty())
&& (Integer.valueOf(priority.get(String.valueOf(expression.charAt(i)))) >= Integer
.valueOf(priority.get(operator.peek())))) {
result.append(operator.pop());
}
operator.push(String.valueOf(expression.charAt(i)));
}
}
}
while (!(operator.isEmpty())) {
result.append(operator.pop());
}
return result.toString();
}
public static double exec(String expression) {
int len = expression.length();
Stack<Double> num = new Stack<>();
for (int i = 0; i < len; i++) {
if (Character.isDigit(expression.charAt(i))) {
num.push(Double.parseDouble("" + expression.charAt(i)));
} else {
double op2 = num.pop();
double op1 = num.pop();
switch (expression.charAt(i)) {
case '+':
num.push(op1 + op2);
break;
case '-':
num.push(op1 - op2);
break;
case '×':
num.push(op1 * op2);
break;
case '÷':
num.push(op1 / op2);
break;
}
}
}
return num.pop();
}
}
输入“(1+2×3-(4×5+6)×7)÷3”,输出的后缀表达式为“123×+45×6+7×-3÷”,计算结果为“-58.333333333333336”