数据结构
文章平均质量分 55
是牛大春呀
希望在学习生涯中多写一点博客,分享一下自己的拙见。我想,激情也许会随着岁月的流逝而逐渐褪去,但,热爱与信仰一定会一直陪伴着我们。
展开
-
双链表的插入、删除、查找等操作
#include<iostream>#include<cstring>#include <set>#include <map>#include <ctime>#include <bitset>#include <sstream>#include <algorithm>#include<math.h>#include<stdio.h>#include<stdlib.原创 2022-04-06 23:17:14 · 709 阅读 · 0 评论 -
单链表实现逆置(倒置)的两种方法
#include<iostream>#include<cstring>#include <set>#include <map>#include <ctime>#include <bitset>#include <sstream>#include <algorithm>#include<math.h>#include<stdio.h>#include<stdlib.原创 2022-04-04 20:18:29 · 2816 阅读 · 0 评论 -
图的同构识别算法——C++代码实现
给定的两个邻接矩阵,判断其三个必要非充分条件:①结点数目相同②变数相同③度数相同的结点数相同以①②③为前提进行矩阵变换,看给定的两个矩阵中,其中的一个矩阵是否能变换为另一个矩阵;实现代码和说明:#include<iostream>#include<stdlib.h>#define MAX 100 using namespace std; struct AdjacencyMatrix{//邻接矩阵 int points; /原创 2021-11-26 13:57:42 · 7584 阅读 · 2 评论 -
图的着色问题
问题1:图着色问题是一个著名的NP完全问题。给定无向图G=(V,E),问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色?但本题并不是要你解决这个着色问题,而是对给定的一种颜色分配,请你判断这是否是图着色问题的一个解。输入格式:输入在第一行给出3个整数V(0<V≤500)、E(≥0)和K(0<K≤V),分别是无向图的顶点数、边数、以及颜色数。顶点和颜色都从1到V编号。随后E行,每行给出一条边的两个端点的编号。在图的信息给出之后,给出了一个正整数N(≤20原创 2021-11-18 10:29:15 · 5782 阅读 · 0 评论 -
堆排序[算法]
堆排序的思想:先从无序的数组中,构建一个堆,可以是大根堆,大根堆的排序结果是从小到大的,小根堆的排序结果是从大到小的,为什么呢?因为大根堆生成后,接下来的操作是:堆顶和数组中最后的一个元素进行交换,交换后,堆顶数据的位置不再发生变化(位置不再发生变化的意思是:就是这个数已经是排好序的了,第一次是数组最后一个位置的数据,第二次就是倒数第二个,以此类推),也就是说,最大的,放在最后,然后进一步的操作就是:对剩下的数据(就是不包含刚才那个排好序的数) 生成一个次小的 大根堆,重复上述操作,堆排序如果构建的是一个小原创 2021-01-03 11:20:06 · 918 阅读 · 0 评论 -
【经典算法】 之 Dijkstra算法:求图中任意两顶点的最短路径
Dijkstra算法是图中找任意两点中最短路径的一种经典算法。重点的步骤总结如下:①:算法采用了并查集 (之后都叫它为 最短路径顶点集 ):即每次都找离开始顶点距离最短的顶点,然后把该顶点加入最短路径顶点集中(已经加入最短路径顶点集里的那些顶点 下一次就会跳过它了,并且,在顶点集里 任意两个顶点间的距离 都已经是最短)②:用来记录从源点(开始顶点) 到vi (0<=i<=numVertices) 的最短距离 的数组dist[numVertices] ,并且这个数组的元素值是会不断变化的,为原创 2020-12-19 12:13:05 · 4060 阅读 · 1 评论 -
两个经典的算法:图的深度优先搜索(DFS)、广度优先搜索(BFS)、和判断有向(或无向)图的连通分量个数并输出
什么是深度优先搜索呢?就是从一个切入点 切入,然后遇到符合条件的就进入递归,好比一个人走迷宫,找到路可以走就一直深入往下走,走啊走,走到死路的时候就回退到刚才的岔路口,走另外一条路,这样,人终会走出迷宫(不过走迷宫可以不走完,而这个图的遍历是要走完全部的)。图的深度优先搜索的方法和过程举例:比如说是下面这个图,如果从A开始出发的话那么过程就如图所示:A ->D ->F ->H ->I ->C ->B ->E ->G为什么会这样遍历呢? 这就和刚才的原创 2020-12-16 22:39:51 · 729 阅读 · 0 评论 -
邻接表实现图的构造 (包含有向图和无向图) 实现 插入或者删除 顶点、边
代码和相关注释如下:#include<iostream>#include<cstring>#include<math.h>#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<vector>#include<queue>#include<stack>using namespace std;const int ma原创 2020-12-13 21:00:34 · 2266 阅读 · 0 评论 -
邻接矩阵实现图的构造 (包含有向图和无向图) 实现 插入或者删除 顶点、边
代码与相关注释如下:#include<iostream>#include<cstring>#include<math.h>#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<vector>#include<queue>#include<stack>using namespace std;const int ma原创 2020-12-12 20:06:18 · 2902 阅读 · 0 评论 -
哈夫曼(赫夫曼)树的生成、哈夫曼(赫夫曼)编码和对哈夫曼编码解码(译码)
“喂,兄弟,最近无聊透顶了,有没有什么书可看?”“我这有《三国演义》的电子书,你要不要?”“‘既生瑜,何生亮。’ 《三国演义》好呀,你邮件发给我!”“OK!,文件1M多大小,好像大了点。我打个包,稍等……哈哈,少了一半,压缩效果不错呀。”“太棒了,快点传给我把。” ——《大话数据结构》压缩和哈夫曼编码息息相关,压缩的原理简单点来说就是将要压缩的文本重新编码,减少不必要的空间,那哈夫曼编码要如何生成呢?哈夫曼编码的生成就得需要 哈夫曼树。那哈夫曼树是怎么生成的呢?假如,有 A(5) , B(原创 2020-12-03 21:44:48 · 517 阅读 · 0 评论 -
C++中自带的栈和队列以及对应方法的使用
C++为了用户的方便使用,自带栈和队列以及对应的成员方法因此,我们只需要引入头文件,就可以轻松使用栈和队列的对应功能了。#include<stack>#include<queue>//这是栈和队列的两个头文件关于栈//假如我们要定义一个栈,我们可以这样子定义:stack<int> a ;//假如我们要定义3个栈,我们可以这样定义:stack<int> b[3] ;//其中,栈的方法有://empty() 如果原创 2020-11-22 20:23:40 · 846 阅读 · 0 评论 -
二叉树的简要概述和基本操作
二叉树是一种特别的树,如果是满二叉树的话,可以考虑使用顺序存储结构,其他的情况就得利用链式存储,否则会造成空间上的浪费:本文章实代码现二叉树的内容具体如下:先序构造 二叉树,利用,(前序)先序遍历、中序遍历、后序遍历、层序遍历 来遍历二叉树。二叉树的拷贝、析构(删除二叉树)、求二叉树的结点个数、计算二叉树的高度、查找二叉树某一个结点的父节点、根据所给的关键值找结点的地址等。具体代码实现如下图这样的一棵二叉树具体实现代码如下:#include<iostream>#include &原创 2020-11-22 16:04:33 · 267 阅读 · 0 评论 -
回文数[算法]
回文数 (20分)回文数是一种很有趣的数,正反读起来都一样,比如123321或者123454321,单个的数字还有0,都是回文数。但是我们熟悉的回文数都是十进制下的,现在我们加大难度,对一个给定的数,想知道它在其他进制下是不是回文数。输入格式:在一行中给出2的整数N和R,其中N是不超过10的9次方的正整数,是需要判断的数,R是基,R=10表示十进制,R=2表示是二进制,R是不小于2,不超过10的9次方的正整数。输出格式:对每一组输入,如果N在R进制下式回文数,那么就就第一行输出“Yes”,否则,输原创 2020-11-15 00:40:55 · 922 阅读 · 0 评论 -
广义表的拷贝 遍历 删除 置换(替换) 具体实现代码
直接上代码了…#include<iostream>#include<cstring>#include<math.h>#include<stdlib.h>using namespace std;enum GlistNodeType {ATOM,LIST};template <class T >struct GlistNode{ GlistNodeType type;//节点类型 union{ T data ;原创 2020-10-24 17:08:13 · 394 阅读 · 0 评论 -
稀疏矩阵(数组)转化为三元组后三元组的快速转置
稀疏数组 如:0 3 0 0 7 0 00 0 0 0 0 10 00 -5 0 0 0 0 00 0 6 0 -9 0 00 0 0 0 0 0 00 0 0 1 0 0 0转化为三元数组 为(左边的 A.triList):然后这个数组 行变成列,然后列变成行,而且一次就能排序好 ,该怎么做呢?这就需要类似动态规划的方法了, 我们先读取一遍,AtriList ,然后 根据 AtriList 的列 统计 相同的列出现了 多少次, 并记录在cnum数组中, 比如说 ,AtriList中原创 2020-10-18 14:05:37 · 854 阅读 · 0 评论 -
逆波兰计算器 进阶版(可以直接计算中缀表达式,支持 小数,负数)
2020年 4-27号 ,我发表了这篇文章,然后这篇文章的代码不支持 小数,负数,然后于今天 21点07分我把这个问题解决了(不是从四月份开始解决的,是因为 之前上网课没时间弄,然后这个学期学数据结构,所以就搞一波,没有看网上的博客,然后全都是自己一个人解决的)直接上代码!#include<iostream>#include<cstring>#include<math.h>#include<ctype.h>//isdigit()头文件#in原创 2020-10-08 21:14:28 · 592 阅读 · 2 评论 -
单链表的反转
本题要求实现一个函数,将给定的单链表逆转。函数接口定义:List Reverse( List L );其中List结构定义如下:typedef struct Node *PtrToNode;struct Node { ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */};typedef PtrToNode List; /* 定义单链表类型 */L是给定单链表,函数Reverse要返回被逆转后的原创 2020-10-03 00:54:05 · 144 阅读 · 0 评论 -
C++实现链表的基本功能
我们大二的数据结构 是用C++描述的,所以,我得用C++ 来实现一波单链表的创建,为了这个链表存储数据的灵活性,我利用了 模板来做,具体的实现代码如下:#include<iostream>#include<cstring>#include<math.h>#include<stdlib.h>#define len sizeof(struct Node)using namespace std;template <class T>stru原创 2020-09-22 01:25:51 · 197 阅读 · 0 评论 -
利用栈的特性 反向输出单链表 (百度面试题)
百度之前 出过一个面试题 说 :给一个单链表,如何反向输出?= =可能有的小伙伴 看过我 上一期的 单链表反转 , 说将 单链表反转! 然后 逐个输出! 嗯,这种 方法的确是可以的,不过 会 破坏 单链表的结构! 那再反转一次,两级反转!! ……的确可以呢,不过 应该会耗时很长吧,所以 ,直接 用栈 一次性弄好不就 行啦什么是栈?之前的博客 写过 ,是一种先进后出的数据结构因此~ 只要我们 按顺序 把 头结点 依次存入栈中~~~ 那么不就能够 在弹栈的时候 根据结点的不同 输出 了~?原创 2020-06-15 13:13:56 · 460 阅读 · 0 评论 -
循环队列与数组
队列 是只允许在一段进行插入操作,而在另一端进行删除操作的线性表 。队列是一种先进先出的线性表格 允许插入的一段是 队尾, 允许删除的一段是队头。如图:然后,我们用(q.rear - q.front +maxsize )%maxsize 求出 队列当前的长度如图 因为这个rear 后指针 是可以 比front 小 ,也可以 比 front 大(因为是循环的 这两个指针都会在 0-4 的闭区间里 转换 ) 所以 呢,如果rear 比 front 小 ,那么长度就是 如果rear 大于 f原创 2020-05-11 21:13:25 · 239 阅读 · 0 评论 -
二叉树的建立与前序遍历
这篇博客 将如何创建二叉树和如何用前序遍历 法 遍历 二叉树前序遍历:若二叉树为空,则空操作返回,否则 先访问根结点,然后前序遍历左子树,再前序遍历右子树具体代码如下:#include<stdio.h>#include<stdlib.h> typedef struct bitnode //二叉树结点 { char data ;//数据 struct b...原创 2020-05-03 21:44:58 · 287 阅读 · 0 评论 -
递归解决八皇后问题
八皇后问题,一个古老而著名的问题,是回溯算法的典型案例。该问题由国际西洋棋棋手马克斯·贝瑟尔于 1848 年提出:在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有 76 种方案。1854 年在柏林的象棋杂志上不同的作者发表了 40 种不同的解,后来有人用图论的方法解出 92 种结果。计算机发明后,有多种计算机语...原创 2020-04-28 02:50:54 · 290 阅读 · 0 评论 -
解决令人头疼的汉诺塔问题(递归)
相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。代码如下 (这篇文章 的杆子 从左...原创 2020-04-27 19:55:50 · 221 阅读 · 0 评论 -
直接运算中缀表达式(不支持负数)
利用栈的特性,我们可以将中缀表达式直接转换为后缀表达式,然后呢,将它们存进 字符数组中,然后 将字符数组中的数字转化为数字后,遇到符号 就进行运算 ,就可以实现中缀表达式的运算了~具体代码如下#include<stdio.h>#include<stdlib.h>#include<math.h>#include<ctype.h>//isdig...原创 2020-04-27 00:59:55 · 302 阅读 · 0 评论 -
利用栈的原理,将中缀表达式转换为逆波兰表达式
今天来讲一下如何利用栈记忆的特性,将中缀表达式 转换成逆波兰表达式。可能有初学者会问,为什么需要转换成逆波兰表达式啊?这是因为,计算机识别不了中缀表达式,我们从计算器中输入的数据都是要通过转换,变成逆波兰表达式后, 再交给计算器计算的,如果学会了中缀表达式 转换成逆波兰表达式的方法,你就可以轻松编辑一个计算器啦~这篇博客可能对初学者来说会比较难以理解(博主是通过九牛二虎之力才搞明白的…o(︶...原创 2020-04-26 01:24:16 · 311 阅读 · 0 评论 -
利用栈的特性实现逆波兰表达式的运算(无括号)
百度原文:逆波兰表达式又叫做后缀表达式。逆波兰表示法是波兰逻辑学家J・卢卡西维兹(J・ Lukasewicz)于1929年首先提出的一种表达式的表示方法 。后来,人们就把用这种表示法写出的表达式称作“逆波兰表达式”。逆波兰表达式把运算量写在前面,把算符写在后面。这篇博客先讲 没有括号的 逆波兰表达式运算实现代码如下:#include<stdio.h>#include<...原创 2020-04-25 18:57:23 · 243 阅读 · 0 评论 -
利用栈的特性进行进制转换
百度原话 :栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bott...原创 2020-04-25 15:16:26 · 484 阅读 · 0 评论 -
利用双向循环链表解决比较棘手的输出问题
在这里插入图片描述就是输出字母的一道题目,题目是这样的:有A-Z个字母 正序排放,现如果输入一个正数N,那么前面N个数就会最后输入,如果输入的是一个负数N,那么 后面的N个数就先输出博主刚学完双向循环链表,感觉做这个 非常的简单,(但是如果没学的话,做起来无解 ,可能是博主太笨啦┭┮﹏┭┮)代码如下#include<stdio.h>#include<stdlib....原创 2020-04-24 20:59:42 · 228 阅读 · 0 评论 -
双向循环链表的创建,插入,读取,与删除操作
今天我学习了双向循环链表,不过与以往的不同,这次的双向循环链表 有坑,是巨坑… 我以为写的会很顺利 没想到 我竟然踩了“雷”…好尴尬哦,下面我们来学习这个 双向循环链表把~对了,说一下为什么需要双向循环链表把,如果一个链表是单向的,那么,如果在读取过程中,要读取已读取数据的前一个 或者前面几个数据怎么办呢? 比如 1–>2–>3–>4–>5 如果是循环链表的话,我读到了...原创 2020-04-24 20:02:16 · 832 阅读 · 0 评论 -
循环链表解决拉丁方阵问题
拉丁方阵是一种N*N的方阵,方阵中恰巧 有N种不同的元素,每种元素恰好有N个,并且每种元素在一行和一列中恰好出现一次,例如这下面这个图片就是一个3X3的拉丁方阵这个实在太简单了…操作只要两步 创建循环链表,移动头结点…但是如果没有学链表的话 ,写起来可能很麻烦把…我想了一下,的确非常的麻烦… 链表真是个好东西啊!代码如下:#include<stdio.h>#include&...原创 2020-04-24 01:57:38 · 256 阅读 · 0 评论