The stack is memory. some processors it is a special internal memory but it is memory, most often it is really nothing more than a stack pointer register that points into system memory and it is up to the programmers (operating system and/or application) to make sure that their stack pointer doesnt point at some memory being used for something else.
The idea is that you have a limited set of registers, even if you have more than enough registers there may be times for example that you want to do recursion or some other such thing that requires you to re-use some registers being used for something else. The stack provides a simple/fast malloc and free basically for temporary storage of things, registers or local variables or return addresses or whatever you need to store temporarily.
Why you would use a stack instead of ram or even registers if you have many, is that with a stack you can as mentioned for example do recursion, you can enter the same code several/hundreds of times and that code for example could have some local variables and you could keep track of all of those individual instances of each local variable, hundreds of copies if need be. Because the way you use the stack is relative to the stack pointer, you dont have a hardcoded address you have a hardcoded reference to the stack pointer, so if you enter the function one time and the stack pointer happens to be at 0x1000 your first variable might then be at 0x1000 and the second at 0x1004, for example, your function may "add" 16 bytes of information to the stack and then call itself, this time when it enters the stack pointer would be at 0xFF0, and your first variable at 0xFF0 and second at 0xFF4, and so on until your stack pointer collides with something else or you are done.