数据结构——栈、队列和数组

王道笔记

  • 第三章 栈、队列和数组
    • 3.1 栈
      • 1.栈的基本概念
        • 1)栈的基本操作
        • 2)栈的常考题型
      • 2.栈的顺序存储实现
        • 1)顺序栈的定义
        • 2)初始化操作
        • 3)进栈操作
        • 4)出栈操作
        • 5)读栈顶元素操作
        • 6)另一种(push、pop、GetTop)方式
        • 7)共享栈
      • 3.栈的链式存储实现
        • 1)进栈
        • 2)出栈
        • 3)链栈的定义
    • 3.2 队列
      • 1.队列的基本概念
        • 1)队列的操作
      • 2.队列的顺序实现
        • 1)队列的顺序实现
        • 2)队列的初始化
        • 3)入队操作
        • 4)循环队列
        • 5)循环队列——入队操作
        • 6)循环队列——出队操作
        • 7)判断队列已满/已空
      • 3.队列的链式实现
        • 1)队列的链式实现
        • 2)初始化
          • 带头结点
          • 不带头结点
        • 3)入队
          • 带头结点
          • 不带头结点
        • 4)出队
        • 5)队列满的条件
      • 4.双端队列
        • 1)定义
    • 3.3 栈和队列的应用
      • 1.栈在括号匹配中的应用
        • 1)算法演示
        • 2)流程图演示
        • 3)代码实现
      • 2.栈在表达式求值中的应用(上)
        • 1)算数表达式
        • 2)中缀、后缀、前缀表达式
        • 3)中缀表达式转后缀表达式(手算)
        • 4)后缀表达式的计算(手算)
        • 5)后缀表达式的计算(机算)
        • 6)中缀表达式转前缀表达式
        • 7)前缀表达式的计算
      • 3. 栈在表达式求值中的应用(下)
        • 1)中缀表达式转后缀表达式(手算)
        • 2)后缀表达式的计算(机算)
        • 3)中缀表达式的计算(用栈实现)
      • 4.栈在递归中的应用
        • 1)函数调用的背后
        • 2)栈在递归中的应用
      • 5. 队列的应用
        • 1)树的层次遍历
        • 2)图的广度优先遍历
        • 3)队列在操作系统中的应用
    • 3.4 特殊矩阵的压缩存储
      • 1.一维数组的存储结构
      • 2.二维数组的存储结构
      • 3.普通矩阵的存储
      • 4.对称矩阵的压缩存储
        • 1)行优先
        • 2)列优先
      • 5.三角矩阵的压缩方式
        • 1)下三角矩阵
        • 2)上三角矩阵
        • 3)三对角矩阵又称带状矩阵
        • 4)稀疏矩阵的压缩存储

第三章 栈、队列和数组

3.1 栈

image-20231022210602073

1.栈的基本概念

image-20231022163812219

  • 栈(Stack)是只允许在一端进行插入或删除操作的线性表

  • 一种操作受限的线性表,只能在栈顶插入、删除。

  • 特性:先进后出(LIFO)(Last In First Out)

image-20231022154706322

1)栈的基本操作
  • 只能在栈顶操作

image-20231022154743615

2)栈的常考题型

image-20231022154912975

2.栈的顺序存储实现

image-20231022163744337

1)顺序栈的定义

image-20231022164033658

2)初始化操作

image-20231022164108130

3)进栈操作

image-20231022164216946

4)出栈操作

image-20231022164313835

5)读栈顶元素操作

image-20231022164413143

  • 出栈的唯一区别就是,top不需要–
6)另一种(push、pop、GetTop)方式

image-20231022164931210

进栈和出栈

image-20231022165033931

7)共享栈

image-20231022170039513

3.栈的链式存储实现

image-20231022170404237

  • 链头=栈顶,对链头进行操作
1)进栈

image-20231022170635732

2)出栈

image-20231022170806594

3)链栈的定义

image-20231022171041944

3.2 队列

image-20231022210340568

1.队列的基本概念

image-20231022173258513

  • 队列(Queue)是只允许在一端进行插入,在另一端删除的线性表
  • 重要术语:队头、队尾、空队列
  • 队列的特点:先进先出(FIFO)(First In First Out)

image-20231022173636145

1)队列的操作

image-20231022173720596

2.队列的顺序实现

image-20231022195500823

1)队列的顺序实现

image-20231022195600615

2)队列的初始化

image-20231022195631512

3)入队操作

image-20231022195813243

4)循环队列

image-20231022195857140

5)循环队列——入队操作

image-20231022200001315

6)循环队列——出队操作

image-20231022200044055

7)判断队列已满/已空
  • 指向队尾元素的下一个元素

方案一:

image-20231022200402115

(Q.rear+1)%MaxSize==Q.front

方案二:定义一个size

image-20231022200440596

size==MaxSize

方案三:定义一个tag

image-20231022200529635

front == rear && tag == 1

image-20231022200617067

  • 指向队尾元素的代码

判空:

image-20231022201236454

判满:

3.队列的链式实现

image-20231022204803933

1)队列的链式实现

image-20231022204927262

2)初始化
  • 带头结点

image-20231022205015857

  • 不带头结点

image-20231022205158059

3)入队
  • 带头结点

image-20231022205434215

image-20231022205434215

  • 不带头结点

image-20231022205537434

4)出队
  • 带头结点

image-20231022211440058

  • 不带头结点

image-20231022211743201

5)队列满的条件

image-20231022211834600

4.双端队列

image-20231022215435839

1)定义

注:栈中合法的序列,双端队列中也一定合法
image-20231029164958671

3.3 栈和队列的应用

1.栈在括号匹配中的应用

image-20231029164958671

1)算法演示

image-20231029165227838

2)流程图演示

image-20231029165358522

3)代码实现

image-20231029165503341

2.栈在表达式求值中的应用(上)

image-20231029173041320

计算时:后缀表达式先弹出的元素是“右操作数”

计算时:前缀表达式先弹出的元素是“左操作数”

1)算数表达式

由三部分组成:操作数运算符界限符(界限符也就是“( )”,界限符反应了计算机的先后顺序)

逆波兰表达式 = 后缀表达式;波兰表达式 = 前缀表达式

2)中缀、后缀、前缀表达式

image-20231029174544728

3)中缀表达式转后缀表达式(手算)

image-20231029174758157

“左优先”原则:只要左边的运算符能先计算,就优先算左边的(可保证运算顺序的唯一)

4)后缀表达式的计算(手算)

image-20231029175335880

特点:最后出现的操作数先被运算(栈LIFO:后进先出)

5)后缀表达式的计算(机算)

image-20231029175831860

注意:先出栈的是操作数。

6)中缀表达式转前缀表达式

image-20231029180356283

中缀转前缀“右优先”

7)前缀表达式的计算

image-20231029180600184

注意:先出栈的是操作数。

3. 栈在表达式求值中的应用(下)

image-20231029221055681

1)中缀表达式转后缀表达式(手算)

image-20231029221304144

2)后缀表达式的计算(机算)

image-20231029221835325

此时的栈用来存放还不能确认运算次序的运算符

注意:*/ 优先级高于 ±

3)中缀表达式的计算(用栈实现)

image-20231029222725446

此时的栈用来存放还不能确认运算次序的操作数

4.栈在递归中的应用

image-20231105151245937

1)函数调用的背后

image-20231105151353060

2)栈在递归中的应用

image-20231105151443397

递归算法求阶乘

image-20231105151557082

缺点:太多递归层可能导致栈溢出。因为系统开辟的栈是有限的。

再次思考递归带来的空间复杂度:递归层数越多,空间复杂度越高。

递归算法求斐波那契数

image-20231105152032992

5. 队列的应用

1)树的层次遍历

image-20231105153028928

:左右节点进队之后根节点,方可出。

2)图的广度优先遍历

image-20231105153212517

3)队列在操作系统中的应用

image-20231105153317515

image-20231105153348515

3.4 特殊矩阵的压缩存储

image-20231105172231253

1.一维数组的存储结构

image-20231105172524411

2.二维数组的存储结构

image-20231105172644403

image-20231105172704829

image-20231105172718457

3.普通矩阵的存储

image-20231105172928800

4.对称矩阵的压缩存储

image-20231105173126358

image-20231105173155024

1)行优先

image-20231105173837457

2)列优先

image-20231105174049923

5.三角矩阵的压缩方式

image-20231105174151778

1)下三角矩阵

image-20231105174214749

2)上三角矩阵

image-20231105174313261

3)三对角矩阵又称带状矩阵

image-20231105174647908

给出数组下标求i,j

image-20231105174753740

4)稀疏矩阵的压缩存储

第一种方法

image-20231105175207946

第二种方法:十字链表法

image-20231105175257011

常见考题

image-20231105175318706

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值