Ошибка была в неправильном парсинге постфиксной нотации. У меня сначала была проверка на то, что итерируемый элемент - число, а стоило мне поменять местами эти проверки (сначала проверяю итерируемый элемент на оператор) - всё заработало.
Вот незначительная правка кода:
private void parse() {
String currentElement = "";
String[] elements = regular.split(" ");
double number1, number2, interAns;
for (int i = 0; i < elements.length; i++) {
currentElement = elements[i];
// Check if current element is operator
if (isOperator(currentElement)) {
if (stack.size() > 1 && !currentElement.equals("")) {
number2 = stack.pop();
number1 = stack.pop();
// Make calculations
if (currentElement.equals("+"))
interAns = number1 + number2;
else if (currentElement.equals("-"))
interAns = number1 - number2;
else if (currentElement.equals("*"))
interAns = number1 * number2;
else if (currentElement.equals("/"))
interAns = number1 / number2;
else interAns = 0;
stack.push(interAns);
}
} else {
try {
double element = Double.parseDouble(currentElement);
stack.push(element);
} catch (NumberFormatException e) {
System.out.println("Hmm...");
}
}
/*
try {
double element = Double.parseDouble(currentElement);
stack.push(element);
} catch (NumberFormatException e) {
if (!currentElement.equals("")) {
number2 = stack.pop();
number1 = stack.pop();
// Make calculations
if (currentElement.equals("+"))
interAns = number1 + number2;
else if (currentElement.equals("-"))
interAns = number1 - number2;
else if (currentElement.equals("*"))
interAns = number1 * number2;
else if (currentElement.equals("/"))
interAns = number1 / number2;
else interAns = 0;
stack.push(interAns);
}
}*/
}
interAns = stack.pop();
result = interAns;
}
// Новая функция
private boolean isOperator(String s) {
return s.equals("+")|| s.equals("-") || s.equals("*") || s.equals("/");
}
Раньше мой код не мог парсить вот такие выражения:
infix: 12 - 5 * 2 + 16 / 4 - 50 / 10
(
postfix is 12 5 2 * - 16 4 / + 50 10 / -
) - не совсем понимаю почему, но стоило мне поменять местами сравнения, так всё сразу заработало!
Ну и ещё стоит отметить то, как отметил
Денис Загаевский , что надо добавить доп.проверку на пустоту стека (
if (stack.size() > 1) ...
).