【数据结构】24王道考研笔记——栈、队列和数组

这篇具有很好参考价值的文章主要介绍了【数据结构】24王道考研笔记——栈、队列和数组。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

三、栈、队列和数组

基本概念

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

  • 栈顶:线性表允许进行插入删除的那一端
  • 栈底:固定的,不允许进行插入删除的那一端
  • 空栈:不含任何元素的空表

特点:先进后出

【数据结构】24王道考研笔记——栈、队列和数组

基本操作:

【数据结构】24王道考研笔记——栈、队列和数组

常考题型:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yAQLivaR-1686635232177)(null)]

顺序栈

结构体:

//结构体
#define MaxSize 10 //定义栈中元素的最大个数
typedef struct
{
	int data[MaxSize];//静态数组存放栈中元素
	int top;//栈顶指针
} SqStack;

初始化:

//初始化
void InitStack(SqStack& S)
{
	S.top = -1;//初始化栈顶指针 若为0.则指向下一个插入的位置
}

判空:

//判空
bool StackEmpty(SqStack S)
{
	if (S.top == -1) return true;//判空
	else return false;
}

进栈:

//进栈
bool Push(SqStack& S, int x)
{
	if (S.top == MaxSize - 1)//栈满,报错
		return false;
	S.top = S.top + 1;//先加1
	S.data[S.top] = x;//新元素入栈 这两行等价于S.data[++S.top]=x;
	return true;
}

出栈:

//出栈
bool Pop(SqStack& S, int& x)
{
	if (S.top == -1) return false;//栈空,报错
	x = S.data[S.top];//栈顶元素先出栈
	S.top = S.top - 1;//指针再减一 这两行等价于 x=S.data[S.top--]
	return true;
}

获取栈顶元素:

//读取栈顶元素
bool GetTop(SqStack& S, int& x)
{
	if (S.top == -1) return false;//栈空,报错
	x = S.data[S.top];//栈顶元素出栈
	return true;
}

让top指向待插入位置的写法:(初始化top=0)

【数据结构】24王道考研笔记——栈、队列和数组

缺点:栈的大小不可变

可以使用共享栈进行优化,提高内存运用率。

【数据结构】24王道考研笔记——栈、队列和数组

共享栈定义:

//共享栈
typedef struct
{
	int data[MaxSize]; //静态数组存放栈中元素
	int top0; //0号栈栈顶指针
	int top1; //1号栈栈顶指针
} ShStack;

//初始化共享栈
void InitStack(ShStack& S)
{
	S.top0 = -1;
	S.top1 = MaxSize; 
	//栈满条件为top0+1==top1
}

链式栈

链式栈的构建和单链表十分相似,主要限制与进栈出栈都只能在栈顶一端进行(链头作为栈顶)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qpnymbqf-1686635230993)(null)]

结构体:

# define MaxSize 10
typedef struct LinkNode {
    int data;
    struct LinkNode* next;
} *LinkStack;

初始化:

//初始化
bool InitStack(LinkStack& LS) {
    LS = (LinkNode*)malloc(sizeof(LinkNode));//分配一个头节点
    if (LS == NULL) {
        return false;
    }
    LS->next = NULL;
    return true;
}

入栈:

//入栈
bool Push(LinkStack& LS, int t) {
    LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));
    if (s == NULL)return false;
    s->data = t;
    s->next = LS->next;
    LS->next = s;
    return true;
}

出栈:

//出栈
bool Pop(LinkStack& LS, int& x) {
    //判断
    if (LS->next == NULL)return false;//栈空,这里的条件
    LinkNode* q;
    q = LS->next;
    LS->next = q->next;
    x = q->data;
    free(q);
    return true;
}

获取栈顶元素:

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

队列

基本概念

队列是只允许在一端进行插入,在另一端删除操作的线性表。(分别称为入队,出队)

  • 特点:先进先出,后进后出(FIFO)
  • 队头:允许删除的一端
  • 队尾:允许插入的一端

基本操作:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Do0UhQza-1686635229210)(C:\Software\PicGo\1683358362151.png)]

顺序存储

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pZhiTig2-1686635230819)(null)]

结构体:

#define MaxSize 10 //定义队列中元素的最大个数
typedef struct
{
	int data[MaxSize];//用静态数组存放队列元素、
	int front, rear;//队头指针和队尾指针
} SqQueue;

初始化:

//初始化队列
void InitQueue(SqQueue& Q)
{
	//初始,队头队尾指针指向0
	Q.front = Q.rear = 0;//队尾指针始终指向下一个插入的位置
}

判空:

//判空
bool QueueEmpty(SqQueue Q)
{
	if (Q.rear == Q.front) return true;
	else return false;
}

入队:

//入队
bool EnQueue(SqQueue& Q, int x)
{
	if ((Q.rear+1)%MaxSize==Q.front)//判断队满
		return false;
	Q.data[Q.rear] = x;
	Q.rear = (Q.rear + 1)%MaxSize;//队尾指针加1取模,以循环队列的形式进行存储
}

出队:

//出队
bool DeQueue(SqQueue& Q, int& x)
{
	if (Q.rear == Q.front)//判空
		return false;
	x = Q.data[Q.front];
	Q.front = (Q.front + 1) % MaxSize;//队头后移
	return true;
}

获取队头元素:

//获取队头元素
bool GetHead(SqQueue& Q, int& x)
{
	if (Q.rear == Q.front)//判空
		return false;
	x = Q.data[Q.front];
	return true;
}

判断队满的三种方式:
【数据结构】24王道考研笔记——栈、队列和数组

【数据结构】24王道考研笔记——栈、队列和数组

【数据结构】24王道考研笔记——栈、队列和数组

对于rear和front指针的初始化方式可能会有所不同,由此会有不同的出题方式。

【数据结构】24王道考研笔记——栈、队列和数组

链式存储

以下为带头结点的链式队列:

结构体:

//结构体
typedef struct LinkNode
{
	int data;
	struct LinkNode* next;
}LinkNode;

typedef struct
{
	LinkNode* front, * rear;//队头队尾指针
}LinkQueue;

初始化:

//初始化
void InitQueue(LinkQueue& Q)
{
	//初始时 front、rear都指向头结点
	Q.front = Q.rear = (LinkNode*)malloc(sizeof(LinkNode));
	Q.front->next = NULL;
}

判空:

//判空
bool IsEmpty(LinkQueue Q)
{
	if (Q.front == Q.rear)
		return true;
	else return false;
}

入队:

//入队
void EnQueue(LinkQueue& Q, int x)
{
	LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));
	s->data = x;
	s->next = NULL;
	Q.rear->next = s;//新节点插入到rear后面
	Q.rear = s;//修改表尾指针
}

出队:出队时需要进行特判,当出队元素为最后一个结点时,需要修改rear指针。

//出队
bool DeQueue(LinkQueue& Q, int& x)
{
	if (Q.front == Q.rear) return false;//判空
	LinkNode* p = Q.front->next;
	x = p->data;//用变量x返回队头元素
	Q.front->next = p->next;//修改头结点的next指针
	if (Q.rear == p)//此次是最后一个结点出队
		Q.rear = Q.front;//修改rear指针
	free(p);//释放结点空间
	return true;
}

以下是不带头结点的链式队列:

初始化:

//初始化(不带头结点)
void InitQueue2(LinkQueue& Q)
{
	//初始时,front、rear都指向NULL
	Q.front = NULL;
	Q.rear = NULL;
}

判空:

//判空(不带头结点)
bool IsEmpty2(LinkQueue Q)
{
	if (Q.front == NULL) return true;
	else return false;
}

入队:

//入队(不带头结点)
void EnQueue2(LinkQueue& Q, int x)
{
	LinkNode* s = (LinkNode*)malloc(sizeof(LinkNode));
	s->data = x;
	s->next = NULL;
	if (Q.front == NULL)//在空序列中插入第一个元素
	{
		Q.front = s;
		Q.rear = s;
	}
	else
	{
		Q.rear->next = s;
		Q.rear = s;
	}
}

出队:

//出队(不带头结点)
bool DeQueue2(LinkQueue& Q, int& x)
{
	if (Q.front == NULL) return false;
	LinkNode* p = Q.front;//p指向此次出队的结点
	x = p->data;//用变量x返回队头元素
	Q.front = p->next;//修改front指针
	if (Q.rear == p)//此次是最后一个结点出队
	{
		Q.front = NULL;
		Q.rear = NULL;
	}
	free(p);//释放结点
}

双端队列

双端队列是指两端都可以进行入队和出队操作的队列

【数据结构】24王道考研笔记——栈、队列和数组

【数据结构】24王道考研笔记——栈、队列和数组

应用

括号匹配

用栈实现括号匹配:

依次扫描所有字符,遇到左括号入栈,遇到右括号则弹出栈顶元素检查是否匹配。

匹配失败情况:

  1. 左括号单身
  2. 右括号单身
  3. 左右括号不匹配

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ux1zXkJz-1686635230730)(null)]

//括号匹配
bool bracketCheck(char* str, int length) {
    SqStack S;
    InitStack(S);//初始化一个栈
    for (int i = 0; i < length; i++) {
        if (str[i] == '(' || str[i] == '[' || str[i] == '{') {
            Push(S, str[i]);//扫描到左括号,入栈
        }
        else {
            if (StackEmpty(S))return false;//扫描到右括号且当前栈空,匹配失败
            char topElem;
            Pop(S, topElem);//栈顶元素出栈进行匹配
            if (str[i] == ')' && topElem != '(')
                return false;
            if (str[i] == ']' && topElem != '[')
                return false;
            if (str[i] == '}' && topElem != '{')
                return false;
        }
    }
    return StackEmpty(S);//最后检查栈,若空匹配成功,非空匹配失败
}

前中后缀表达式

【数据结构】24王道考研笔记——栈、队列和数组

中缀转后缀(左优先):

当中缀表达式转后缀表达式时,由于运算顺序的不同,可能存在转换为几种不同后缀表达式的情况,此时我们采用左优先原则,保证手算和机算的结果相同。

【数据结构】24王道考研笔记——栈、队列和数组

中缀转后缀的机算方法:

【数据结构】24王道考研笔记——栈、队列和数组

后缀表达式的手算方法:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LQohQ0cw-1686635230708)(null)]

后缀表达式机算:利用栈 先弹出的元素为右操作数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hquCC1K8-1686635232135)(null)]

中缀转前缀(右优先):下图以右边的为准

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GWXSUUrm-1686635230687)(null)]

前缀表达式机算:利用栈 先弹出的元素是左操作数

【数据结构】24王道考研笔记——栈、队列和数组

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

【数据结构】24王道考研笔记——栈、队列和数组

栈在递归中的运用

适合用“递归”解决:可以把原始问题转换为属性相同,但规模较小的问题。

【数据结构】24王道考研笔记——栈、队列和数组

队列的运用

树的层次遍历

图的广度优先遍历

操作系统中FCFS先来先服务的策略

数组

数组的存储

一维数组:

【数据结构】24王道考研笔记——栈、队列和数组

二维数组(分为按行存储以及按列存储):

【数据结构】24王道考研笔记——栈、队列和数组

【数据结构】24王道考研笔记——栈、队列和数组

对称矩阵

若n阶方阵中任意一个元素aij都有aij=aji则该矩阵为对称矩阵。

同样分为行优先以及列优先

【数据结构】24王道考研笔记——栈、队列和数组

三角矩阵

下三角矩阵:除了主对角线和下三角区,其余的元素都相同。

【数据结构】24王道考研笔记——栈、队列和数组

上三角矩阵:除了主对角线和上三角区,其余的元素都相同。

【数据结构】24王道考研笔记——栈、队列和数组

三对角矩阵

又称带状矩阵,当|i-j|>1时,有aij=0(1<=i,j<=n)

由i,j得到k:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OrvwDtj5-1686635230798)(null)]

由k得到i,j:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jVAIDTvc-1686635230774)(null)]

由k以及i的表达式可以进一步得到j的表达式

稀疏矩阵

非零元素远远少于矩阵元素的个数

使用三元组存储:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HFGHxhSc-1686635230753)(null)]

使用十字链表法存储:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xMbahDSY-1686635230660)(null)]

总结:

【数据结构】24王道考研笔记——栈、队列和数组
主要参考:王道考研课程
后续会持续更新考研408部分的学习笔记,欢迎关注。
github仓库(含所有相关源码):408数据结构笔记文章来源地址https://www.toymoban.com/news/detail-486560.html

到了这里,关于【数据结构】24王道考研笔记——栈、队列和数组的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构笔记(王道考研) 第一章:绪论

    大部分内容基于中国大学MOOC的2021考研数据结构课程所做的笔记,该课属于付费课程(不过盗版网盘资源也不难找。。。)。后续又根据23年考研的大纲对内容做了一些调整,将二叉排序树和平衡二叉树的内容挪到了查找一章,并增加了并查集、平衡二叉树的删除、红黑树的内

    2024年02月14日
    浏览(47)
  • 【计算机组成原理】24王道考研笔记——第二章 数据的表示和运算

    1.1 进制转换 任意进制-十进制: 二进制-八进制、十六进制: 各种进制的常见书写方式: 十进制-任意进制:(用拼凑法最快) 真值:符合人类习惯的数字(带±号的数) 机器数:正负号被“数字化” 1.2 定点数 常规计数:定点数;科学计数法:浮点数 无符号数: 有符号定

    2024年02月16日
    浏览(48)
  • 【操作系统】24王道考研笔记——第三章 内存管理

    1.基本概念 2.覆盖与交换 覆盖技术: 交换技术: 总结: 3.连续分配管理方式 单一连续分配 固定分区分配 动态分区分配 动态分区分配算法: 总结: 4.基本分页存储管理 定义: 页表: 地址转换的实现: 子问题: 逻辑地址结构: 总结: 5.基本地址变换机构 流程: 原理:

    2024年02月11日
    浏览(58)
  • 【操作系统】24王道考研笔记——第一章 计算机系统概述

    1.1 定义 1.2 特征 并发 (并行:指两个或多个事件在同一时刻同时发生) 共享 (并发性指计算机系统中同时存在中多个运行着的程序,共享性指系统中的资源可供内存中多个并发执行的进程共同使用) 虚拟 异步 并发和共享互为存在条件。没有并发和共享,就谈不上虚拟和异

    2024年02月12日
    浏览(70)
  • 【计算机组成原理】24王道考研笔记——第四章 指令系统

    指令是指示计算机执行某种操作的命令,是计算机运行的最小功能单位。一台计算机的所有指令的集合构成该 机的指令系统,也称为指令集。 指令格式: 1.1分类 按地址码数目分类: 按指令长度分类: 按操作码长度分类: 按操作类型分类: 1.2 扩展操作码 设地址长度为n,

    2024年02月13日
    浏览(48)
  • 【计算机组成原理】24王道考研笔记——第三章 存储系统

    现代计算机的结构: 1.存储器的层次结构 2.存储器的分类 按层次: 按介质: 按存储方式: 按信息的可更改性: 按信息的可保存性: 3.存储器的性能指标 1.基本组成 半导体元件原理: 存储芯片原理:存储芯片由半导体元件组成而成 不同的寻址方式: 总结: 2.SRAM和DRAM 上一

    2024年02月13日
    浏览(57)
  • 数据结构【考研笔记】

    1、基本概念 1)数据 数据是 信息的载体 ,是描述客观事物属性的数、字符及所有 能输入到计算机中并被计算机程序识别和处理的符号 的集合。数据是计算机程序加工的原料。 2)数据元素、数据项 数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。一个数据

    2024年02月12日
    浏览(46)
  • 齐鲁工业大学872数据结构考研笔记

    笔者水平有限,错误之处请指出。 官网考纲https://yjszs.qlu.edu.cn/_upload/article/files/d6/51/76dd4bc8494eb8dbf1327a9fdeaa/3d1521b3-ce94-4de3-adc6-56a2f87aa7ef.pdf 1.  数据 :是客观事物的符号表示,是所有能输入到计算机中并被计算机程序处理的符号的总称。 2. 数据元素 :是数据的基本单位,通常

    2024年02月15日
    浏览(44)
  • 【考研复习】24王道数据结构课后习题代码|2.3线性表的链式表示

    删除结点:1、2、4 就地逆置:5、 合并链表 分解链表:10、11、 去除重复元素:12、 并集:14、15 循环链表:17、18、19、20 头插法、尾插法重点基础必掌握。 判断是否有环:21 用函数递归调用删除结点。 注意删除结点的时候可能断链。 利用函数调用的特性反向输出。 设置保

    2024年02月13日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包