Stack is a certain amount of memory given you for auto (local) variables. Although its implementation is not specified by the language, it is often implemented using the processor's stack. Arguments to funtions are placed there, and variables local to the function are placed there. If I can dig up a little explanation that I have for that type of implementation, I'll post it in this thread.
The heap, or free store (not a heap, as in heap sort), is a chunk of memory set aside for processes to borrow memory from, dynamically. If you borrow it, you have to return it. If you don't, you cause memory leaks. Typically, when you return it, it doesn't go back into the main heap, but is freed for your further use for different purposes. Most language implementations make arrangements for you to return it to the main heap, though, if you like. Most modern, capable OSes can use virtual memory techniques, involving mass storage, to effectively make available very large amounts of heap.
In addition to the stack and heap you get memory for your code and for your static or global data.