![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
kk楷(退学版)
一个深大混子的上分日记。
展开
-
DS串应用--KMP算法
第二行输出第1个实例的匹配位置,位置从1开始计算,如果匹配成功输出位置,匹配失败输出0。第二行输入第1个实例的主串,第三行输入第1个实例的模式串。学习KMP算法,给出主串和模式串,求模式串在主串的位置。第一行输出第1个实例的模式串的next值。第一个输入t,表示有t个实例。原创 2023-02-04 22:10:50 · 154 阅读 · 1 评论 -
DS队列--组队列
以此类推输入完t组以定义同组元素之后,开始输入多个操作命令(原创 2023-02-04 21:35:59 · 207 阅读 · 0 评论 -
DS队列+堆栈--数制转换
对于任意十进制数转换为k进制,包括整数部分和小数部分转换。整数部分采用除k求余法,小数部分采用乘k取整法例如x=19.125,求2进制转换。接下来每行包含两个参数n和k,n表示要转换的数值,可能是非整数;k表示要转换的数制,1原创 2023-02-04 20:09:25 · 182 阅读 · 1 评论 -
DS堆栈--迷宫求解
如果迷宫存在路径,将路径中每个方格的x和y坐标输出,从起点到终点,每输出四个方格就换行,最终以单词END结尾,具体格式参考示范数据。给出一个N*N的迷宫矩阵示意图,从起点[0,0]出发,寻找路径到达终点[N-1, N-1]第三行起,输入迷宫每一行的每个方格的状态,0表示可通过,1表示不可通过。要求使用堆栈对象来实现,具体算法参考课本3.2.4节51页。如果迷宫不存在路径,则输出no path并回车。第二行输入n,表示第一个迷宫有n行n列。第一行输入t,表示有t个迷宫。以此类推输入下一个迷宫。原创 2023-02-03 18:46:11 · 268 阅读 · 0 评论 -
DS堆栈--行编辑
使用C++的STL堆栈对象,编写程序实现行编辑功能。行编辑功能是:当输入#字符,则执行退格操作;如果无字符可退就不操作,不会报错。每行输出最终处理后的结果,如果一行输入的字符串经过处理后没有字符输出,则直接输出NULL。本程序默认不会显示#字符,所以连续输入多个#表示连续执行多次退格操作。注意:必须使用堆栈实现,而且结果必须是正序输出。第一行输入一个整数t,表示有t行字符串要输入。每输入一行字符打回车则表示字符串结束。第二行起输入一行字符串,共输入t行。原创 2023-02-03 17:20:38 · 191 阅读 · 0 评论 -
DS双向链表—祖玛
祖玛是一款曾经风靡全球的游戏,其玩法是:在一条轨道上初始排列着若干个彩色珠子,其中任意三个相邻的珠子不会完全同色。若插入前共有m颗珠子,位置0-m-1,则k ∈ [0, m]表示新珠子嵌入在轨道上的位置。给定轨道上初始的珠子序列,然后是玩家所做的一系列操作。你的任务是,在各次操作之后及时计算出新的珠子序列。第一行是一个由大写字母'A'~'Z'组成的字符串,表示轨道上初始的珠子序列,不同的字母表示不同的颜色。输出共n行,依次给出各次操作(及可能随即发生的消除现象)之后轨道上的珠子序列。原创 2023-02-03 16:45:45 · 312 阅读 · 0 评论 -
DS线性表—多项式相加
对于每1组数据,先用两行输出两个原来的多项式,再用一行输出运算结果,不必考虑结果全为0的情况。3.如果指数不为0,则用符号^表示,例如x的3次方,表示为x^3。4.多项式的每个项之间用符号+连接,每个+两边加1个空格隔开。第2行:输入n表示有第1组的第1个多项式包含n个项。第3行:输入第一项的系数和指数,以此类推输入n行。接着输入m表示第1组的第2个多项式包含m项。同理输入第2个多项式的m个项的系数和指数。参考上面输入第2组数据,以此类推输入t组。第1行:输入t表示有t组测试数据。假设所有数据都是整数。原创 2023-02-03 15:13:38 · 235 阅读 · 0 评论 -
DS单链表--合并
假定两个单链表是递增有序,定义并实现以下函数,完成两个单链表的合并,继续保持递增有序。第1行先输入n表示有n个数据,接着输入n个数据。第2行先输入m表示有M个数据,接着输入m个数据。输出合并后的单链表数据,数据之间用空格隔开。原创 2023-02-03 13:18:28 · 64 阅读 · 0 评论 -
DS单链表--类实现
如果执行操作失败(包括插入、删除、查找等失败),输出字符串error,不必输出单链表。注意:单链表不是数组,所以位置从1开始对应首结点,头结点不放数据。每成功执行一次操作(插入或删除),输出执行后的单链表数据。第1行先输入n表示有n个数据,接着输入n个数据。每成功执行一次查找,输出查找到的数据。第2行输入要插入的位置和新数据。第3行输入要插入的位置和新数据。第1行输出创建后的单链表的数据。第4行输入要删除的位置。第5行输入要删除的位置。第6行输入要查找的位置。第7行输入要查找的位置。原创 2023-02-03 12:52:03 · 288 阅读 · 0 评论 -
DS顺序表--类实现无模板
如果执行操作失败(包括插入、删除、查找等失败),输出字符串error,不必输出顺序表内容。第1行先输入n表示有n个数据,即n是实际长度;每成功执行一次操作(插入或删除),输出执行后的顺序表内容。第1行输出创建后的顺序表内容,包括顺序表实际长度和数据。只能包含“iostream” 头文件。每成功执行一次查找,输出查找到的数据。第2行输入要插入的位置和新数据。第3行输入要插入的位置和新数据。第4行输入要删除的位置。第5行输入要删除的位置。第6行输入要查找的位置。第7行输入要查找的位置。原创 2023-02-02 21:12:53 · 70 阅读 · 0 评论 -
DS逆散列问题
大致思路是:整个题有个基本原则,即若插入有多种选择,优先小的先插入;因此我们先将输入序列进行升序排序,然后挨个检查是否满足插入条件,满足则输出,不满足则放进一个待插入的数组;每成功输出一个,就要回过头来检查待插入数组中的元素是否可以插入;挨个检查完后,若待插入数组中还有剩余元素,则需要继续将它们插入;原创 2022-12-06 22:57:23 · 102 阅读 · 0 评论 -
DS关于堆的判断
1、x是根节点说明下标为0;2、x和y是兄弟结点,说明x和y的双亲相同,下标从1开始的数组存储的二叉树,下标为i的结点其双亲为i/2;3、x是y的父节点,说明y的下标/2等于x的下标;4、x是y的一个子节点,类似;原创 2022-12-06 22:40:23 · 56 阅读 · 0 评论 -
DS冒泡排序
冒泡排序从大一开始接触,具体算法不做赘述,说一下易错易遗忘的点:1、循环n-1次;2、j从0开始,到n-i-1结束;3、不断做交换即可;原创 2022-12-06 22:06:08 · 78 阅读 · 0 评论 -
DS排序--希尔排序
希尔排序:先将待排序列分成若干子序列,在每个子序列内进行插入排序,最后对整个序列进行一次插入排序;1、取一整数gap作为间隔将整个序列分为若干子序列,所有距离为gap的元素属于同一个子序列;3、不断缩小gap,重复上述操作,直到gap为1,也就是对整个序列进行一次插入排序;2、对每个子序列进行插入排序,这里的插入排序相较于原本的有调整,但整体大致相同;第三行输入n个数据,都是正整数,数据之间用空格隔开。给出一个数据序列,使用希尔排序算法进行降序排序。第二行输入n,表示第一个示例有n个数据(n>1)原创 2022-12-06 22:01:16 · 137 阅读 · 0 评论 -
DS内排—直插排序
直接插入算法:1、待排序列长度为n,循环n-1次;2、从第二个元素开始(下标为1),到最后一个元素结束,对每个元素做同样的操作:从该元素(this)的前一个元素开始,到第一个元素结束(下标为0),升序要求下,如果该元素大于this,不满足升序,因此向后移动一格;直到遇见满足升序的位置,这就是this插入的位置;原创 2022-12-06 21:41:15 · 215 阅读 · 0 评论 -
DS排序--快速排序2
题目描述给出一个数据序列,使用快速排序算法进行从小到大的排序。原创 2022-12-06 21:26:40 · 134 阅读 · 0 评论 -
DS排序—快速排序1
2、循环结束的条件是low==high,这意味着每次改动low或者high的值,我们都要检查一下此时low是否等于high,是的话要跳出最外层循环,注意是最外层循环,不要再做任何操作;快排的算法描述不难:取一个序列的第一个元素,以它为基准,将剩余的元素排在基准元素的两边,左边子序列元素均小于基准元素,右边子序列元素均大于基准元素;5、根据题目输出,子序列为1时也要有输出,因此我们最后要递归进入长度为1的子序列,因此第4点中带等号;对每组测试数据,输出快速排序每趟排好的数字及位置(位置从1开始)。原创 2022-12-06 21:16:19 · 136 阅读 · 0 评论 -
DS内排—堆排序
1、筛选只有两种情况,一是结点只有左孩子并且左孩子值小于结点值(若为升序则为大于),交换左孩子与结点;二是结点有左右孩子并且结点值小于孩子值,交换结点与孩子中较小者;从刚刚被交换的结点开始检查,若堆结构被破坏,进行交换,并且继续检查;2、交换掉根节点后,将剩下的结点调整为新的堆(筛选):循环n-1次,每次将根节点与最后一个结点交换,并断除根节点与二叉树的联系(如代码中改变tail);1、根据给定序列建堆:按照给定序列的顺序直接放进数组中,从第一个非叶子结点(下标n/2)开始,至第一个结点,每个都进行筛选;原创 2022-12-05 21:14:01 · 231 阅读 · 0 评论 -
DS搜索树判断
对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值。现在我们给出一个整数键值序列,请编写程序判断该序列是否为某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,如果是,则输出对应二叉树的后序遍历序列。输入的第一行包含一个正整数N(≤1000),第二行包含N个整数,为给出的整数键值序列,数字间以空格分隔。输出的第一行首先给出判断结果,如果输入的序列是某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,则输出。,下一行输出对应二叉树的后序遍历序列。原创 2022-11-21 21:15:51 · 84 阅读 · 0 评论 -
DS二叉排序树之删除
4、左右孩子都有:首先找到该结点在中序序列中的直接前驱,但实际上不用去把树给中序遍历一遍,只需要取该节点的左孩子,然后再不断地取右孩子直到尽头,就找到了直接前驱;最后删除前驱结点,前驱结点只可能有左孩子,因此只分两种情况,要么没孩子,要么只有左孩子,这两种情况按上面方法去删除;二叉排序树的删除:需要配合插入和查找操作完成,相比于原来的插入,我们需要为BiTreeNode增加私有属性parent,也就是结点的双亲,方便删除时修改指针;从第五行起,输入m行,每行一个要删除的数据,都是自然数。原创 2022-11-21 20:53:07 · 627 阅读 · 0 评论 -
DS二叉排序树之查找
二叉排序树的查找:根据待查元素的大小走这棵树,若当前结点的值等于待查元素的大小,查找成功,若走到了空指针,说明查找失败;从第二行起,输出查找结果,如果查找成功输出查找次数,如果查找失败输出-1。第三行输入n个数据,都是自然数且互不相同,数据之间用空格隔开。第一行输出有序的数据序列,对二叉排序树进行中序遍历可以得到。从第五行起,输入m行,每行一个要查找的数据,都是自然数。给出一个数据序列,建立二叉排序树,并实现查找功能。第二行输入n,表示首个序列包含n个数据。第四行输入m,表示要查找m个数据。原创 2022-11-21 20:27:37 · 180 阅读 · 0 评论 -
DS二叉排序树之创建和插入
二叉排序树的插入:根据插入元素的大小走这棵树,直到走到空指针,在空指针的地方插入;从第五行起,输入m行,每行一个要插入的数据,都是自然数且和前面的数据不等。第三行输入n个数据,都是自然数且互不相同,数据之间用空格隔开。第一行输出有序的数据序列,对二叉排序树进行中序遍历可以得到。从第二行起,输出插入第m个数据后的有序序列,输出m行。给出一个数据序列,建立二叉排序树,并实现插入功能。对二叉排序树进行中序遍历,可以得到有序的数据序列。第二行输入n,表示首个序列包含n个数据。第四行输入m,表示要插入m个数据。原创 2022-11-21 20:19:33 · 194 阅读 · 0 评论 -
DS静态查找之顺序索引查找
2、题目中只给出了每一块的最大关键字,每一块的第一个元素下标我们得自己算:首先第一块的第一个元素的下标一定是0,之后每一块的第一个元素下标是,遍历主表,找到的第一个“大于上一块最大关键字 ”的元素的下标;每行输出一个要查找的数值在队列的位置和查找次数,数据之间用短划线隔开,如果查找不成功,输出字符串error。给出一个队列和要查找的数值,找出数值在队列中的位置,队列位置从1开始。1、索引表包含每一块的最大关键字,和每一块的第一个元素的下标;第三行输入k,表示主表划分为k个块,k也是索引表的长度。原创 2022-11-21 19:55:22 · 254 阅读 · 0 评论 -
DS查找——折半查找求平方根
比如求5的平方根x,则x一定满足0原创 2022-11-21 19:42:25 · 99 阅读 · 0 评论 -
DS静态查找之折半查找
考察静态查找中的二分查找,需要注意的有以下几点:循环的条件为low原创 2022-11-21 19:29:26 · 120 阅读 · 0 评论 -
DS静态查找之顺序查找
考察静态表查找中的顺序查找,三个注意点:一是下标为0的位置存储要找的目标(哨兵),二是从后往前找,三是循环不需要判断条件(也可以要,效率低了一点),因为有了哨兵之后一定能找到目标。每行输出一个要查找的数值在队列的位置,如果查找不成功,输出字符串error。给出一个队列和要查找的数值,找出数值在队列中的位置,队列位置从1开始。第二行输入n个数据,都是正整数,用空格隔开。第三行输入t,表示有t个要查找的数值。第一行输入n,表示队列有n个数据。第四行起,输入t个数值,输入t行。要求使用带哨兵的顺序查找算法。原创 2022-11-21 19:19:28 · 566 阅读 · 0 评论 -
DS追星(ver.1)
yintama是右京女神的狂热粉,当他得知右京女神将要在城市N举办演唱会的时候,马上开始准备动身前往城市N。设总共有N座城市(2原创 2022-11-12 11:00:42 · 96 阅读 · 0 评论 -
DS村村通工程(Kruskal算法)
克鲁斯卡尔算法(Kruskal)主要有以下几点需要注意:(1)Kruskal算法是以边为操作对象,因此需定义类Edge,图的私有属性中,用edge数组代替邻接矩阵(2)所需变量有weightsum,为最小生成树的权值之和;那如何判断选的边是否会构成闭环呢:这里采用标号法,将所有顶点的flag初始化为其下标,每选择一条边,便将边两端的顶点修改为一致;现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。第1行:输出最小生成树的权值之和。原创 2022-11-12 10:32:04 · 746 阅读 · 0 评论 -
DS村村通工程(Prim算法)
普利姆算法(Prim)主要有以下几点需要注意:(1)所需的变量有visited数组,记录顶点是否加入到U集合中;minindex,dis中的最小值的下标,weightsum,最小生成树的权值;(2)初始化时将所有的visited初始化为0,所有的dis初始化为MAX,minindex初始化为起点;(3)循环n-1次,每次更新两个任务,更新dis、adj数组和找到新的最小的dis。现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。原创 2022-11-12 00:04:00 · 766 阅读 · 0 评论 -
DS图的顶点可达闭包
算法很简单,但需要注意的是,如果一个顶点通过有向路径可以回到自身,则对应可达闭包矩阵也是1,因此,我们在遍历的时候先不要把起点的flag改为1,让它保持为0,看最后能不能回来;给定有向图的邻接矩阵A,其元素定义为:若存在顶点i到顶点j的有向边则A[i,j]=1,若没有有向边则A[i,j]=0。试求A的可达闭包矩阵A*,其元素定义为:若存在顶点i到顶点j的有向路径则A*[i,j]=1,若没有有向路径则A*[i,j]=0。第2行开始的n行有向图的邻接矩阵,元素之间由空格分开。原创 2022-11-11 22:19:32 · 114 阅读 · 0 评论 -
DS图的应用之——图的连通
题目描述给定一个图的邻接矩阵,请判断该图是否是连通图。连通图:任意两个顶点之间都有路径。原创 2022-11-11 22:03:00 · 298 阅读 · 0 评论 -
DS图—图的连通分量
计算图的连通分量个数,思路很简单,写一个BFS或者DFS都行,然后开始遍历每个顶点,只要这个顶点未被访问过(flag=0),就以这个顶点为起点遍历图,计数器加一;最终计数器就是连通分量个数。输入无向图顶点信息和边信息,创建图的邻接矩阵存储结构,计算图的连通分量个数。输出图的连通分量个数,具体输出格式见样例。每组测试数据输出,顶点信息和邻接矩阵信息。第三行开始,每行一条边信息。第一行:顶点数 顶点信息。每组输出直接用空行分隔。原创 2022-11-11 21:39:14 · 453 阅读 · 0 评论 -
DS树结构转换(先序转双亲)
这个题只要在原来二叉树的算法基础上加个双亲指针parent就可以,然后借助层次遍历来创建双亲表示法下的树的存储结构;我单步调试了一下,发现不用引用的话根结点是空的,也就是根本就没有创建?双亲表示法的数组下标从0开始,根结点必定是在下标0元素,且根结点的双亲下标为-1,左右孩子按下标递增顺序排列,给出一棵二叉树的特定字符先序遍历结果(空子树用字符'#'表示),构建该二叉树,并输出该二叉树的双亲表示法结果。每棵二叉树输出两行,第一行输出各个结点的数值,第二行输出各结点的双亲下标。结点下标是层次遍历顺序。原创 2022-11-10 22:39:18 · 428 阅读 · 0 评论 -
DS红色警报
正确的算法应该是,进行图的遍历,数有多少个连通分量,看前后数量是否变化,简单直接明了;注意:若该国本来就不完全连通,是分裂的k个区域,而失去一个城市并不改变其他城市之间的连通性,则不要发出警报。注意:输入保证给出的被攻占的城市编号都是合法的且无重复,但并不保证给出的通路没有重复。原创 2022-11-10 22:11:44 · 110 阅读 · 0 评论 -
DS图—图非0面积
这题的思路是:将除了1围起来的0之外的所有0变成1,也就是除了面积部分之外其余全为1,这样子计算面积只需要遍历整个图数有多少个0就可以;具体实现的话,就是在原来的图的最外层加上一圈0,然后从最左上角的点开始,以类似走迷宫的方法走完围墙外的所有的0并将他们改为1,最后数多少个0得出结果;为什么要加一圈0呢:样例输入中的第二组测试数据给出答案,因为原来的图中围墙可能在最边上,这样子的话我们就不能够从左上角开始,将所有围墙外的点改为1,加一圈0的话,围墙外的任意两个点之间都可以到达。原创 2022-11-10 19:22:09 · 328 阅读 · 0 评论 -
DS道路建设 (Ver. I)
选边次数未知,因此需要遍历所有的边,不用担心会多选,因为当所有的顶点的flag一致时不会再选择新的边;然后是N行,其中第i行包含N个整数,这些N个整数中的第j个是村庄i和村庄j之间的距离(距离是[1,1000]内的整数)。然后是整数Q(0原创 2022-11-12 10:33:21 · 531 阅读 · 0 评论 -
DS图—图的最短路径(无框架)
正题:(1)题目输入时是以0来表示无连接,但在我们的算法中,带权值的邻接矩阵是以无穷来表示,因此在输入时要注意;(3)初始化时要注意flag为起点下标,起点的final和path做出相应修改,D初始化为起点到各个顶点的权值(区别于Prim是全部初始化为无穷),如果权值不为无穷,则修改相应的path,final除起点外全为0;错误思路:一开始真的觉得这个算法跟Prim太像了,所以一开始初始化时跟Prim的做法一样,后来发现这样的话更新D时会出错,做法不可取,还是得根据ppt上例子的表格来推进这个算法。原创 2022-11-12 10:32:46 · 456 阅读 · 4 评论 -
DS图遍历--广度优先搜索
一般代码框架只会添麻烦,只有在实在不知道怎么写的时候去看代码框架,这里直接无视它;另外广度优先遍历需要记录每个顶点是否被访问过了,需要一个数组来记录每个顶点的状态;在用队列实现时,特别需要注意,将顶点指针压入队尾时就要将标志设为已访问,防止后面重复压入,而不是在需要输出时才去设置标志,这时候就太晚辣;与深度优先遍历一样,可能存在非连通图的情况,需要在检查所有的顶点是否被访问过了。给出一个图的邻接矩阵,对图进行深度优先搜索,从顶点0开始。第三行起,每行输入邻接矩阵的一行,以此类推输入n行。原创 2022-11-06 23:58:06 · 370 阅读 · 0 评论 -
DS图遍历--深度优先搜索
另外深度优先遍历需要记录每个顶点是否被访问过了,需要一个数组来记录每个顶点的状态;深度优先遍历需要递归实现,每访问一个顶点,就去遍历所有的顶点,如果能找到两者有边(为1)并且未被访问过的,就接着去访问这个顶点;最后一点容易漏的,就是这个图可能时非连通图,我们在遍历完第一个图后,需要遍历所有顶点看是否已经被访问过了,没被访问的话就从这个顶点开始访问,知道所有的顶点都被访问。给出一个图的邻接矩阵,对图进行深度优先搜索,从顶点0开始。第三行起,每行输入邻接矩阵的一行,以此类推输入n行。以此类推输入下一个示例。原创 2022-11-06 23:17:00 · 314 阅读 · 0 评论 -
DS图—图的邻接矩阵存储及度计算
题目描述假设图用邻接矩阵存储。输入图的顶点信息和边信息,完成邻接矩阵的设置,并计算各顶点的入度、出度和度,并输出图中的孤立点(度为0的顶点)原创 2022-11-06 23:02:08 · 220 阅读 · 0 评论