Eu vi isso e talvez te ajude:
A stack is an area of memory that behaves like a stack ADT. It is used for storing information/objects that will not grow in size and will not be moved around in memory (in other words, the stack is used for storing static data objects). The stack requires very little janitor work from the OS/programmer.
The heap on the other hand, is a dynamic area of memory. You can use the heap to create data objects that are likely to grow (like vectors, maps, sets, etc.). The heap tends to suffer from fragmentation issues and needs to be garbage collected every so often to maintain its usability. Hence, the heap require much intervention from the memory management system of the OS or the programmer.
Na verdade o conceito de Stack (pilha) mais básico possível é uma estrutura de dados onde o último elemento que foi inserido é o primeiro a ser retirado.
O SO usa isso, por exemplo, quando um método A faz chamada ao B. O método A tem seu contexto de software salvo na pilha já que quando o método B terminar, espera-se recontinuar de onde A parou.
O heap é usado com alocação dinâmica de memória. Quando, em C, vc faz
int *x = malloc(sizeof(int));
ou em java qnd vc faz