I don't know if anyone has had any trouble with creating an iterator object to go hand-in-hand with data structures (stacks, queues, etc.), and I thought I would present an implementation that I'm currently using and updating in my custom library I'm working on.
TBH - I wouldn't associate iterators with push/pop style operations.
In most people's minds including mine - Iterators are associated with stepping through containers ( iterators exhibit pointer type semantics).
So iterators go forward/backwards through a container and you get the object at the iterator position by dereferencing the iterator like a pointer.
The contatiner may have operations such as copy/remove/find which
may take an iterator to that type of container or return an iterator to an object
in the container - but basicaly the iterators are fairly passive things.