【王道数据结构】第三章 栈和队列

第三章 栈和队列

  • 3.1 栈
    • 3.1.1 栈Stack的基本概念
    • 3.1.2 栈的顺序存储结构
      • 1、顺序栈的实现
      • 2、共享栈
    • 3.1.3 栈的链式存储结构
  • 3.2 队列
    • 3.2.1 队列的基本概念
    • 3.2.2 队列的顺序实现
      • 循环队列
    • 3.2.3 队列的链式实现
    • 3.2.4双端队列
  • 3.3 栈的应用
    • 3.3.1 括号匹配问题
    • 3.3.2 表达式求值
      • 三种算术表达式
        • 中缀
        • 后缀
        • 前缀
    • 3.3.3 递归
  • 3.4 队列的应用
  • 3.5 数组和特殊矩阵
    • 3.5.1 数组的存储结构
    • 3.5.2 特殊矩阵的压缩存储
      • 对称矩阵
      • 三角矩阵
      • 三对角矩阵
      • 稀疏矩阵

3.1 栈

3.1.1 栈Stack的基本概念

  • 栈的定义

栈的数学性质:

n 个不同的元素进栈,出栈元素不同排列的个数为
1 n + 1 C 2 n n \frac{1}{n+1}C_{2n}^{n} n+11C2nn
上述公式称为 卡特兰数

栈的常考题型:

  • 栈的基本操作

3.1.2 栈的顺序存储结构

1、顺序栈的实现

  • 顺序栈的定义
  • 初始化操作

【王道数据结构】第三章 栈和队列_第1张图片

有时初始时将 S.top 定义为0,即规定top指向栈顶元素的下一个存储单元。

  • 进栈操作

【王道数据结构】第三章 栈和队列_第2张图片

  • 出栈操作

【王道数据结构】第三章 栈和队列_第3张图片

  • 读取栈顶元素操作

【王道数据结构】第三章 栈和队列_第4张图片

另一种方式(初始时 S.top = 0):

【王道数据结构】第三章 栈和队列_第5张图片

【王道数据结构】第三章 栈和队列_第6张图片

2、共享栈

两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延申

【王道数据结构】第三章 栈和队列_第7张图片


【王道数据结构】第三章 栈和队列_第8张图片

3.1.3 栈的链式存储结构

回顾链表

链栈的定义:

带头结点:

// 链表结点定义
typedef struct LinkNode{
    int data;
    struct LinkNode *next;
} LNode, *LiStack;

// 带头结点的初始化
bool InitStack(LiStack &L){
    L = (LNode*)malloc(sizeof(LNode));
    if(L == NULL)
        return false;
    L -> next = NULL;
    return true;
}

// 进栈
bool InsertNextNode(LiStack L, int e){
    if(L == NULL)
        return false;
    LNode *s = (LNode*)malloc(sizeof(LNode));
    if(s == NULL)
        return false;
    s -> data = e;
    s -> next = L -> next;
    L -> next = s;
    return true;
}

// 出栈
bool DeleteNextNode(LiStack L){
    if(L -> next == NULL)
        return false;
    LNode *q = L -> next;
    L -> next = q -> next;
    free(q);
    return true;
}

// 获取栈顶元素
bool GetTop(LiStack L, int &e){
    if(L -> next == NULL)
        return false;
    e = L -> next -> data;
    return true;
}

// 判断空
bool isEmpty(LiStack L){
    if(L -> next == NULL)
        return true;
    return false;
}

不带头结点:

// 链表结点定义
typedef struct LinkNode{
    int data;
    struct LinkNode *next;
} LNode, *LiStack;

// 不带头结点的初始化
bool InitStack(LiStack &L){
    L = NULL;
    return true;
}

// 进栈
bool InsertNextNode(LiStack L, int e){
    if(L == NULL)
        return false;
    LNode *s = (LNode*)malloc(sizeof(LNode));
    if(s == NULL)
        return false;
    s = L -> next;
    
}

// 出栈
bool DeleteNextNode(LiStack L){
    if(L -> next == NULL)
        return false;
    LNode *q = L -> next;
    L -> next = q -> next;
    free(q);
    return true;
}

// 获取栈顶元素
bool GetTop(LiStack L, int &e){
    if(L -> next == NULL)
        return false;
    e = L -> next -> data;
    return true;
}

// 判断空
bool isEmpty(LiStack L){
    if(L == NULL)
        return true;
    return false;
}

3.2 队列

3.2.1 队列的基本概念

  • 定义:
  • 队列的基本操作

3.2.2 队列的顺序实现

  • 队列的顺序存储类型
  • 初始化操作
  • 入队操作

循环队列

【王道数据结构】第三章 栈和队列_第9张图片

  • 入队
  • 出队
  • 判断队列已满/已空
  • 其他

【王道数据结构】第三章 栈和队列_第10张图片

【王道数据结构】第三章 栈和队列_第11张图片

【王道数据结构】第三章 栈和队列_第12张图片


【王道数据结构】第三章 栈和队列_第13张图片

3.2.3 队列的链式实现

  • 链式存储实现
  • 初始化
  • 入队

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mA6RMDGV-1661179873646)(C:/Users/G/AppData/Roaming/Typora/typora-user-images/image-20220822193852648.png)]

  • 出队
  • 队满

3.2.4双端队列

  • 考点

输入受限

输出受限:


3.3 栈的应用

3.3.1 括号匹配问题

image-20220822194417790

【王道数据结构】第三章 栈和队列_第14张图片


3.3.2 表达式求值

三种算术表达式

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

例:


  • 中缀转后缀(手算):

即:

  • 中缀转后缀(机算)

如:

-扫到除号时,乘号弹出;由于此时无法确定右侧式子中是否有括号,此时栈中的减号不弹出

另一个带有括号的例子:


  • 中缀转前缀(手算):

后缀
  • 后缀表达式的计算(手算)
  • 后缀表达式的计算(机算)
前缀

【王道数据结构】第三章 栈和队列_第15张图片

【王道数据结构】第三章 栈和队列_第16张图片

3.3.3 递归

  • Eg1:

【王道数据结构】第三章 栈和队列_第17张图片

  • Eg2:

【王道数据结构】第三章 栈和队列_第18张图片


3.4 队列的应用

  • 树的层次遍历(见树章节)

  • 图的广度优先遍历(见图章节)

  • 在操作系统中的应用

3.5 数组和特殊矩阵

3.5.1 数组的存储结构

  • 一维数组
  • 二维数组

行优先存储:

列优先存储:

3.5.2 特殊矩阵的压缩存储

  • 普通矩阵

对称矩阵

出题方法:

三角矩阵

【王道数据结构】第三章 栈和队列_第19张图片

下三角:

【王道数据结构】第三章 栈和队列_第20张图片

上三角:

【王道数据结构】第三章 栈和队列_第21张图片

三对角矩阵

【王道数据结构】第三章 栈和队列_第22张图片

稀疏矩阵


【王道数据结构】第三章 栈和队列_第23张图片

你可能感兴趣的:(王道408,数据结构,链表,算法)