数组
- 我们知道数组是一种线性结构,并且可以在数组的任意位置插入和删除数据
- 但是有时候我们为了实现某些功能,必须对这种任意性加以限制
- 而栈和队列就是比较常见的受限的线性结构
栈(stack)
栈(stack)
是一种受限的线性表,后进先出(LIFO)
- 其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,吧另一端称为栈底。
- LIFO(last in first out)表示后进入的元素,第一个弹出栈空间,类似于自动餐托盘,最后放上的托盘,往往先拿出去使用
- 向一个栈插入新元素又称为进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之称为新的栈顶元素;
- 把一个栈删除元素又称为出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素称为新的栈顶元素。
程序中什么是使用栈实现的呢?
函数调用栈
- 我们知道函数之间和相互调用:A调用B,B中又调用C,C中又调用D
- 那么在执行的过程中,会先将A压入栈,A没有执行完,所以不会弹出栈
- 在A执行过程中又调用了B,会将B压入栈,这个时候B在栈顶,A在栈底
- 如果这个时候B可以执行完,那么B会弹出栈,但是B有执行完吗?没有,它调用了C
- 所以C会压栈,并且在栈顶,而C又调用了D,D会压入到栈顶
- 所以当前栈顺序为:栈底A->B->C->D栈顶
- D执行完,弹出栈,C,B,A依次弹出栈
- 所以我们有函数调用栈的称呼,就来自于它们内部的实现机制(通过栈实现)