Наша задача — вычислить постфиксное выражение, заданное в формате String, и вернуть ответ в виде Long. Выражение имеет характеристики, в которых каждый элемент разделен одним пробелом и содержит только 4 оператора +, -, *, \. Например. "2 3 9 4 / + *"
Проблема в том, что мой код сталкивается с исключением EmptyStackException:
Код: Выделить всё
public static long evaluate(String s) {
String[] byUnit = s.split("\\s");
long total = 0L;
boolean initialAssign = true;
Stack stack = new Stack();
for(String unit: byUnit) {
try {
stack.push(Long.parseLong(unit));
//System.out.println(stack.peek());
continue;
}catch(Exception e) {
if(initialAssign) {
long temp = stack.pop();
total = stack.pop();
stack.push(temp);
initialAssign = false;
}
//System.out.println(stack.peek());
switch(unit) {
case "+":
total += stack.pop();
//System.out.println(stack.peek());
case "-":
total -= stack.pop();
case "*":
total *= stack.pop();
case "/":
total /= stack.pop();
}
}
}
return total;
}
Код: Выделить всё
Exception in thread "main" java.util.EmptyStackException
Код: Выделить всё
if(initialAssign) {
long temp = stack.pop();
total = stack.pop();
stack.push(temp);
initialAssign = false;
}
Код: Выделить всё
total /= stack.pop()). Однако когда программа встречает первый оператор, stack.pop()Логическое значение InitialAssign гарантирует, что оно произойдет только в первом операторе, поскольку последующие значения суммы будут следовать за оценкой слева направо. p>
Однако я проверил на 3 разные точки в цикле и стек не пуст, используя stack.peek(). Более того, я дополнительно проверил с помощью stack.isEmpty() (нет в приведенном выше коде), и он действительно не пуст. Почему стек может внезапно опустеть, когда дело доходит до оператора *? 2 все равно должен присутствовать в стеке.
Подробнее здесь: https://stackoverflow.com/questions/793 ... xpressions
Мобильная версия