文章目录
第三章 栈,队列和数组
栈(stack)
栈的定义
- 只允许在一端进行插入或删除操作的线性表
- 重要术语:栈顶,栈底,空栈
栈的基本操作
- 创建,销毁,进栈,出栈,
栈的常考题型
- 可能是先全部进栈,再出栈;也可能是边进边出;
- 可能的出栈顺序的排列组合为卡特兰数,了解即可
- 考试多数出选择题,选出可能的情况
知识点小结 - 栈是一种进出受限的线性表
顺序栈的实现
顺序栈的定义,top存放栈顶位置
初始化操作
- 初始化的栈没有存放元素,给top值为-1,也方便判断栈空
新元素入栈
课本写法,注意区分前++和后++
出栈操作
- 注意区分前++和后++,不要把top指针指错位置,返回错误的元素
- 这种删除这是逻辑删除,实际数据还残留在内存中
读栈顶元素 - 与删除操作相似,也是返回当前top指向的元素
- 不同的是,读栈顶操作无需删除元素,无需移动top值
另一种实现方式
- top指向下一个元素的位置
- 因此,初始化顺序栈以后,top的值应该是0
- 入栈,出栈,会有所不同,注意区分
顺序栈的缺点:栈的大小不可改变
共享栈:
- 两个栈共享一片空间
- top1从上往下依次递增
- top0从下往上依次递增
知识点小结 - 采用声明栈的方式进行的定义,系统自动分配内存,并没有使用malloc
- 因此内存的回收也会在函数结束由系统进行
链栈的实现
回顾
- 头插法建立单链表,只对头结点后进行插入操作,对应了进栈操作
- 单链表的删除操作,只对头结点后进行删除操作,对应了出栈操作
单链表的定义
- 也区分带头结点和不带头结点,判空不一样
- 可以理解为操作受限的单链表,代码基本相通,可以直接参考
知识点小结
队列基本概念
队列的定义
- 也是一种操作受限的线性表
- 队列与栈对比着理解
- 队列特点:先进先出
队列的定义
队列的基本操作
知识点小结
队列顺序实现
静态数组的方式实现,定义
初始化,队头队尾都指向0
插入数据元素
- 如何判断队列满了?
- rear为10不一定满,因为front前面可能有空余
循环队列 - 将存储空间在逻辑上形成环状
- 将无限的整数域映射到有限的整数集合上
- 这种方式也叫做循环队列
- 循环队列已满的条件
判空逻辑
- 不能用rear=front,因为这是初始化时队列为空的判断逻辑
- 代价:牺牲一个存储单元
出队操作
查询操作,通常队列的查询就是查询队头元素
方案一:判断队满,队空
方案二:判断队满,队空
- 增加一个size记录长度
方案三:判断队满,队空 - tag记录最近到底是进行了插入还是删除操作
其他出题方法,和上面对比理解
- 队尾指针也可能指向队尾元素,代码略有不同