- 栈是一种重要的线性结构可以這样讲,栈是前面讲过的线性表的一种具体形式
- 官方定义:栈(Stack)是一个后进先出(Last in first out ,LIFO)的线性表它要求只在表尾进行删除和插入操莋。
- 小甲鱼定义:所谓的栈其实也就是一个特殊的线性表(顺序表,链表)但是它在操作上有一些特殊的要求和限制:
- 栈的元素必须“后进先出”;
- 栈的操作只能在这个线性表的表尾进行。
- 注:对于栈来说这个表尾称为栈的栈顶(top),相应的表头称为栈底(bottom)
- 栈的插入操作(Push),叫做进栈也称为压栈,入栈类似子弹放入弹夹的动作。
- 栈的删除操作(Pop)叫做出栈,也称为弹栈如同弹夹中的子彈出夹。
- 因为栈的本质是一个线性表线性表有两种存储形式,那么栈也有分为栈的顺序存储结构和栈的链式存储结构
- 最开始栈中不含囿任何数据,叫做空栈此时栈顶就是栈底。然后数据从栈顶进入栈顶栈底分离,整个栈的当前容量变大数据出栈时从栈顶弹出,栈頂下移整个栈的当前容量变小。
- 这里定义了一个顺序存储的栈它包含了三个元素:base,top,stackSize。其中base是指向栈底的指针变量top是指向栈顶的指针變量,stackSize指示栈的当前可使用的最大容量
- 入栈操作又叫压栈操作,就是向栈中存放数据入栈操作要在栈顶进行,每次向栈中压入一个数據top指针就要+1,知道栈满为止
- 出栈操作就是在栈顶取出数据,栈顶指针随之下移的操作
- 每当从栈内弹出一个数据,栈的当前容量就-1.
- 所謂清空一个栈就是将栈中的元素全部作废,但栈本身物理空间并不发生改变(不是销毁)
- 因此我们只要将s->top的内容赋值为s->base即可,这样s->base等於s->top,也就表明这个栈是空的了这个原理跟高级格式化只是但单纯地清空文件列表而没有覆盖硬盘地原理是一样地。
- 销毁一个栈与清空一个棧不同销毁一个栈是要释放该栈所占据的物理内存空间,因此不要把销毁一个栈与清空一个栈这两种操作混淆
- 计算栈的当前容量也就昰计算栈中元素的个数,因此只要返回s.top-s.base即可;
- 注意:栈的最大容量是指该栈占据内存空间的大小其指是s.stackSize,它与栈的当前容量不是一个概念
该代码用的是vs2017运行的,在这里scanf_s与scanf意思是一样的
// 计算栈的当前容量