栈和队列
栈
栈的基本概念
- 栈(Stack):只允许在一端进行插入或删除的线性表。
- 操作特性:后进先出 (Last In First Out, LIFO)
- 基本操作
栈的顺序存储结构
-
顺序栈:采用顺序存储结构的栈,利用一组地址连续的存储单元存放自栈底到栈顶的数据元素,同时附设一个指针(top)指示当前栈顶元素位置。
-
实现:
①栈顶指针:S.top = -1;②栈顶元素:S.data[S.top]
③进栈:指针先加1,再赋值给栈顶元素;④出栈:先取栈顶元素值,再将指针减1
⑤栈空:S.top == -1;⑥栈满:S.top == MaxSize-1; ⑦栈长:S.top+1 -
共享栈:两个顺序栈共享一个一维数组空间。两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸。
①top0 = -1时0号栈为空;top1 = MaxSize时1号栈为空
②栈满:两指针相邻top1 - top0 = 1
③进、出栈:0号栈指针先加1再赋值,1号栈指针先减1再赋值。出栈相反
④共享栈可以更好利用存储空间,存取复杂度O(1)
栈的链式存储结构
- 链栈:采用链式存储的栈。
- 优点:便于多个栈共享存储空间和提高效率,且不存在栈满上溢的情况,便于插入删除
- 规定:链栈没有头结点,Lhead指向栈顶元素
队列
队列的基本概念
- 队列(Queue):只允许在表的一端进行插入,另一端进行删除的线性表。
- 操作特性:先进先出 (First In First Out, FIFO)
- 基本操作:
队列的顺序存储结构
- 实现:分配一块连续的内存单元,并附设两个指针:队头 front 和队尾 rear
- 操作:①队空:Q.front == Q.rear == 0;②进队:送值到队尾,尾指针加1;③出队:取队头元素值,头指针加1
- 判断队满不能Q.rear == MaxSize,会有假溢出!
- 循环队列:把表从逻辑上视为一个环,当Q.front = MaxSize-1后,再前进就自动到0
- 判断队空or满:①牺牲一个存储单元;②增加size变量;③增加tag变量,增为1删为0
队列的链式存储结构
-
链队列:同时带有头指针和尾指针的单链表。
-
不带头结点的链式队列
-
带头结点的链式队列
-
操作:初始化,判空,入队,出队
双端队列
- 概念:允许两端都可以入队和出队的队列
- 分类:输入受限,输出受限
- 应用:输出串是否合法
栈和队列的应用
栈在括号匹配中的应用
- 算法描述:遇到左括号就入栈,遇到右括号就弹出一个左括号,并判断是否可以匹配;类型不匹配或栈空了(右括号多余了)或多余左括号就异常结束。
栈在表达式求值中的应用
- 后缀表达式计算方法:从左往右扫描,每遇到一个运算符,就让运算符前面最近的两个操作数执行运算,合成一个操作数。(注意操作数的左右顺序)
- 算法描述:扫描,操作数入栈,若扫描到运算符就弹出两个栈顶元素,执行运算,再把运算结果压入栈顶。继续扫描直到处理完所有元素。注意!先出栈的是右操作数
- 前缀表达式计算方法:右边运算符优先计算,先出栈的是左操作数
栈在递归中的应用
- 函数调用特点:最后被调用的函数最先执行结束(LIFO)
- 函数调用栈:①局部变量②实参③调用返回地址
- 递归问题:把原始问题转化为属性相同但规模较小的问题。需要①递归表达式(递归体)②边界条件(递归出口)
- 应用栈:每进入一层递归就将递归调用需要的信息压入栈顶,每退出一层递归就从栈顶弹出相应信息
队列在层次遍历中的应用
- 对树的遍历算法描述:①号根结点入队,遍历它的子节点加入队尾,并让①出队,再遍历①的子节点的子节点这样。
- 对图的广度优先遍历算法描述:建立队列,①号入队,检查与①相连的结点,将没有被处理过的结点入队,让①出队,以此类推。
队列在计算机系统中的应用
- CPU资源分配:多个进程争抢使用有线系统资源时,先来先服务(FCFS)
- 打印机缓冲区:先来排队,缓解主机与打印机速度不匹配的问题
特殊矩阵的压缩存储
数组的定义
- 数组:由n个相同类型的数据元素构成的有限序列
- 数组的维界:下标的取值范围
- 数组一旦被定义,其维数和维界就不再改变
数组的存储结构
- 一维数组:各数组元素大小相同,物理上连续存放。知道起始地址LOC就行
- 二维数组:存储有行优先和列优先两种,实现线性存储,随机存取
矩阵的压缩存储
- 对称矩阵
策略:只存储主对角线+下三角区
按行优先原则将各元素存入一维数组中
数组大小:(1+2+…+n) = (1+n)*n/2
使用“映射函数”将矩阵下标–>一维数组下标:计算aij是第几个元素 - 三角矩阵
策略:将上(下)三角区存入一维数组,并在最后一个位置存储常量C - 三对角矩阵
定义:又称带状矩阵,当|i - j| >1时,aij = 0 (异爪型,平行三根儿)
策略:只存带状部分
aij是第(2i+j-2)个元素,i = [(k+1)/3+1],j = k-2i+3
稀疏矩阵
- 定义:非零元素远远少于矩阵元素个数
- 策略:
(1)顺序存储:三元组<行,列,值>,必须依次扫描,失去随机存储特征
(2)十字链表法
节点结构: