while(!s.isEmpty() && prec(c) <= prec(s.peek()))
• В этом цикле while он проверяет, пуст ваш стек или нет, и только если он не пуст, он будет prec(c) <= prec(s.peek())
while(prec(c) <= prec(s.peek()) && !s.isEmpty())
• В этом цикле while он сначала сравнивает prec(c) <= prec(s.peek())
и только в случае true проверяет, пуст или нет стек.
Второй цикл выдает ошибку, потому что если в вашем стеке ничего нет, он все равно попытается сравнить prec(c) <= prec(s.peek())
, прежде чем придет к выводу, что ваш стек пуст.
Просто спросите себя, что это за сравнение prec(c) <= prec(s.peek())
, если ваш стек пуст?
Итак, просто чтобы прояснить, что вы понимаете => Ваш цикл завершается, когда prec (c) <= prec (s.peek ()) ... но он также завершается, когда ваш стек пуст. Второй цикл while сравнивает значения, в которых одно из этих значений происходит из вашего стека. если ваш стек пуст, что он должен сравнивать? </strong>