![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 73
_acme_
这个作者很懒,什么都没留下…
展开
-
线性表之顺序表
基本思想:用数组来存储数据,其实也就是把数组包装一下,变成可以增删改查的数据结构。优点:检索数据快,时间复杂度为0(1)。缺点:插入数据慢,最好的情况是直接插入末尾,时间复杂度为0(1),最坏的情况为插入头部,时间复杂度为0(n)。所以插入数据的平均复杂度为0(n/2)。C代码实现下载 C++代码实现下载 java代码实现下载 (备用下载地址)功能实现: 假设: const int原创 2017-01-16 20:42:11 · 796 阅读 · 0 评论 -
栈、递归、循环的关系
栈和递归其实原理都是差不多的,栈是先进后出,递归也是先进后出,递归也是利用堆栈来实现的,然后循环可以模拟代替栈和递归,只是用循环太复杂。但是它们的变量存储方式不同,导致占的空间不同。首先说明一下栈和堆的不同(这里的栈是系统自动维护的一种数据结构,内存分配方式和我们自己写的栈数据结构是不一样的。)。栈:就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函原创 2017-01-31 15:22:28 · 11347 阅读 · 0 评论 -
顺序表的动态增长
其实这个实现起来不难,现在来分析一下。首先一开始先分配一块固定大小的内存空间,当这块空间用完之后,然后就需要另一块更大的空间来存放数据。所以思路就是当空间用完之后,再分配一块比原来大的空间来存放数据。C++代码下载 JAVA代码下载步骤如下: 1、创建一块临时存放原始数据的内存块 2、将原始数据复制过去 3、释放存放原始数据的空间 4、重新分配一块新的内存块,其大小为原来的两倍(至少比原创 2017-01-31 18:23:08 · 904 阅读 · 0 评论 -
KMP算法next数组详解
KMP算法的核心就是利用已匹配的信息来指导模式串的匹配。这里的已匹配信息叫做部分匹配表,也叫做next数组。其存储的是字符串的前缀后缀重合部分的字符数。以此来控制模式串的移动位数。next数组生成的步骤: 假设模式串是“ABABABB” 前缀:除最后一个字符外,例如,A、AB、ABA、ABAB、ABABA、ABABAB后缀:除第一个字符外,例如,B、BB、ABB、BABB、ABABB、BABAB原创 2017-02-02 17:48:09 · 1344 阅读 · 0 评论 -
KMP算法详解
KMP算法较之BF算法,提高了匹配的效率,不进行重复的匹配,其最好的时间复杂度为0(m+n),用已知匹配信息指导模式串的匹配。步骤如下: 假设主串是: “ABABBABABABB” 模式串是: “ABABABB” 移动位数的计算公式为:移动位数 = 已匹配字符数 - 部分匹配值(next数组) 1.获取next数组。 next[0]=-1,next[1]=0,next[2]=0,原创 2017-02-02 22:48:40 · 752 阅读 · 0 评论 -
字符串数据结构实现(链表方式)
相较于数组方式的实现,C语言我采用了单链表的方式实现,C++采用了双链表的方式。毫无疑问,双链表的效率肯定是要远高于单链表的。这次支持中文字符的操作,这个实现的思路是,在节点类中添加两个成员变量,一个用来存放char字符,一个用来存放wchar_t字符。关于两者的相互转换及输出请参考 C语言宽字符输出和转换。C代码实现下载 C++代码实现下载 (备用下载地址 )这里讲一下字符串单链表实现的思原创 2017-03-06 13:26:37 · 11820 阅读 · 0 评论 -
广义表C/C++实现详解
所谓的广义表就是单链表的扩展,就是节点可以是一个元素也可以是一个链表。官方的说法是,原子节点和子表节点。广义表用递归的方法来创建是最简单易懂的,也符合广义表的思想。C代码实现下载 C++代码实现下载 (备用下载地址 )1.广义表的各种形态(1)、A = (); 空表 (2)、B = (()); 长度为1,深度为2,原子个数为0,这个实质上就是广义表中有一个元素,它是子表,该子表为空原创 2017-03-12 15:08:53 · 3421 阅读 · 0 评论 -
二叉树递归实现
二叉树递归实现比较符合树的特点,也较容易理解,代码也较为简单。接下来进行图文详解。 C代码下载 C++代码下载 java代码下载 ( 备用地址下载)导航 1.创建二叉树 2.前序遍历二叉树 3.中序遍历二叉树 4.后序遍历二叉树 5.层次遍历二叉树 6.计算二叉树深度 7.计算二叉树双分支节点数 8.计算二叉树单分支节点数 9.计算二叉树叶子节点数原创 2017-03-30 20:51:21 · 974 阅读 · 0 评论 -
二叉树非递归实现
二叉树非递归实现会比较难理解一点,不过只要理解了非递归的,那么递归的就非常好理解了。接下来进行图文详解。 C代码下载 C++代码下载 java代码下载 ( 备用地址下载)导航 1.创建二叉树 2.前序遍历二叉树 3.中序遍历二叉树 4.后序遍历二叉树 5.层次遍历二叉树 6.计算二叉树深度 7.计算二叉树双分支节点数 8.计算二叉树单分支节点数 9.计算原创 2017-03-30 22:52:11 · 4995 阅读 · 1 评论 -
二叉查找树
二叉查找树(英语:Binary Search Tree),也称二叉搜索树、有序二叉树(英语:ordered binary tree),排序二叉树(英语:sorted binary tree),是指一棵空树或者具有下列性质的二叉树: 1.若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 2.若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 3.任意节点的左原创 2017-04-02 20:52:23 · 548 阅读 · 0 评论 -
C-C++面试知识点总结(三)
目录: 一、基础知识 1.C/C++ 2.STL3.数据结构与算法 4.计算机网络5.操作系统6.数据库二、项目经历 1.纯属个人YY3.数据结构与算法基础 (1).基本的线性表的实现顺序表:用数组实现,因为空间连续,所以叫做顺序表。 链表:用不连续的节点连接成一条链,所以叫做链表。(2).双链表的实现双链表:链表中最复杂,但是也是最高效原创 2017-08-14 22:53:20 · 2774 阅读 · 0 评论 -
栈应用之中缀转后缀表达式计算(C++、JAVA)
在栈应用之中缀转后缀表达式(C语言版) 这篇文章中已经讲了如何把中缀表达式转化为后缀表达式,这一篇就讲如何计算后缀表达式,计算比转换容易得多得多了。C++代码实现下载 java代码实现下载 (备用下载地址 )步骤如下: 1.扫描到数字则入栈 2.扫描到运算符则将栈顶的两个元素依次出栈做相应的运算,把结果再入栈 如图: 1、 2、 3、 4、 5、 6、 7、 8、原创 2017-01-29 19:02:49 · 1968 阅读 · 0 评论 -
栈应用之中缀转后缀表达式(C语言版)
数学定义请自行百度,这里仅用大白话讲一下转换规则。完整代码下载中缀转后缀表达式转换规则: 文字说明: 1、如果是数字(包括小数点)则直接存放到数组suffix中(或者输出) 2、如果是左括号,则直接入栈 3、如果是右扩号,则出栈,直到遇到‘(’为止,并把‘(’出栈 4、如果是+-,若栈中无元素或者栈顶有‘(’,则直接入栈,否则全部出栈(遇到’(‘也停止)后再入栈(因为+-运算符原创 2017-01-28 17:22:41 · 2976 阅读 · 0 评论 -
线性表之单链表
基本思想:用一个指针域来存储下一个节点的地址,这样连起来就是一个地址不连续的表了。但是它还是线性的,只是存储方式不一样。优点:动态增长,除开内存空间不够大之外,可以无限存储。较为灵活。头添加方式速度最快,其时间复杂度为0(1)。缺点:代码较为复杂,查询较之数组比较慢。C代码实现下载 C++代码实现下载 java代码实现下载 (备用下载地址)两种存储方式的比较: 1.添加 顺序原创 2017-01-18 22:06:56 · 827 阅读 · 0 评论 -
线性表之循环链表
基本思想:在单链表的基础上,让最后一个节点指向头节点,还可以添加一个尾指针,指向最后一个节点,方便合并两个链表。优点:可以在任意地方遍历到指定的节点。缺点:和单链表的缺点一样。C代码实现下载 C++代码实现下载 java代码实现下载 (备用下载地址)如果不加入尾指针,那循环链表的所有操作都和单链表一样一样的,只要把最后一个节点指向头节点即可。如图:加上尾指针后,难点在于,如何保持尾指针一原创 2017-01-19 18:36:02 · 706 阅读 · 0 评论 -
字符串数据结构实现(数组方式)
在基本的数据类型中,并没有字符串这种类型,所以字符串算是一种数据结构。其实现也很简单,主要用char基本类型来实现。这里用数组实现动态增长,也可以用链表来实现。数组和链表的优缺点比较: 1.数组实现基本的操作较为容易。 2.数组的查找速度比较快。 3.数组存储中文字符比较难实现(所以这里未实现对中文的支持) 4.链表的空间利用率比较高 (不像数组一样,一到瓶颈就翻倍增长,并伴随着复制数原创 2017-02-28 17:10:37 · 960 阅读 · 0 评论 -
线性表之双向链表
基本思想:在单链表的基础上加一个前驱指针域,存放前一个节点的地址。所以现在节点结构一共有三个字段,数据域,两个指针域(前驱和后继)。优点:拥有单链表的所有优点(动态增长),也拥有循环链表的优点(能够在任何位置访问到所有节点),增加尾指针后,头添加和尾添加的时间复杂度都变为0(1),逆转表不再需要牺牲空间换时间,时间复杂度只有0(n/2),打印表的时候,可以正着打印,还可以逆着打印。缺点:就是代码上的原创 2017-01-21 22:01:39 · 899 阅读 · 0 评论 -
线性表之顺序栈
基本思想:顺序栈相当于顺序表的子集,就是限制了相关操作,只允许在栈顶操作元素,基本的操作有入栈、出栈、获取栈顶元素等。除了不能动态增长外(目前为止),其余的操作时间复杂度都一样。C代码实现下载 C++代码实现下载 java代码实现下载 (备用下载地址)实现功能: 1.void InitStack(); 初始化栈 1).new一块连续的空间存放数据。 2).初始化栈顶指针原创 2017-01-22 14:52:29 · 586 阅读 · 0 评论 -
线性表之链栈
基本思想:在单链表的基础上,限制某些操作,使之成为一种新的数据结构。只准在栈顶(单链表的第一个元素)进行操作。优点:内存是动态分配的。缺点:也是代码相对来说较为复杂。(比单链表简单很多)C代码实现下载 C++代码实现下载 java代码实现下载 (备用下载地址)我看有些书,都是定义两个结构体,我觉得这样反而让人头晕,转不过来,本来栈结构和队列结构就是数据结构中最简单的,没必要搞那么复杂。所原创 2017-01-22 19:17:31 · 631 阅读 · 0 评论 -
线性表之顺序队列
基本思想:利用数组,来模拟队列,先进先出。入队要从队尾进去,也就是数组的最后一个元素(rear所指向的才是最后一个元素)的后面。出队要从队头出去,也就是数组的第一个元素(不一定是a[0],而是front所指向的位置)。优点:顺序队列的优点就一个,那就是代码太简单,其它的没有。缺点:用数组来模拟队列,那缺点就比较严重,第一,不适合动态增长。第二,空间利用率太低(因为出队的时候队头不断的向后移,队尾也向原创 2017-01-24 17:38:41 · 988 阅读 · 0 评论 -
线性表之链队列
基本思想:限制单链表的操作,使之只能在头删除和尾添加,这样就变成了队列。优点:能动态增长,空间利用率高。时间复杂度上,顺序队列和链队列是一样的。缺点:代码较为复杂。实现功能和顺序队列是一样的,然后主要是入队和出队,入队的话就是单链表的尾添加,出队的话就是头删除。这个单链表都有说过。这里的front节点相当于单链表的head节点,rear节点相当于单链表的tail节点,所以这都是换汤不换药的,对比来学原创 2017-01-24 23:15:44 · 419 阅读 · 0 评论 -
线性表之循环队列
基本思想:在顺序队列的基础上,让头尾循环,把剩余空间利用完。优点:克服了顺序队列的空间浪费问题,其优点在顺序队列和链队列之间。缺点:静态的。实现功能和顺序队列一样,只是让front和rear循环,不管哪个到了数组末尾,都会循环至a[0]处,继续利用前面剩余的空间,直到利用完为止。如图: C代码实现下载 C++代码实现下载 java代码实现下载 (备用下载地址 )C代码实现下载 C+原创 2017-01-25 00:45:23 · 746 阅读 · 0 评论 -
约瑟夫问题详解+源码
摘自百度百科:据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k原创 2017-01-26 20:55:54 · 1204 阅读 · 0 评论 -
插入、快排、堆排、归并、计数和桶排序详解以及测试
代码 核心思想 测试结果 总结 一、代码 package com.example.sort;import java.util.ArrayList;import java.util.Comparator;import java.util.Random;public class Sort { public static void main(String[] ...原创 2019-05-31 15:21:54 · 2339 阅读 · 0 评论