in reply to
Why are "push", "pop", "shift" and "unshift" so named?
Push onto a stack, pop off the top of the stack.
I think pop was an assembly language instruction in 6502 and someone else said earlier it seems. Data is stored on the stack and you pop the last one off the top.
Shift/unshift I admit has always been confusing to me if I think about it long enough, since I mix it up with binary powers (i.e. the "shift" operator << in perl). There is an assembler command to bitwise shift everything one digit up, etc.. The only useful thing I can say is that you get the first argument provided by the user from the command line with shift, you are shifting it off the ARGV array. In a subroutine you can get the first argument off the @_ with which it got called with shift. Basically if you think of shift as shifting something off the bottom then unshift is the (confusing) reverse.
I miss peek() which looked at a memory location without touching it and poke() which touched the location, i.e. to drive the speaker (in the reverse direction I discovered)
However you are entirely right. You cannot "shift" trays off the bottom of a stack easily, they are going to be held down by the weight of the trays on top. Maybe think of shift as "shaft". You are going to take a long steel pole and thrust it at the bottom-most tray to shoot it out from the bottom of the stack. It gets shafted! (beat up / betrayed / knocked out / messed with) Let's use this one without telling anybody.. :)
Actually this is eminently useful. Unshafting is then making something not shafted, i.e. making things clean and proper. Which would obviously mean picking the knocked out tray off the floor and wedging it carefully back in under the bottom of the stack of trays. At least I can convince myself about it.