Some suggestions (I'm not sure how indepth you want this ie if it should be treated as a complete implementation or just a sample):
Use templates so your stack can be used for more than just ints
Dynamically allocate memory, don't use a static array. Instead of doing it yourself, use std::vector as the array (now you can remove isFull)
Combining 1) and 2), take the collection type as a type parameter so you could use the same stack class for array based or linked list implementations (ie, what std::stack does), so there's no need to write two implementations
If the only reason you branch on a condition is to return a boolean, just return the condition (ie return top == -1, return top >= MAX - 1)
If you're writing your own collection in C++, implement iterators so you can use it with std::find, range-based for loops and other friends (see stackoverflow.com/questions/816456...)
Either expose isEmpty and don't call it in pop (require the user to check before popping - how C++ does it), or don't expose isEmpty and call it yourself in pop (and assert/throw an exception if it is, instead of returning a sentintel value)
Some suggestions (I'm not sure how indepth you want this ie if it should be treated as a complete implementation or just a sample):