Это полностью зависит от варианта использования. В первом коде у вас есть условие ИЛИ для пустого стека и проверка значения элемента, если элемент существует. Итак, это понятно, и вы можете продолжить работу с кодом.
Во втором коде вы хотите выполнить что-то другое для обоих условий. Следовательно, вы поместили условия в цикл if else.
Хорошая практика становится понятной, когда вы не хотите, чтобы ваш код ломался или проходил тестовые сценарии. Вы можете не захотеть что-то в своем коде, когда стек пуст.
std::stack<int>stk;
if(stk.top() < 10 )
{
//Do something.
}
else if(stk.empty() == true)
{
//Do something
}
Это приведет к ошибке времени выполнения, так как стек пуст, но вы обращаетесь к верхнему элементу перед проверкой состояния пустого стека.
Ошибка ошибки
Надеюсь, ответ прояснит.