
数据结构
牛右刀薛面
Know-what and Know-how
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
(16)数据结构-并查集
文章目录1、定义2、数据结构3、函数实现3.1 初始化3.2 合并3.3 查找父节点4、完整代码1、定义并查集:“并”Union, “查”Find 集合。并查集是一种维护集合数据结构。支持一下两个操作。(1)合并:合并两个集合(2)查找:查找两个元素是否在同一个集合2、数据结构实际上就只用一个数组就行了。farther[MaxSize]。p[x] = y; 代表的是x的父亲是y。3、函数实现void Init(int n);int FindFarther(int x);void Un原创 2021-09-27 20:21:06 · 101 阅读 · 1 评论 -
(15)数据结构-平衡二叉树(AVL)
1、定义在使用二叉排序树的时候,有可能会出现插入有序数字,导致最终形成二叉树是一条“长链”,失去了排序树的意义,为了防止这样的情况出现,所以限制了每个节点的平衡因子,使得形成的二叉树具有合适的结构。在AVL树中最重要的一点我觉得就是旋转了。1.1 L旋步骤:(1)让B的左子树成为A的右子树(2)让A成为B的左子树(3)把根节点设为B1.2 R旋步骤:(1)让A的右子树成为B的左子树(2)让B成为A的右子树(3)将A设为根节点1.3 LL形步骤:(1)将C和其子树看成一个原创 2021-09-27 18:58:43 · 297 阅读 · 1 评论 -
(14)数据结构-二叉排序树
1、介绍二叉排序树的中序遍历结果是一个非递减结果。本文介绍二叉排序树的基本实现。2、数据结构typedef int ElemType;typedef struct node{ ElemType data; node * lchild; node * rchild;}BiNode,*BinTree;3、函数实现BinTree InitBinTree(ElemType x);void Insert(BinTree &T, ElemType x);void原创 2021-09-26 18:52:40 · 185 阅读 · 1 评论 -
Path of Equal Weight (30 分)
题目 Given a non-empty tree with root R, and with weight W i W_iWiassigned to each tree node T i T_iTi. The weight of a path from R to L is defined to be the sum of the weights of all the nodes along the path from R to any leaf node L LL.Now given any wei.原创 2021-08-02 12:49:42 · 96 阅读 · 1 评论 -
(13)数据结构-先序中序还原二叉树
1、问题描述给定节点个数,及未知二叉树的先序遍历和中序遍历,求该二叉树的层序遍历。2、问题思路给定二叉树的中序遍历 与先序,后序,层序任一组合可得到唯一一个二叉树,本文以先序遍历为例。先序遍历提供根节点,得到根节点以后,在中序遍历结果中可区分出来左子树与右子树以及根节点的位置k。有了k以后,问题就变成还原k的左右两侧二叉树,问题规模进一步缩小,也就形成了递归(递归式)。在递归过程中,子树的遍历结果在递归过程中长度不断减小,当长度为0的时候,递归就终止了(递归出口)。3、输入样例输入:88原创 2021-09-26 12:17:28 · 269 阅读 · 2 评论 -
(12)数据结构-二叉树基本操作
文章目录1、简介2、数据结构3、函数实现3.1 创建二叉树3.2 三种简单遍历方式3.3 层序遍历方式3.4 修改二叉树节点3.5 交换二叉树中左右子树3.6 计算节点高度3.7 计算节点深度4、完整代码1、简介二叉树有很多性质,书上都有本文不作赘述,主要介绍代码实现部分而。2、数据结构typedef char ElemType;typedef struct node{ ElemType data; int layer; struct node* lchild;原创 2021-09-26 10:35:21 · 198 阅读 · 1 评论 -
(11)数据结构-栈应用-简易计算器
1、简介离散数学中学过将中缀表达式转化为后缀表达式,再进行求解。因此,在求解中缀表达式结果时需要分两步。转化、求解。1.1 转化如何将一个中缀表达式转化为后缀表达式。使用栈st1与栈st2,从左向右扫描中缀表达式如果是操作数,直接压入st1如果是操作符,考虑当前操作符与st2栈顶的优先级关系。– 如果高于栈顶的优先级,则直接压入st2–如果低于或等于栈顶的优先级,则将st2中所有操作符依次出栈并压入st1。 结束以后将当前操作符压入st2。扫描完中缀表达式以后,如果st2还有剩余操作符,原创 2021-09-25 12:59:52 · 229 阅读 · 1 评论 -
(10)数据结构-后缀表达式实现
1、简介栈的应用中有后缀表达式的实现,主要思想为,对于一串字符串,如果是操作数,那么直接入栈,如果是操作符,那么让次栈顶元素与栈顶元素(注意顺序不能变)进行运算。效果如下:2、代码实现本文使用的是STL容器的stack容器,所有的方法都是打包好的,当然也可以自行实现一个。#include<iostream>#include<stack>#include<string>#include<cctype>using namespace std;原创 2021-09-25 10:55:53 · 257 阅读 · 1 评论 -
(9)数据结构-双端队列
声明:本文用于学习使用,设计的双端队列手段稍有不同,但功能是完全一样的。不是pta里面的题目答案。能够独立写出来属于自己代码才是最重要的。思想是,队头入时,队头先移动数据再入,队尾入时直接入再移动。1、简介双端队列是一种能在队列两头进行操作的队列。在STL包里面存在dequeue是已经打包好的双端队列可直接使用2、数据结构typedef int ElemType;typedef int Position;struct QNode{ ElemType *Data; Position原创 2021-09-25 09:49:30 · 235 阅读 · 1 评论 -
(8)数据结构-循环队列
文章目录前言1、简介2、数据结构3、基本操作3.1初始化4、完整代码前言代码这种东西,每个人的想法或多或少有点不一样,不用死磕某一个人的代码,而是要靠自己思考出来数据之间的变化,写出属于自己的代码。1、简介1.1 定义循环队列是基于队列改进的数据结构。初始化:rear = front =0队空:rear == front队满:rear+1 == front。2、数据结构循环队列的数据结构有多种,但是万变不离其宗,不过是换一种方式表达信息罢了。typedef struct{ El原创 2021-09-24 10:43:01 · 161 阅读 · 1 评论 -
(7)数据结构-基本队列实现
1、简介定义:一种先进先出的线性表。队空:front == rear假队满 rear == MaxSize2、数据结构#define MaxSize 50#define Error -1typedef struct{ ElemType Data[MaxSize]; int front,rear;}SqQueue;3、基本操作SqQueue InitQueue(SqQueue Q);bool Empty(SqQueue Q);bool EnQueue(SqQueue原创 2021-09-24 10:21:04 · 224 阅读 · 1 评论 -
(6)数据结构-共享栈
1、共享栈定义:为了节省空间,在一个数组中实现两个栈。2、数据结构typedef int Position;typedef int ElementType;typedef struct SNode{ ElementType *Data; Position top1; Position top2; int MaxSize;}*Stack;3、函数实现Stack CreateStack( int MaxSize );bool Push( Stack S, El原创 2021-09-23 20:46:28 · 440 阅读 · 1 评论 -
(5)数据结构-栈顺序存储
1、栈1.1 定义先进先出的受限制的线性表。栈顶指针:S.top,初始值为-1,栈顶元素S.data[S.top];进栈操作:栈不满时,栈顶指针增一再入栈;出栈操作:栈不空时,先出栈,栈顶指针再减一栈空条件:S.top == -1栈满条件:S.top == MaxSize -1栈长:S.top+12、 数据结构typedef struct{ ElemType data[MaxSize]; int top;}SqStack;3、函数实现SqStack InitS原创 2021-09-23 20:23:20 · 347 阅读 · 1 评论 -
(4)数据结构-线性表补充
文章目录1、 双链表1.1 定义1.2 优点1.3 数据结构1.4 插入操作1.5 删除操作2、循环链表2.1 循环单链表2.1.1 定义2.1.2 优点2.1.3 判空条件2.2 循环双链表2.2.1 定义3、 静态链表1、 双链表1.1 定义双链表就是每个节点有两个指针,分别指向前驱节点和后驱节点。1.2 优点可以方便的找到每个节点的前驱节点。1.3 数据结构typedef int ElemType;typedef struct DNode{ ElemType data;原创 2021-09-23 19:56:24 · 125 阅读 · 1 评论 -
(3)数据结构-线性表链式存储
1、链式存储的操作LinkList InitList(LinkList &L);LinkList List_HeadInsert(LinkList &L, int n);LinkList List_TailInsert(LinkList &L, int n);void PrintList(LinkList L);bool Empty(LinkList L);ElemType GetElem(LinkList L, int i);Status LocateElem(Li原创 2021-09-23 19:14:32 · 332 阅读 · 1 评论 -
(2)数据结构-线性表顺序存储
文章目录1、简介2、完整代码1、简介线性表是具有相同数据类型的n个数据元素的有限序列。对于线性表的操作有如下几种:void InitList(SqList &L); //定长void InitList(SqList &L, int n); //不定长Status Length(SqList &L);Status LocateElem(SqList &L, ElemType e);ElemType GetElem(SqList L, Status i原创 2021-09-23 16:51:45 · 156 阅读 · 1 评论 -
(1)数据结构-绪论
1、数据结构的基本概念1.1 基本概念数据:信息的载体数据元素:数据的基本单位数据项:构成数据元素的不可分割的最小单位数据对象:具有相同性质的数据元素的集合,数据的一个子集数据类型:值的集合和定义在此集合上的一组操作的总称原子类型:不可再分。结构类型:可分成若干成分的数据类型。抽象数据类型:抽象数据组织及与之相关的操作。抽象数据类型(ADT):一个数学模型及定义在该模型上的一组操作。数据结构:数据元素之间的相互关系。1.2 数据结构三要素数据结构三要素:逻辑结构,存储结构,数据原创 2021-09-23 09:48:49 · 101 阅读 · 1 评论 -
动态规划学习笔记
1、什么是动态规划今天看了算法笔记上的动态规划专题,根据我目前的理解的话,动态规划没有固定的代码,但是当遇到一件问题拥有重叠子问题和最优子结构,并且能够使用状态转移方程表示出来,那么这个问题一般情况下就属于动态规划了。动态规划问题求解时需记录每一步得出来的数据,因为每一步可能都会被多次考虑。动态规划要看谁能笑到最后,暂时的领先说明不了什么。重叠子问题:一个问题的字问题直接有重叠计算的部分最优子结构:一个问题的最优解可以由其字问题的最优解构造出来状态转移方程:类似于an=an+1+2a_n = a_{原创 2021-09-01 18:17:22 · 216 阅读 · 0 评论 -
二叉搜索树操作集
//实现BinTree Insert( BinTree BST, ElementType X );BinTree Delete( BinTree BST, ElementType X );Position Find( BinTree BST, ElementType X );Position FindMin( BinTree BST );Position FindMax( BinTree BST );1、二叉搜索树的插入(1)找到第一个null的位置,插入该位置就是了(2)如果当前节点不是原创 2021-08-12 13:02:05 · 392 阅读 · 2 评论 -
任务调度的合理性 (25 分)(拓扑排序)
假定一个工程项目由一组子任务构成,子任务之间有的可以并行执行,有的必须在完成了其它一些子任务后才能执行。“任务调度”包括一组子任务、以及每个子任务可以执行所依赖的子任务集。比如完成一个专业的所有课程学习和毕业设计可以看成一个本科生要完成的一项工程,各门课程可以看成是子任务。有些课程可以同时开设,比如英语和C程序设计,它们没有必须先修哪门的约束;有些课程则不可以同时开设,因为它们有先后的依赖关系,比如C程序设计和数据结构两门课,必须先学习前者。但是需要注意的是,对一组子任务,并不是任意的任务调度都是一个可原创 2021-03-02 21:23:12 · 293 阅读 · 0 评论 -
旅游规划 (25 分)(Dijkstra)
有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。输入格式:输入说明:输入数据的第1行给出4个正整数N、M、S、D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0~(N−1);M是高速公路的条数;S是出发地的城市编号;D是目的地的城市编号。随后的M行中,每行给出一条高速公路的信息,分别是:城市1、城市2、高速公路长度、收费额,中原创 2021-03-02 20:40:53 · 501 阅读 · 0 评论 -
哥尼斯堡的“七桥问题” (25 分)(DFS)
哥尼斯堡是位于普累格河上的一座城市,它包含两个岛屿及连接它们的七座桥,如下图所示。可否走过这样的七座桥,而且每桥只走过一次?瑞士数学家欧拉(Leonhard Euler,1707—1783)最终解决了这个问题,并由此创立了拓扑学。这个问题如今可以描述为判断欧拉回路是否存在的问题。欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个无向图,问是否存在欧拉回路?输入格式:输入第一行给出两个正整数,分别是节点数N (1≤N≤1000)和边数M;随后的M行对应M条边,每原创 2021-02-25 15:30:09 · 679 阅读 · 0 评论 -
航空公司VIP客户查询 (25 分)
不少航空公司都会提供优惠的会员服务,当某顾客飞行里程累积达到一定数量后,可以使用里程积分直接兑换奖励机票或奖励升舱等服务。现给定某航空公司全体会员的飞行记录,要求实现根据身份证号码快速查询会员里程积分的功能。输入格式:输入首先给出两个正整数N(≤105 )和K(≤500)。其中K是最低里程,即为照顾乘坐短程航班的会员,航空公司还会将航程低于K公里的航班也按K公里累积。随后N行,每行给出一条飞行记录。飞行记录的输入格式为:18位身份证号码(空格)飞行里程。其中身份证号码由17位数字加最后一位校验码组原创 2021-02-25 13:41:10 · 770 阅读 · 0 评论 -
两个有序链表序列的合并 (20 分)
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。输入格式:输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。输出格式:在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。输入样例:1 3 5 -12 4 6 8 10 -1输出样例:1 2 3 4 5 6 8 10题目思路:常规建立链表思路。当然,这道题还能使用vector容器解决,更加原创 2021-02-24 15:41:59 · 589 阅读 · 0 评论 -
习题3.8 符号配对 (20 分)
请编写程序检查C语言源程序中下列符号是否配对:/* 与 */、(与)、[与]、{与}。输入格式:输入为一个C语言源程序。当读到某一行中只有一个句点.和一个回车的时候,标志着输入结束。程序中需要检查配对的符号不超过100个。输出格式:首先,如果所有符号配对正确,则在第一行中输出YES,否则输出NO。然后在第二行中指出第一个不配对的符号:如果缺少左符号,则输出?-右符号;如果缺少右符号,则输出左符号-?。题目思路:看到符号匹配问题,直接考虑到使用栈解决,可以使用C++里的< stack原创 2021-02-19 16:35:36 · 834 阅读 · 0 评论 -
2-9 装箱问题 (20 分)
2-9 装箱问题 (20 分)假设有N项物品,大小分别为s1 、s2 、…、si 、…、sN,其中si为满足1≤si ≤100的整数。要把这些物品装入到容量为100的一批箱子(序号1-N)中。装箱方法是:对每项物品, 顺序扫描箱子,把该物品放入足以能够容下它的第一个箱子中。请写一个程序模拟这种装箱过程,并输出每个物品所在的箱子序号,以及放置全部物品所需的箱子数目。输入格式:输入第一行给出物品个数N(≤1000);第二行给出N个正整数si(1≤si ≤100,表示第i项物原创 2021-02-19 11:13:35 · 288 阅读 · 5 评论