数据结构
文章平均质量分 55
ZoeLandia
记录学习之路
展开
-
实现快速排序所踩的坑
实现快速排序所踩的坑原创 2024-03-16 22:42:26 · 219 阅读 · 0 评论 -
数据结构知识点
绪论数据结构被形式地定义为(K, R),其中K是数据元素的有限集,R是K上的关系的有限集。在数据结构,从逻辑上可以把数据结构分成线性结构和非线性结构。数据结构在计算机内存中的表示是指数据的存储结构。数据项是数据的最小单元。数据元素是数据的基本单元。数据处理的最小单元是数据项。数据的逻辑结构和存储结构逻辑结构对数据之间关系的描述,有时就把逻辑结构简称为数据结构。集合结构:集合结构的集合中任何两个数据元素之间都没有逻辑关系,组织形式松散。线性结构:数据结构中线性原创 2021-06-27 18:41:27 · 1048 阅读 · 1 评论 -
PTA 堆栈模拟队列
一.题目设已知有两个堆栈S1和S2,请用这两个堆栈模拟出一个队列Q。输入格式:输入首先给出两个正整数N1和N2,表示堆栈S1和S2的最大容量。随后给出一系列的队列操作:A item表示将item入列(这里假设item为整型数字);D表示出队操作;T表示输入结束。输出格式:对输入中的每个D操作,输出相应出队的数字,或者错误信息ERROR:Empty。如果入队操作无法执行,也需要输出ERROR:Full。每个输出占1行。输入样例:3 2A 1 A 2 A 3 A 4 A 5 D A 6 D A原创 2021-05-27 14:31:45 · 737 阅读 · 0 评论 -
PTA 双端队列
一.定义双端队列是限定插入和删除操作在表的两端进行的线性表,是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端进队和出队,其限定插入和删除操作在表的两端进行。二.例题双端队列(deque,即double-ended queue的缩写)是一种具有队列和栈性质的数据结构,即可以(也只能)在线性表的两端进行插入和删除。若以顺序存储方式实现双端队列,请编写例程实现下列操作:Push(X,D):将元素X插入到双端队列D的头;Pop(D):删除双端队列D的头元素,并返回;Inject(X,D)原创 2021-03-19 13:29:21 · 836 阅读 · 0 评论 -
PTA 合并递增整数序列
本题要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。其中List结构定义如下:typedef struct Node *PtrToNode;struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */};typedef PtrToNode List; /* 定义单链表类型 */L1和L2是给定的带头结点的单链表,其结点存储的数据是递增有序的;函数Merge原创 2021-03-18 15:48:38 · 381 阅读 · 0 评论 -
PTA 最大子列和问题 四种方法
例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。一.三层循环 O(n ^ n ^ n) 时间复杂度过高//法一:三层循环 O(n^n^n)int MaxSum(int a[], int n){ int i, j, k; int thisSum, maxSum = 0; for(i = 0; i < n; i++){ for(j = i; j < n; j++)原创 2021-03-17 11:48:55 · 2216 阅读 · 1 评论 -
PTA 实现链式表的操作集
本题要求实现链式表的操作集。函数接口定义:Position Find( List L, ElementType X );List Insert( List L, ElementType X, Position P );List Delete( List L, Position P );其中List结构定义如下:typedef struct LNode *PtrToLNode;struct LNode {ElementType Data;PtrToLNode Next;};typedef原创 2021-03-16 11:12:56 · 465 阅读 · 0 评论 -
PTA 实现单链表逆转
本题要求实现一个函数,将给定的单链表逆转。函数接口定义:List Reverse( List L );其中List结构定义如下:typedef struct Node PtrToNode;struct Node {ElementType Data; / 存储结点数据 /PtrToNode Next; / 指向下一个结点的指针 /};typedef PtrToNode List; / 定义单链表类型 */L是给定单链表,函数Reverse要返回被逆转后的链表。裁判测试程序样例:#i原创 2021-03-15 18:28:48 · 3206 阅读 · 2 评论 -
关键路径
关键路径1.相关概念AOE网:在一个表示工程的带权有向图中,用顶点表示事件(如V0),用有向边表示**活动(如<v0,v1> = a1),**边上的权值表示活动的持续时间,称这样的有向图为边表示的活动的网,简称AOE网(activity on edge network)始点(源点):AOE网中没有入边的顶点,如顶点V0终点(汇点):没有出边的顶点,如顶点V32. 比较深红色便是关键路径3. 性质①只有在进入某顶点的活动都已经结束,该顶点所代表的事件才发生。例原创 2021-03-08 21:26:06 · 290 阅读 · 0 评论 -
拓扑排序
拓扑排序1. 一些相关概念无环图(DAG):一个无环的有向图活动:所有的工程或者某种流程分为若干个小的工程或者阶段AOV网:在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网(AOV网不能存在回路)2.原理对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序原创 2021-03-08 19:44:49 · 135 阅读 · 0 评论 -
最短路径
最短路径迪杰斯特拉算法(Dijkstra)1. 基本思想它不是一下子求出最短路径,而是一步步求出它们之间顶点的最短路径,过程中都是基于已经求出的最短路径的基础上,求得最远顶点的最短路径,最终得到想要的结果。2. 代码#define MAXVEX 9#define INFINITY 65535typedef int Patharc[MAXVEX]; //存储最短路径下标的数组typedf int ShortPathTable[MAXVEX]; //存储到各点最短路径的权值和//原创 2021-03-08 18:34:41 · 103 阅读 · 0 评论 -
最小生成树
最小生成树构成生成树的准则有三条:<1> 必须只使用该网络中的边来构造最小生成树。<2> 必须使用且仅使用n-1条边来连接网络中的n个顶点<3> 不能使用产生回路的边。普里姆(Prim)算法以某顶点为起点,逐步找各各顶点上最小权值的边来构建最小生成树1. 代码void MiniSpanTree_Prim(MGraph G){ int min, i, j , k; int adjvex[MAXVEX]; //保存相关顶点下标 i原创 2021-03-07 21:34:15 · 149 阅读 · 0 评论 -
图的遍历
图的遍历图中的某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次。深度优先遍历(DFS)1. 原理可以约定右手原则:在没有碰到重复顶点的情况下,分岔路口始终向右手方向走,每路过一个顶点就做上标记。遇到重复情况就往后退,直到退到一开始的顶点,即遍历完成。标记的具体方法:设置一个访问数组visited[n],n是图中顶点个数,初值为0,访问过后设置为1深度遍历其实是一个递归过程,就像是一颗树的***前序遍历***。它从图中某一个顶点v出发,访问此顶点,然后从v的未被访问的邻接点出发深度优先遍历原创 2021-03-07 14:55:19 · 187 阅读 · 0 评论 -
图的存储结构
图不可能用简单的顺序存储结构表示一.邻接矩阵1.无向图基本思想:用一维数组存储图的顶点,用矩阵 n*n(二维数组)表示图中各顶点之间的邻接关系。有边指向顶点就用1表示,没有就用0该矩阵是对称矩阵,因为是无向图2.有向图出度对应行 入度对应列3.网4.建立无向网图的邻接矩阵代码实现typedef char VertexType;typedef int EdgeType; #define MAXVEX 100 #define INFINITY 65535 /原创 2021-03-07 12:28:36 · 130 阅读 · 0 评论 -
图的定义
图是由顶点集V和边集E组成,记作G=(V, E)G:Graphics 图形 V:Vertex 顶点 E:Edge 边顶点集合V强调有穷非空一.各种图的定义1.无向边2.有向边无向边用小括号"()“表示 有向边用尖括号”<>"表示3.简单图4.无向完全图5.有向完全图6.稀疏图和稠密图注意分界点7.权 网8.子图二.图的顶点与边之间的关系1.邻接对于无向图如果两个顶点在同一条边上,则称它们互为邻接点 即(v, v’) ∈ E,v和原创 2021-03-06 14:56:26 · 626 阅读 · 0 评论 -
多路查找树
一.定义二叉排序树简单的实现在多数情况能够达到预期的查找效率,但是每个节点只能存储一个元素和只能有两个孩子,使得在大量数据下会造成二叉排序树的深度特别大,那么在进行查找时多次的访问会造成查找效率的下降,同时,在对二叉查找树进行插入时,可能会破坏二叉查找树的平衡。为了降低对于树的访问次数,实现树的平衡,我们需要新的数据结构来处理这样的问题。多路查找树的每一个节点的孩子树可以多于两个,且每个节点处可以存储多个元素。多路查找树是一种特殊的查找树,所以其元素之间存在某种特定的排序关系二.2-3树每个节点都具原创 2021-03-05 15:53:38 · 213 阅读 · 0 评论 -
平衡二叉排序树
一.原理原创 2021-03-05 14:52:12 · 3202 阅读 · 2 评论 -
二叉排序树
一.定义数据集无序方便插入与删除 有序利于查找在一般情况下,查询效率比链表结构要高二.性质1.若左子树不空,则左子树上所有结点的值均小于它的根结点的值;2.若右子树不空,则右子树上所有结点的值均大于它的根结点的值;3。左、右子树也分别为二叉排序树(递归)4.没有键值相等的结点三.查找操作遍历采用中序遍历,这样成为了有序1.二叉树的结构2.代码四.插入操作插入要先查找是否存在 存在则不再插入 插入就是将关键字放到树中合适的位置五.删除操作删除的核心思想就是 不是特殊结点(原创 2021-03-04 19:38:09 · 795 阅读 · 3 评论 -
查找
一.查找概论1.一些概念查找表:同一类型的数据元素构成的集合关键字:数据元素中某个数据项的值,又称为键值,用它可以标识(不一定唯一)一个数据元素。也可以表示一个记录的某个数据项(字段),我们称它为关键码主关键字:若此关键字能唯一的标识一个记录,则称此关键字为主关键字,这也就意味着,对不同的记录,其主关键字不相同。主关键字所在的数据项成为主关键码次关键字:可以识别多个数据元素(或记录)的关键字,我们成为次关键字。次关键字可以理解为不以唯一标识一个数据元素(或记录)的关键字,它对应的数据项就是次关键码原创 2021-03-03 22:08:46 · 470 阅读 · 0 评论 -
哈夫曼编码
一.哈夫曼编码的概念哈夫曼树又称作最优树,是一种带权路径长度最短的树,而通过哈夫曼树构造出的编码方式称作哈夫曼编码。1.路径长度二叉树中一个结点到另一个结点经过的结点方式是唯一的,这些经过的结点称作两个结点之间的路径。2.结点权值图当中,每一个结点代表着不同的数字,而这些不同的数字称作结点的权值。3.带权路径长度假设同样的例子,由结点A到结点B的过程中,经过的路径长度为3,结点B的权值为4。则3*4=12称作结点的带权路径长度。到结点的带权路径长度计算方式为路径长度乘结点的权值。而树的带权路径原创 2021-03-03 11:17:18 · 1054 阅读 · 0 评论 -
线索二叉树
一.原理利用原来的空链域存放指针,指向树中其他结点,这种指针称为线索决定lchild是指向左孩子还是前驱,rchild是指向右孩子还是后继,需要一个区分标志的。因此,我们在每个结点再增设两个标志域ltag和rtag线索化的实质就是将二叉链表中的空指针改为指向前驱或后继的线索。由于前驱和后继信息只有在遍历该二叉树时才能得到,所以线索化的过程就是在遍历的过程中修改空指针的过程二.代码实现1.创建二叉树2.中序遍历线索化处理前驱:针对当前节点,什么时候能得到前驱,访问当前节点的时候就可以,因此要原创 2021-03-02 11:27:40 · 506 阅读 · 2 评论 -
树 二叉树 森林 相互转换
一.树————>二叉树由于二叉树是有序的,为了避免混淆,对于无序树,我们约定树中的每个结点的孩子结点按从左到右的顺序进行编号将树转换成二叉树的步骤(1)加线 就是在所有兄弟结点之间加一条连线(2)抹线 就是对树中的每个结点,只保留他与第一个孩子结点之间的连线,删除它与其它孩子结点之间的连线(3)旋转 就是以树的根结点为轴心,将整棵树顺时针旋转一定角度,使之结构层次分明二.森林————>二叉树森林是由若干棵树组成,可以将森林中的每棵树的根结点看作是兄弟,由于每棵树都可以转换为二叉树原创 2021-03-01 21:34:13 · 824 阅读 · 0 评论 -
逆波兰计算器 中缀转化后缀
一.中缀转化后缀1.具体转换方式①从左到右进行遍历②运算数 直接输出.③左括号直接压入堆栈(括号是最高优先级,无需比较)(入栈后优先级降到最低,确保其他符号正常入栈)④右括号(意味着括号已结束)不断弹出栈顶运算符并输出直到遇到左括号(弹出但不输出)⑤运算符将该运算符与栈顶运算符进行比较如果优先级高于栈顶运算符则压入堆栈(该部分运算还不能进行),如果优先级低于等于栈顶运算符则将栈顶运算符弹出并输出,然后比较新的栈顶运算符.(低于弹出意味着前面部分可以运算,先输出的一定是高优先级运算符,等于弹原创 2021-03-01 19:59:44 · 117 阅读 · 0 评论 -
BF算法及KMP算法
一.BF算法1.原理暴力查找逐个匹配主串字符,然后模式串j值回溯到1重新匹配2.代码实现二.KMP算法1.原理核心是避免不必要的回溯问题是由模式串决定,不是目标串决定只需要将j值模式串中j的位置回溯到next[j]位,而免除了前面不需要的匹配,以此来换取时间2.难点拆解①前后缀②推导next数组next数组:当模式匹配T失败时,next数组对应的元素指导应该用T串的哪个元素进行下一轮的匹配利用已经部分匹配这个有效信息,保持i指针不回溯,通过修改j指针,让模式串尽量地移动到有效原创 2021-02-28 15:59:21 · 1664 阅读 · 0 评论 -
汉诺塔问题(递归)
一.分析问题把问题进行拆分把问题一直拆分 直到盘子只剩下一个为止二.代码实现原创 2021-02-28 10:52:10 · 88 阅读 · 0 评论 -
排序算法
一.普通排序二.冒泡排序若出现只比较没有移动,则表明后面的数字已经排好的顺序,即可以退出循环,因而可以改进冒泡排序,加一个标志变量flag去判断是否有移位三.选择排序先比较,找出min,再交换四.插入排序基本方法:每步将一个待排序的元素,按其排序码大小插入到前面已经排好序的一组元素的适当位置上去,直到元素全部插入为止。分类可以选择不同的方法在已经排好序的有序数据表中寻找插入位置,依据查找方法的不同,分为常用的三种①直接插入排序②折半插入排序③希尔排序1.直接插入排序(.原创 2021-02-24 12:39:24 · 121 阅读 · 0 评论 -
二叉树的建立和四种遍历算法
1.结构体2.创建二叉树(若不满,则用’ '来表示)键盘输入的时候要对应打空格3.前序遍历(若换成中序后序,只需要将根结点,左子树,右子树交换位置即可)4.访问5.主函数原创 2021-02-20 21:30:20 · 423 阅读 · 0 评论 -
树的遍历方法
二叉链表遍历方法(把大家分成一个个小家)1.前序遍历2.中序遍历3.后序遍历4.层序遍历原创 2021-02-20 12:12:46 · 105 阅读 · 2 评论 -
树的表示方法
一.树的结构二.表示方法1.双亲表示法2.孩子双亲表示法代码的实现从小到大原创 2021-02-20 11:32:17 · 130 阅读 · 0 评论 -
两个非降序有序链表序列的交集
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。输入格式:输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。输出格式:在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。输入样例:1 2 5 -12 4 5 8 10 -1输出样例:2 5一.思路将数字储存到链表,然后对比,相等时则存入新链表,并换到下一个数字,不等时,较小的一个换成下一个数字原创 2021-02-19 22:17:58 · 2499 阅读 · 4 评论 -
用栈的顺序存储结构将二进制转换成十进制,八进制,十六进制
一.分析二进制转换成十进制,就是从低位起用每一位去乘以对应位的积,也就是说用第n位去乘以2 * (n - 1),然后全部加起来原创 2021-02-19 22:15:54 · 1281 阅读 · 0 评论 -
区别清空栈和销毁栈以及计算栈当前的容量
一.基本内容二.清空栈元素作废,但本身的物理空间并不发生改变三.销毁栈释放占据的空间四.计算栈当前的容量也就是计算栈中元素的个数(区分栈的最大容量)只需要返回s.top - s.base的 值即可(计算机会自动处理,要注意的是这两个类型要相等,否则会出错) 指针之间可以相减,但不可以相加...原创 2021-02-17 20:16:53 · 2118 阅读 · 0 评论 -
约瑟夫循环问题
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。1.思路先创建循环链表(尾插法) 再根据编号确定是第几个元素 再找到特定的节点进行删除(要知道节点的前一个节点)2.需要的文件以及结构体内容3.创建循环链表(尾插法)i++是先i再++关键在于循环 tail -> next = head -> next最后返原创 2021-02-10 11:25:56 · 494 阅读 · 0 评论 -
魔术师发牌问题
魔术师利用一副牌中的13张黑牌,预先将他们排好后叠放在一起,牌面朝下。对观众说:“我不看牌,只数数就可以猜到每张牌是什么,我大声数数,你们听,不信?现场演示。”魔术师将最上面的那张牌数为1,把他翻过来正好是黑桃A,将黑桃A放在桌子上,第二次数1,2,将第一张牌放在这些牌的下面,将第二张牌翻过来,正好是黑桃2,也将它放在桌子上这样依次进行将13张牌全部翻出,准确无误。一.思路1、创建一个长度为13的单向循环链表,链表中值全部存02、遍历链表进行修改值二.代码部分1.对于牌数是可变的 用宏变量来写原创 2021-02-10 15:50:28 · 240 阅读 · 0 评论 -
如何创建单链表以及循环链表
在这里插入代码片@[TOC](这里写#### 标题 标题定义目录标题)欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计 ,将会带来全新的写作体验;在创作中心设置你喜爱的代码高亮样式原创 2021-02-10 11:07:03 · 1934 阅读 · 1 评论