第3章 栈和队列

栈的基本概念

  • 栈(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. 对称矩阵
    策略:只存储主对角线+下三角区
    按行优先原则将各元素存入一维数组中
    数组大小:(1+2+…+n) = (1+n)*n/2
    使用“映射函数”将矩阵下标–>一维数组下标:计算aij是第几个元素
  2. 三角矩阵
    策略:将上(下)三角区存入一维数组,并在最后一个位置存储常量C
  3. 三对角矩阵
    定义:又称带状矩阵,当|i - j| >1时,aij = 0 (异爪型,平行三根儿)
    策略:只存带状部分
    aij是第(2i+j-2)个元素,i = [(k+1)/3+1],j = k-2i+3

稀疏矩阵

  • 定义:非零元素远远少于矩阵元素个数
  • 策略:
    (1)顺序存储:三元组<行,列,值>,必须依次扫描,失去随机存储特征
    (2)十字链表法
    在这里插入图片描述
    节点结构:
    在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值