Как найти проблему в следующей функции, которая оценивает постфиксные выражения (EmptyStackException)? [дубликат]JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как найти проблему в следующей функции, которая оценивает постфиксные выражения (EmptyStackException)? [дубликат]

Сообщение Anonymous »


Наша задача — вычислить постфиксное выражение, заданное в формате 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;
}
Ошибка возникает в следующей строке кода: total *= stack.pop();

Код: Выделить всё

Exception in thread "main" java.util.EmptyStackException
РЕДАКТИРОВАТЬ:

Код: Выделить всё

            if(initialAssign) {
long temp = stack.pop();
total = stack.pop();
stack.push(temp);
initialAssign = false;
}
Приведенный выше код присваивает итоговому значению правильное начальное значение. Поскольку выражение вычисляется слева направо, в "2 3 9 4 / + *" общее количество должно начинаться с 9, так как нам нужно 9/4, а не 4/9 (

Код: Выделить всё

total /= stack.pop()). Однако когда программа встречает первый оператор, stack.pop()
выведет 4 на основе LIFO. Итак, pop(), 4 сначала во временную переменную, затем pop() присваивает total = 9 и помещает(temp = 4) обратно в стек. поэтому он не теряется.
Логическое значение InitialAssign гарантирует, что оно произойдет только в первом операторе, поскольку последующие значения суммы будут следовать за оценкой слева направо. p>

Однако я проверил на 3 разные точки в цикле и стек не пуст, используя stack.peek(). Более того, я дополнительно проверил с помощью stack.isEmpty() (нет в приведенном выше коде), и он действительно не пуст. Почему стек может внезапно опустеть, когда дело доходит до оператора *? 2 все равно должен присутствовать в стеке.

Подробнее здесь: https://stackoverflow.com/questions/793 ... xpressions
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»