Пока цикл не работает - PullRequest
0 голосов
/ 10 мая 2018
while(!s.isEmpty() && prec(c) <= prec(s.peek())) {}

Вышеуказанное утверждение в моей программе выполнено правильно

Но приведенный ниже оператор дает мне emptyStackError

while(prec(c) <= prec(s.peek()) && !s.isEmpty()) {}

Изменения, которые я сделал, только в операторе while, который дает мне ошибку? Почему рабочие в обоих случаях были разные ??

Ответы [ 2 ]

0 голосов
/ 10 мая 2018
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>

0 голосов
/ 10 мая 2018

В вашем while состоянии есть 2 чека, которые and вместе с &&:

while(!s.isEmpty() && prec(c) <= prec(s.peek()))

Эти 2 последовательности проверок имеют значение. Сначала нужно проверить, пусто ли stack. Если это так, то это не относится ко второй проверке. Если он не пустой, он делает s.peek() в стеке для проверки prec(c) <= prec(s.peek()).

С другой стороны, если у вас есть:

while(prec(c) <= prec(s.peek()) && !s.isEmpty())

Вторая проверка !s.isEmpty() в основном бесполезна, так как она не помешала коду выполнить s.peek(), в случае empty stack. Так что бросает empty stack error / exception.

Следовательно, s.isEmpty() должен предшествовать второй проверке.

...