pushd and popd are stack-oriented. You may notice with cd that you can do "cd -" to go to your previous directory. Think of pushd and popd as a way to store those up. You pushd into various directories, which loads them up on the stack, then popd and you get cd'd back into those directories (in reverse order).
Now, you may be asking yourself "why?". It's just an old way of doing things back when the speed of stack memory meant something. I'm sure someone could figure out an actual use for it, but every time I see it implemented, it's done to be obscure, not because it couldn't be more simply implemented with an array.