I don't see how that can work. data-size would point before the data pointer and hence into unchartered territory. Assuming that you use as a basis a simple c-array, then begin should just return data and end should return data + size.
Well the way I implemented my stack, data-size points to the beginning of the stack, since after a push or a pop, data points to the item after the last available item. In other words, the end of my c-style pointer array is the top of the stack, and the beginning of the array is the bottom of the stack. That being the case, data-1 points to the end of the stack.

Are they any advantages to implementing this differently? It seems to be working now and fully functional.
An iterator can be any custom class, as long as operator ++ (and -- resp + and -) is implemented. I'll post an article in the next few days which shows a custom iterator class.
Great, I look forward to reading it.