上篇说了怎么实现一个不带括号的表达式求值方法,由于现在的带了括号了,之前的方法就不适用了。
上篇对应地址:java 栈的应用 - 实现简单的加减乘除的计算器
这里主要是分两步:
- 将给定的输入转成后缀表达式;
- 根据后缀表达式进行运算;
先看转后缀表达式的代码:
import java.util.Stack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 中缀表达式转后缀表达式
*/
public class ToPostfixExpression {
private static final int CAPACITY = Integer.MAX_VALUE;
private final Stack<Operator> ops = new Stack<>();
private final Stack<String> results = new Stack<>();
private final Pattern numPattern = Pattern.compile("\\d*\\.?\\d*");
private final Pattern opPattern = Pattern.compile("[+\\-*/()]");
public String apply(String input) {
// 1 + ((2+3) * 4 ) - 5
input = input.replaceAll(" ", "");
Matcher numMatcher = numPattern.matcher(input);
Matcher opm = opPattern.matcher(input);
for (int pos = 0; pos < input.length(); ) {
boolean found = numMatcher.find(pos);
if (found) {
int start = numMatcher.start();
int end = numMatcher.end();
pos = end;
if (start != end) {
String sub = input.substring(start, end);
// System.out.printf("number: (%d, %d)=%s\n", start, end, sub);
results.push(sub);
}
}
found = opm.find(pos);
if (found) {
int start = opm.start();
int end = opm.end();
pos = end;
if (start != end) {
try {
String sub = input.substring(start, end);
// System.out.printf("op: (%d, %d)=%s\n", start, end, sub);
Operator action