I know the definition for a stack.
First of all, you have to allocate yourself some memory, and the allocation must be of a fixed size; i.e. int[20], char[15] etc. You then have a pointer which points to the address at the top of the stack.
Now basically the two operations you can do are to push things onto the stack, and pop things off of the stack. When you push things onto the stack, you increase the address of the pointer to point at the new object, and when you pop things off you decrease the address to the previous object. All of this means that you have a FILO data structure, which is useful for the reasons mentioned earlier in the thread.
As far as I'm aware, a heap is just an area of memory that can be accessed via a hashing algorithm (i.e. some algorithm that determines the memory address of the data you're putting onto the heap).
Hope this helps.