Исходный файл или включаемый файл должны включать все необходимые файлы.
Так что, если stack.h зависит от объявлений в util.h, то вам следует #include "util.h"
в stack.h. Таким образом, любой модуль, который включает в себя stack.h, не должен беспокоиться о включении util.h и размещении его в правильном порядке.
Если модуль решает включить и то, и другое, это тоже хорошо. Добавленные вами стражи включения должны решить эту проблему.
Вы не указали источник stack.c, но, скорее всего, включили stack.h перед util.h. Это объясняет вашу проблему, поскольку определения, необходимые для stack.h, появляются после них, а не до.