Think of a buffer as just an array. A buffer overflow is when you try to put more items in the array than what the array can hold. In words, it comes from writing. A buffer overrun is when you are iterating over the buffer and keep reading past the end of the array. In other words, it comes from reading.
A stack overflow is much different. Most modern programming environments are stack-based, where they use a stack data structure to control program flow. Every time you call a function, a new item is placed on the program's call stack. When the function return, that item is popped of the stack. When the stack is empty, the program stops. The thing is that this stack has a fixed size, and so it is possible to call too many functions at one time. At this point you have a stack overflow. The most common way to do this is with a function that calls itself (recursion).