数据结构
IT_iverson
欢迎大家一起交流学习,点击一篇博客进入分类中方便自己阅读!
展开
-
c语言动态顺序表的实现
动态顺序表是在静态顺序表的基础上优化更改的1.其中将静态顺序表中的数组数据类型改成了指针类型方便内存的开辟2.多增加了一个容量的变量来表示顺序表的容量3.初始化的时候需要给*data动态开辟空间4.多增加的函数有1.增容函数 2.减容函数 3.空间销毁函数(因为malloc的空间使用完毕后一定要释放内存,不然会造成内存泄露)动态顺序表的优点:开辟的空间灵活自如,添加元素时自原创 2017-07-28 12:01:52 · 762 阅读 · 0 评论 -
二叉树相关功能的实现
一.本篇博客的主要内容1.二叉树的前序遍历递归创建2.拷贝二叉树(赋值运算符重载和拷贝构造函数)3.二叉树的前序遍历4.二叉树的中序遍历5.二叉树的后序遍历6.二叉树的层序遍历7.二叉树的所有结点个数8.二叉树的叶子结点个数9.求第k层的结点个数10.求二叉树的高度(深度)11.在二叉树中查找某个元素,并返回元素结点位置12.查找某个结点的双亲结点,原创 2017-11-29 11:11:45 · 533 阅读 · 0 评论 -
线索化二叉树&&线索化后的二叉树遍历
能看到线索化二叉树这块的对于一些概念性的问题肯定就有了一定的了解,这里就不多说了,下面直接上正餐因为线索话的话,当左子树为为空的时候我们需要让其指向其前驱元素,当右子数为空的时候我们需要让其指向其后继的元素,这样就把整个二叉树线索化起来了,因为我们就需要标记一下左右子树是否被线索花,在这里我们用枚举来作为标记enum//用来标记是否线索化,LINK表示有左右子树没有被线索化,THREAD表原创 2017-12-09 13:28:36 · 580 阅读 · 1 评论 -
对称矩阵和稀疏矩阵的相关问题
关于概念性的问题这里就不多介绍了,直接说相关的算法了。核心内容:1.对称矩阵的压缩存储2.稀疏矩阵的压缩存储3.稀疏矩阵的转置4.稀疏矩阵的加法一:①对称矩阵的压缩存储②返回指定位置元素③还原对称矩阵(使用压缩储存的元素打印对称矩阵)①压缩存储因为对称矩阵的特性,我们在储存矩阵的时候可以不需要将数组中的所有元素都保存下来,而是只需要保存其中的上三角或者下三角原创 2017-11-26 16:56:36 · 813 阅读 · 0 评论 -
快速排序
首先快速排序有三种方式下面我来一一介绍1.最基本的方式,基准值法算法描述:取第一个或最后一个元素为基准值(我在这里取第一个元素),然后定义两个标记left和right分别指向数组的起始位置和最后一个位置,然后right从后往前走找到小于基准值的时候停下来,left开始往后走,找到大于基准值的元素的停下来,然后交换arr[left]和array[right]的值,重复上述步骤直到left>=原创 2018-01-21 15:15:47 · 449 阅读 · 0 评论 -
排序--插入排序&&希尔排序
一.插入排序1.直接插入排序简单说明:是一种稳定的排序算法(稳定就是说两个数的大小一样的话不会交换位置),时间复杂度为O(N^2)插入排序的时间复杂度分析。在最坏情况下,数组完全逆序,插入第2个元素时要考察前1个元素,插入第3个元素时,要考虑前2个元素,……,插入第N个元素,要考虑前 N - 1 个元素。因此,最坏情况下的比较次数是 1 + 2 + 3 + ... +原创 2018-01-12 15:31:37 · 405 阅读 · 0 评论 -
大小堆&&堆排序&&堆的应用
一.首先说一下堆的概念吧这里就不按照标准的概念来说了,就说说我理解的堆。堆就是一个数组中的元素,参考着完全二叉树的这种数据结构存储在数组中,这样就是一个堆。注意:这里是参考,实际的存储还是在数组中,只不过数组中的存储顺序满足完全二叉树而已。说到堆离不开大小堆,下面继续介绍大小堆的概念。1.最小堆:因为数组中的元素是参考完全二叉树的存储顺序存储的,所以小堆就是每一个双亲结点的值都原创 2018-01-09 16:05:23 · 1070 阅读 · 1 评论 -
归并排序---递归&&非递归
首先简单的介绍一下归并算法的核心思想将我们将一组数据分成若干个组,即分到每组数据为1个元素的情况下就不用分了,然后在分别比较每两组数据元素的大小,将其合并为一组数据再去和其他同等级别的组的数据元素取比较,然后合并到临时的空间中然后在复制给原空间,依此类推,直到最后全部合并完毕,数组就成为一组有序序列了。下面举个例子1.归并排序的递归写法上述图示其实已经很明白了,下面给出算法结合原创 2018-01-26 01:23:54 · 496 阅读 · 0 评论 -
哈夫曼树的实现
在这里关于什么是哈夫曼树就不多说了,自己去查阅相关的资料书籍,下面来说说如何实现哈夫曼树。首先语言描述一下实现的步骤:假设这里给出得到数组元素为5,3,1,7 1.在当前数组中找出最小的两个数各自为一个结点生成如下:原创 2018-01-10 11:17:05 · 2656 阅读 · 1 评论 -
计数排序和基数排序()
这两种排序方法是不需要比较的排序方法。下面我来一个一个介绍1.基数排序基本算法:遍历一遍原数组,将其每个元素出现的次数用一个足够容纳其范围的数组来标记,即统计每个元素出现了多少次,然后在遍历这个标记数组来还原原数组,这样就拍好序了下面给出算法代码:void CoutSort(int arr[], int size){ //统计最大最小的元素 int Maxdata = arr原创 2018-01-26 21:09:48 · 346 阅读 · 0 评论 -
AVLBinTree(二叉平衡树)
由于二叉搜索树的不平衡性会导致搜索的效率降低(比如单支情况),所以在将二叉搜索树升级改造成为了二叉平衡树。AVL树是一个“加上了额外平衡条件”的二叉搜索树,其平衡为为了保持整个树的深度为O(logN),直观上的最佳平衡状态是每个节点的左右子树的高度相同,但是这个条件过于严苛,所以AVL树退而求次之,它的要求就是任何节点 的左右子树高度相差最多1,虽然这是一个比较弱的条件,但是足够保持树的平衡了原创 2018-02-04 00:25:20 · 398 阅读 · 0 评论 -
二叉树的非递归遍历
本篇博客的主要内容是:1.二叉树前序遍历(非递归)2.二叉树中序遍历(非递归)3.二叉树后序遍历(非递归)首先给出二叉树形象图一.二叉树的前序遍历方法1:算法:①将根和左子树每个结点都用循环压栈进去 ②当循环跳出来以后意味着左子树处理完了,这个时候弹出栈顶元素,判断此元素是否有右子数,如果有进入右子书,然后把右子数当成一个新的结点继原创 2017-11-30 18:12:36 · 354 阅读 · 1 评论 -
栈相关功能的实现(C语言+C++)
1.顺序栈能看到栈这里,肯定有可一定的基础了,废话不多说,接下来直接给出顺序栈的基本功能,1.初始化栈,压栈,出栈,返回栈顶元素,把栈置空,销毁栈,获取栈中当前元素个数。代码如下:#include#include#include#define MAX 10//初始分配的栈的容量#define ADD 10//每次增加的栈的容量typedef double Da原创 2017-10-09 21:07:07 · 853 阅读 · 0 评论 -
STL模拟实现List+迭代器
List的底层数据结构的实现就是双向循环链表,下面给出结点的封装,简易迭代器的封装,还有头指针的封装和相关功能的实现和测试的结果1.结点的封装代码如下:templatestruct ListNode//定义结点的类{public: ListNode *_pre;//后指针 ListNode *_next;//前指针 T _data;//储存数据public: ListNod原创 2017-11-02 17:09:54 · 662 阅读 · 0 评论 -
时间复杂度和空间复杂度
一.什么是时间复杂度呢?解析:时间复杂度其实就是函数,函数计算执行的 基本操作次数。(这里的函数是指数学里面的函数,而不是C语法里的函数)为什么时间复杂度不是计算执行的实践而是次数呢?解析:因为我们无法计算执行的时间,比如不同的机器不同的配置,同一个算法的运行时间都是不一样的。所以我们只能在这里计算执行的次数来表示算法的性能。首先来看一个简单的例子:二.算法分析的分类原创 2017-09-29 08:17:37 · 1147 阅读 · 0 评论 -
链表常见面试题-C语言实现
前面的博客已经介绍过了实现链表的一些相关的功能,所以在这里就不对链表多加解释说明了。对于链表相关面试题这里解释几个有特点的题:1.对于求查找链表的中间结点,要求只能遍历一次链表?方式:使用两个指针,一个快指针,一个慢指针,快指针走两步慢指针走一步,这样当快指针指向结尾空指针的时候,慢指针刚好指向中间结点。图示:2.查找链表倒数第K个结点要求只能遍历一次链表?方式:同原创 2017-08-03 14:03:37 · 7992 阅读 · 1 评论 -
c语言单向链表的基本功能的实现
1.单链表整体以结构提为框架,为了简单实现基本功能,里面的结点数据元素就定义为一个int data 型元素和next指针具体如下:typedef struct Node{ DataType data;//数据 struct Node *next;//指针}Node;首先给Lists.h出头文件部分,主要是头文件和功能函数的声明#define _CRT_SECURE_NO_WAR原创 2017-07-29 20:27:49 · 787 阅读 · 0 评论 -
c语言静态顺序表的相关功能实现
首先给出头文件部分,是所实现函数功能的声明和头文件的引用SeqList.h#define _CRT_SECURE_NO_WARNINGS 1javascript:void(0);#ifndef __SEQLIST_H__ #define __SEQLIST_H__ #include#include#include #define MAX 10 typedef int DataType;typedef s原创 2017-07-27 19:29:57 · 713 阅读 · 0 评论 -
逆波兰表达式
逆波兰表达式 逆波兰表达式又叫做做后缀表达式。在通常的表达式中,二元运算符总是置于与之相关的两个对象之间,这是中缀表达式,而逆波兰表达式是每一运算符都置于其运算对象之后,所以称为后缀表达式。,所以称为后缀表达式。举例:中缀:4+5 后缀:4 5 +逆波兰表达的式的实现原理要用到栈的这种数据结构。算法:输入你要计算的逆波兰表达式,然后以此读取判断,如原创 2017-10-07 21:54:24 · 1203 阅读 · 0 评论 -
中缀表达式转为后缀表达式
在逆波兰表达式的博客中已经说过了中缀表达式和后归表达式的区别了,所以接下来直奔主题。例子:中缀表达式:(1+2)*5+10/3 后缀表达式:1 2 + 5 * 10 3 / + 如果将上述的中缀表达式转换为后缀表达式?转换原则: 1.当读取到一个数字的时候直接将其输出,不进行压栈,如果遇见操作符则不输出将其进行压栈,左括号也要原创 2017-10-08 20:10:40 · 565 阅读 · 0 评论 -
进制转换
栈的应用进制转换话不多说直奔主题1.二进制转换为10进制首先看二进制数:101010计算方式是:从左到右(低位到高位)以此0*2^0+1*2^1+0*2^2+1*2^3+0*2^4+1*2^5=2^1+2^3+2^5=42算法:将你输入的二进制数一次入栈,然后再一次出栈进行sum=sum+(e-48)pow(2,i);这么一个转换。这里的sum就是计算转换后的数字的总和,e为出原创 2017-10-09 18:29:41 · 337 阅读 · 0 评论 -
队列的相关实现
1.队列的链式实现方式原创 2017-10-15 22:01:54 · 444 阅读 · 0 评论 -
栈和队列的相关面试题
问题一:实现一个栈,要求实现push(出栈),pop(出栈),Min(返回栈中最小值的操作)的时间复杂度为0(1).原创 2017-10-16 22:25:48 · 626 阅读 · 0 评论 -
STL模拟实现vector
首先给出所需要实现的函数接口和类的封装templateclass Vector{public: Vector();//无参构造函数 Vector(const T* array, size_t size);//有参数构造函数 Vector(const Vector & v);//拷贝构造函数 Vector& operator=(const Vector& s);//赋值运算符重载原创 2017-10-31 13:29:13 · 476 阅读 · 0 评论 -
二叉搜索树
此篇博客主要讲一下二叉搜索树的一下基本操作的实现,关于概念性的问题就不啰嗦了1.首先给出搜索树结点的定义templatestruct BSTNode//树的结点{ BSTNode *_pLeft; BSTNode *_pRight; K _data; V _value; BSTNode(const K &data, const V &value) :_data(data原创 2018-01-29 18:48:27 · 283 阅读 · 0 评论