栈是一种重要的线性结构,可以说是线性表的一种具体形式
官方定义:栈是一个后进先出的线性表,它要求只在表尾进行删除和插入操作
栈是一种特殊的线性表(顺序表、链表),操作上有一些特殊要求:
1.栈的元素必须“后进先出”。
2.栈的操作只能在这个线性表的表尾进行。
注:对于栈来说,表尾称为栈的栈顶(top),相应的表头称为栈底(bottom)
栈的插入操作称为Push,叫做进栈/压栈/入栈。类似子弹上膛的过程
栈的删除操作称为Pop,叫做出栈/弹栈/。如同弹夹中子弹出夹。
栈本质是线性表,有两种存储形式,栈的顺序存储结构和栈的链式存储结构。常用的是栈的顺序存储结构。栈的顺序存储结构
栈的顺序存储结构:最开始栈中没有任何数据,叫做空栈。此时栈底就是栈顶,之后数据从栈顶进入,栈顶栈底分离,整个栈的当前容量变大。数据出栈时从栈顶弹出,栈顶下移,整个栈的当前容量减小。
入栈操作又称压栈,要在栈顶进行,每次向栈中压入一个数据,top指针+1,直到栈满为止。
出栈就是从栈顶取出数据,栈的当前容量-1,指针下移
清空一个栈就是将栈中的元素全作废,但栈本身物理空间并不发生改变。只需要将栈顶指向栈底。原来的数据还存在,但是读取不到。
销毁一个栈则是释放掉该栈所占据的物理内存空间。从栈底一个个往上销毁/释放各个单元。(不从栈顶开始是因为栈顶上还有未赋值的单元,从栈顶销毁则其上方无法被销毁)
计算栈的当前容量:就是计算栈中元素的个数,只需返回栈顶-栈底即可
栈的最大容量是指该栈占据内存空间的大小,指栈能够容纳多少数据,它与栈的当前容量不是一个概念。
可以用栈来实现二进制到十进制的转化,比如栈内放二进制数据,之后一个一个弹出并乘2的次数次幂,就能得到十进制数。
如果用栈来进行二进制到八进制的转换,需要两个栈,一个栈放二进制数,每弹出三个组合成一个八进制数,存放到另一个栈中。