目录
一、栈区
1.定义
之前我们提到过的栈区,是一种系统栈,由操作系统对栈区进行操作处理。
2.功能
栈区具有以下功能:
1. 存储局部变量
2. 函数的形参和返回值
3. 函数调用关系(保护线程和恢复现场)
二、栈结构
1.定义
今天我们提到的栈结构,是指一种线性的数据结构,由用户对栈区进行操作处理。
栈:只允许从一端进行数据的插入和删除的线性存储结构。
无论是栈结构与栈区,只要是栈均遵循FILO,即先进的后出、后进的先出。
2.分类
(1)逻辑结构
从逻辑结构上看,栈均为线性结构。
(2)物理结构
从物理结构上看,栈分为顺序栈与链式栈。
-
顺序栈
其中,顺序栈又分为四类:满增栈、空增栈、满减栈、空减栈
①满栈、空栈:栈顶所在位置是否存有元素
满栈:栈顶有数据,入栈时栈顶先向上移,然后将数据装入栈顶;出栈时数据先移走,然后栈顶向下移。
空栈:栈顶无数据,入栈时先将数据装入栈顶,再将栈顶向上移;出栈时栈顶先向下移,然后将数据移走。
②增栈、减栈:按照栈的生长方向区分
增栈:内存低地址为栈底,数据入栈向高地址方向延伸存储,栈顶在内存高地址。
减栈:内存高地址为栈底,数据入栈向低地址方向延伸存储,栈顶在内存低地址。
-
链式栈
链式栈即要求每个数据均有指针域,指向下一个元素。
链式栈与顺序栈的时间复杂度均为O(1),但顺序栈需事先确定一个固定的长度,会造成内存浪费,而链式栈对长度无限制,使用起来更灵活。
如果栈的使用过程中元素变化不可预料,那么最好使用链式栈,反之,如果它的变化在可控范围内,建议使用顺序栈。
三、练习
1.链式栈
(1)创建栈
(2)入栈(头插)
(3)出栈(头删)
出栈仅销毁链表结点,出栈的数据存储到数据变量中,以备调用
(4)遍历打印
(5)获取栈顶元素
(6)清空栈
(7)销毁栈
用valgrind工具查看销毁结果