Jack Schultz

Line 97-102: The re-allocation and copying should ONLY happen in grow(), not in add(). add() should be constant time unless grow() is called.
Line 114-125: Same problem in remove(). Do not reallocate and copy every single time you add/remove. In fact, remove() should never resize the array, only add() needs to do that (we grow() during add(), but we never shrink)
Line 141: Your grow() does not treat the array as being circular.