数据结构与算法
文章平均质量分 85
@我好菜啊
我要考研!!!
展开
-
一看就懂的贪心算法
如何理解贪心算法我们先看一个例子假设有一个可以容纳100kg物品的背包,背包可以装各种物品,我们有以下五种豆子,每种豆子的重量和总价值各不相同。为了让背包中所装物品的总价值最大,我们如何选择在背包中装哪些豆子?每种豆子又应该装多少?我们可以这样想,我们只需要计算出每种豆子的单价,按照价格由高到低依次来装豆子,先按单价最高的豆子装,装不满的话,再装价格相对较低的豆子,直到装满为止。这个问题的解决思路就是用了贪心算法的思想,我们先来看以下贪心算法解决问题的步骤:第一步:套用贪心算法的问题原创 2021-10-23 15:26:47 · 32282 阅读 · 19 评论 -
比较器,堆结构,堆排序
比较器:1)比较器的实质就是重载比较运算符2)比较器可以很好的应用在特殊标准的排序上3)比较器可以很好的应用在根据特殊标准排序的结构上4)写代码变得异常容易,还用于泛型编程比较器的统一约定@Overridepublic int compare(T o1,T o2){ //返回负数的时候,就是o1比o2优先的情况 //返回正数的时候,就是o2比o1优先的情况 //返回0的情况,就是o1和o2同样优先的情况}public static class Stud原创 2022-02-05 16:25:09 · 472 阅读 · 0 评论 -
荷兰国旗问题和快速排序
荷兰国旗问题有两种情况: 1)给定一个数x,<= x的整体放在左边,>x的整体放在右边 2)给定一个数x,< x的整体放在左边,= x的整体放在中间,> x的整体放在右边 规定不需要辅助数组,时间复杂度O(N)完成上面的调整 现在先来看第一个情况:如图所示,我们先划分一个<=区域在左侧,第一个元素的下标位置是i,给定的数为x。现在我们需要对这个数组进行划分1.当i在3这个位置的时候,i位置和&l.原创 2022-01-26 12:13:43 · 758 阅读 · 0 评论 -
归并排序和一些例题
归并排序的原理并不是很复杂,他的意思是说,将一个数组从中间分解成左右两个部分,然后对左右两部分分别排序,将排序后的结果再进行合并。我们先来讨论经典的递归实现方法。归并排序的递归实现可以总结为:左边排好序+右边排好序+merge让总体有序这个问题最大的困难就是如何进行合并merge,我们通过画递归树可以知道,最后一定是一个元素和一个元素进行的merge,那么这个merge的过程还需要涉及到对这两个元素进行比较,那么如何去实现呢?这里我们采用双指针法和辅助数组的方式,首先创建一个辅助数组,左右两原创 2022-01-24 12:23:34 · 1675 阅读 · 0 评论 -
链表结构,栈,队列,递归行为,哈希表和有序表
链表的结构与数组有着很大的不同,他不像数组一样,需要一块连续的地址空间,他可以通过指针将零散的空间连接起来,更加有效的提高了空间的利用率。单链表:线性表的链式存储就叫做单链表,下面来看看如何进行定义:public class LinkedList{ public class Node{ public int data;//数据域 public Node next;//存储下一个节点的地址 } private Node head =原创 2022-01-23 11:36:05 · 410 阅读 · 0 评论 -
异或运算和几个经典题目解析
认识异或运算异或运算就记成无进位相加0 1 11 0 11 1 0异或运算满足交换律和结合律同样一批数,不管选择什么样的顺序做异或运算,最后结果一定是一个如何不使用额外的变量交换两个数1)a = a ^ b2) b = a ^ b3) a = a ^ b比如说a = 甲,b = 乙1)a = 甲 ^ 乙,b = 乙2)b = 甲^乙^乙,a = 甲 ^ 乙3)a = 甲^乙^甲,b = 甲public static void swap(int[]原创 2022-01-21 10:44:18 · 1701 阅读 · 0 评论 -
认识复杂度,对数器,二分法
常见的常数时间操作常见的常数时间操作通常包括三种情况,第一固定的时间操作,第二寻址操作,第三就是非固定的时间操作。关于固定的时间操作我们可以这么理解int a = 1;int b = 2;上面这两行代码虽然是两行,但是他的时间复杂度确是O(1),假设我们把每一行执行的代码时间记作unit_time,那么执行这两行所需要的代码就是2unit_time,根据大O阶的表示方法既O(2)就可以表示位O(1).关于寻址操作我们大家都第一时间想到的可能就是数组的,数组支持随机访问,并且在O(1)的原创 2022-01-20 16:48:47 · 490 阅读 · 0 评论 -
一看就懂的红黑树之红黑树的实现
一文了解红黑树的实现原创 2021-11-17 17:09:38 · 120 阅读 · 0 评论 -
一看就懂的动态规划(上)
动态规划比较适合用来求解最值得问题,如求最大值和最小值等。它可以显著得降低时间复杂度,提高代码得执行效率。不过学习难度比较高,这一篇博客不讨论动态规划得理论知识,先主要看两个例子,一步一步走进动态规划。利用动态规划解决0-1背包问题‘对于背包问题,我们前面一篇博客讨论过用回溯算法解决不可分割得背包问题。对于0-1背包问题,我们先重新回顾一下:对于一组不同重量,不可分割得物品,选择其中一些物品装入背包,在不超过背包可承载得最大重量得前提下,背包中可装载物品总重量得最大值是多少?对于这个问题,回溯算原创 2021-10-29 15:56:29 · 179 阅读 · 0 评论 -
一看就懂的回溯算法
如何理解回溯算法我们每个人的一生,都会遇到很多岔路口,在人生的岔路口中,我们如何选择,将会对我们今后的人生产生很大的影响。如果选对了,可能我们的生活将会达到一个新的高度,我也是农村出来的孩子,大学不能说玩了两年,不过也差不多,现在我面对的就是一个岔路口,我打算去考研。有的人也可能会选择错误的路口,今后可能会碌碌无为。如果我们的人生可以量化,那么我们怎么去选择一个正确的岔路口呢?之前我们聊过贪心算法,在每次面对人生的岔路口的时候,我们都选择最优的那一个路口,期望这一个局部最优解选择可以使得我们人生的.原创 2021-10-27 19:44:48 · 447 阅读 · 0 评论 -
一看就懂的分治算法
如何理解分治算法分治算法(divide and conquer)的核心思想就是四个字:分而治之,什么意思呢?就是将原问题划分成n个规模更小并且结构与原问题相似的子问题,递归的解决这些子问题,然后合并其结果,就得到原问题的解。这么说起来分治算法看起来有点像递归,其实,分治算法是一种处理问题的思想,而递归却是一种编程技巧。实际上,分治算法一般适合用递归来实现。在分治算法的递归实现中,每一层递归一般都有下面几个操作,大家着重记一下。分解:将原问题分解成一系列子问题解决:递归的求解各个子问题,若子问原创 2021-10-25 21:35:52 · 458 阅读 · 0 评论 -
三步分析法之复杂度分析,让你对复杂度不在迷茫!
复杂度是什么?我们大家都知道,学习数据结构和算法是相让给代码运行的更快而且运行时占用更少的内存,但是我们需要怎么去衡量这个快和慢呢?这里我们先说一下执行效率的这个定义,执行效率是用来衡量一个算法好坏的一个指标,而复杂度就是用来衡量一个算法的执行效率,所以现在应该对复杂度有了一个简单的理解了吧。光知道这些其实还是不够的,我们还得知道复杂度都有哪些,其实复杂度分为两类,一类是事件复杂度,一类是空间复杂度。那么什么是时间复杂度呢?其实时间复杂度并不表示代码真正的执行时间,时间复杂度又叫做渐进时间复原创 2021-10-19 17:14:32 · 523 阅读 · 0 评论 -
一看就懂的深度优先搜索和广度优先搜索
什么是搜索算法算法是作用于具有数据结构之上的,大部分搜索算法是基于“图”这种数据结构。这是因为图的表达能力很强,大部分涉及搜索的场景可以抽象为“图”。所谓"搜索",最直接的理解就是,从图中寻找一个顶点出发到另一个顶点的路径。针对不同的需求和场景,对应有不同的算法。图有两种主要存储方式:邻接表和邻接矩阵。这次我们用邻接表来存储图,用无向图来举例说明。public class Graph{ //无向图 private int v; //顶点个数 private Linke原创 2021-10-12 21:46:18 · 1075 阅读 · 0 评论 -
一看就懂的数据结构:图
图是一种比较复杂的数据结构,设计图的算法有很多,如图的搜索,最短路径,最小生成树等,这篇博客主要和大家讨论图的定义和如何去表示,相信看完本篇之后,也会对图有一个基本的了解。图的定义之前我们讨论过树,树是一种非线性表,今天所讨论的图也是一种非线性表。不过和树相比,图更加的复杂。树中的元素称为节点,对应的,图中的元素称为顶点(vertex)。图中的一个定点可以与任意其他顶点建立连接关系,我们把这种关系称为边(edge)。其实在我们生活中,就有很多符合图这种结构的例子。例如,我们的社交网络就是一个原创 2021-10-12 15:49:37 · 389 阅读 · 0 评论 -
一看就懂的字符串匹配算法 之 KMP算法
在所有的字符串匹配算法中,KMP算法是最为知名的,现在我们就来讨论一下KMP算法。KMP算法的基本原理KMP算法的核心思想与之前我们讨论过的BM算法的思想相类似。在模式串与主串匹配的过程中,当遇到不可匹配的字符时,我们希望找到一些规律,将模式串向后多滑动几位,跳过那些肯定不会匹配的元素。先来回顾一下BM算法的思想,在BM算法中,模式串与主串匹配的时候,是按照模式串中字符下标从大到小的顺序进行比对的,也就是倒着匹配。然而KMP算法正好相反,是按照模式串字符下标从小到大的顺序比对的。之前我们还讨论过原创 2021-10-11 16:09:04 · 480 阅读 · 0 评论 -
一看就懂的字符串匹配算法 之 BM算法
先来一个导读,关于BM算法开始有了难度,大家一定要静下心,咬着呀也得给我读下去,这样你才能有收获。我们在文本编辑器中,我们经常用到查找及替换功能。比如说,在Word文件中,通过查找及替换功能,可以把某一个单词统一替换成另一个单词。对于文本编辑器这种软件来说,查找及替换是其核心功能,我们希望使用的字符串匹配算法尽可能地高效。之前讨论过RK算法,时间复杂度为O(n),其实已经很高效了,现在来介绍一个新的字符串匹配算法,BM(Boyer-Moore)算法。BM算法的核心思想BM算法是一个非常高效的字符原创 2021-10-10 16:58:44 · 5162 阅读 · 4 评论 -
一看就懂的字符串匹配算法 之 RK算法
RK算法是对BF算法的进一步优化,很巧妙的使用了哈希算法,让匹配的效率有了很大的提升。BF算法 这是关于BF暴力匹配算法的博客,大家可以先去看看。RK算法的原理和实现之前在讨论BF算法的时候,我们说过关于模式串长度m,和主串长度n,那么在主串中就会有n-m+1个长度为m的子串,我们只需要暴力的一一对比n-m+1个子串与模式串,就可以找出主串中与模式串匹配的子串。但是这样就会出现一个问题,在每次检查子串和模式串是否匹配的时候,需要依次对比每个字符,比较耗时,所以我们现在就需要稍微进行改造,增.原创 2021-10-09 17:12:03 · 1772 阅读 · 0 评论 -
一看就懂的字符串匹配算法 之 BF算法(暴力匹配)
字符串匹配算法有很多,我们先来介绍简单的BF算法,后面还有PK算法,BM算法,KMP算法等,我会一篇一篇和大家一块讨论。BF算法的原理与实现我们先来了解两个概念:主串和模式串,简单的说,如果在字符串a中查找字符串b,那么字符串a就是主串,字符串b就是模式串。我们把主串的长度记作n,模式串的长度记作m。在一般情况下,n大于或等于m,虽然这不是必须的,但如果n小于m,那么主串中肯定不存在模式串。BF(Brute Force,暴力匹配)算法也称暴力匹配算法,从名字可以看出,这种匹配方式很“暴力”,简单原创 2021-10-08 20:47:42 · 4470 阅读 · 1 评论 -
一看就懂的高级数据结构:跳表
之前我们讨论过二叉查找算法,数据是存储在数组中的,因为二分查找算法底层依赖数组按照下标快速访问元素的特性。现在我们想想,如果数据存储在链表中,就无法用二分查找算法了吗?实际上,我们只需要对链表稍微改造,就可以支持类似“二分”的查找算法。我们把改造之后的数据结构称为跳表(skip list)。跳表是基于有序链表,添加多级索引构建而成,支持快速的查找,插入,删除数据操作。除此之外,跳表还支持快速的查找某个区间的数据。在实际的项目开发中,Redis中的有序集合(sorted set)就是用跳表实现的。原创 2021-10-07 18:22:05 · 1395 阅读 · 0 评论 -
一看就懂的堆排序
上一篇博客介绍了堆的基本定义,大家可以看看,然后继续学习本篇。堆的定义这篇博客主要讲堆的一个重要应用:堆排序。堆排序是一种原地的、时间复杂度为O(nlogn)的排序算法,我们之前讨论过快速排序,他的时间复杂度也是O(nlogn),那么他和堆排序相比,稳定性不比他好,但是为什么实际开发中用快速排序的地方更多呢?大家带着这个问题来读读本篇博客吧?关于快速排序的链接我给大家放在这,可以去看看:快速排序堆排序之建堆借助于堆这种数据结构实现的排序算法,称为堆排序。堆排序的整个过程可以大致分解成两个原创 2021-10-06 16:13:25 · 772 阅读 · 2 评论 -
一看就懂的特殊二叉树:堆
堆的定义先来看一下堆的定义,一般满足下面两个要求的二叉树就是堆1.堆必须是完全二叉树2.堆中每个节点的值都大于或等于(或者小于或等于)其左右节点的值。如果堆中每个节点的值都大于或等于子树每个节点的值,我们称这种堆为大顶堆,如果堆中每个节点的值都小于或等于子树中每个节点的值,我们称这种堆为小顶堆。再带大家回顾一下完全二叉树的定义:要求除最后一层,其他节点都要求是满的,而且最后一层的节点需要靠左排列。图中,第1,2张图为大顶堆,第3张图为小顶堆,第四张图不是堆堆的存储之前说过,完原创 2021-10-05 19:02:54 · 286 阅读 · 0 评论 -
一看就懂的B+树
相信大家都学过MySQL数据库,在开发中,为了加快数据库中数据的查找速度,一般会对表中的数据创建索引。MySQL数据库的索引就是用B+树来进行实现的。实现一个需求:按值查找和按区间查找如何通过索引来加快数据库表的查询速度呢?#根据某个具体值来查找数据:select * from user where id = 1234;#根据某个区间值来查询数据:select * from user where id > 1234 and id < 2345;除了功能性需求外,在执行效率方面原创 2021-10-04 21:36:10 · 331 阅读 · 0 评论 -
一看就懂的二叉查找树和平衡二叉查找树
二叉查找树是一种特殊的二叉树,它可以组织动态数据集合,可以支持数据的快速插入,删除和查找操作。之前我们讨论过哈希表,他的,查找,插如和删除的时间复杂度是O(1),既然哈希表这么高效,那么为什么还需要二叉查找树呢?二叉查找树的定义和操作二叉查找树是二叉树中一种常用的一种类型。二叉查找树是为了实现快速查找产生的。不过,它不仅支持快速查找,还支持快速插入和删除。这主要归功于二叉查找树的一个特性,那就是树中任一节点,这个节点的左子树的值总是小于这个节点的值,这个节点右子树的值总是大于这个节点的值,.原创 2021-10-04 14:34:50 · 1692 阅读 · 1 评论 -
一看就懂的树和二叉树
终于学到树了,也是不容易,打算 把数据结构和算法学一遍然后就开始刷leetcode了,加油!树的定义什么是树,在先介绍树之前,我们先看几张图我从图中可以发现,树这种数据结构,如果把他倒过来,很像生活中的树,最顶上的元素好像就是树根,下面的是一个一个的分枝。所以我们把树上每个元素称为节点,最上面的元素称为根节点。节点与节点之间有一定的父子关系,上下节点为父子节点,左右节点称为兄弟节点。下面再来看一张图在图中,节点A是节点B的父节点,节点B是节点A的子结点。因为B,C,D这三个节点的父.原创 2021-10-03 15:19:57 · 205 阅读 · 0 评论 -
一看就懂的哈希表(下)
之前在写链表那一篇文章的时候写过基于链表来实现LRU缓存淘汰算法,这是链接https://mp.csdn.net/mp_blog/creation/editor/120435048下面来看一看LinkedHashMap中的哈希表和链表是如何组合实现LRU缓存淘汰算法的。LRU缓存淘汰算法先来回顾一下基于链表实现的我们维护一个有序的链表,越靠近链表尾部的结点存储越早访问的数据(头结点存储最新访问的数据,尾结点存储最早访问的数据),并且记录头指针和尾指针,分别指向链表的头结点和尾结点。因为缓原创 2021-10-02 21:36:25 · 169 阅读 · 0 评论 -
一看就懂的哈希表(中)
哈希表的查询效率并不能笼统地认为是时间复杂度O(1),因为他与哈希函数,装载因子和哈希冲突等都有关系。如果哈希函数设计地不好,或者装载因子过高,都有可能导致哈希冲突发生地概率shengg2,查询效率下降。在有的情况下,如果数据经过哈希函数之后,全部哈希到一个槽中,如果我们使用的是基于链表的冲突解决办法,那么哈希表就会退化为链表,查询的时间复杂度从O(1)退化到O(n)。设计哈希函数哈希函数设计的好坏,决定了哈希表冲突概率的大小,也直接决定了哈希表的性能。要想设计一个好的哈希函数,首先,哈希函数的原创 2021-10-02 19:42:24 · 364 阅读 · 0 评论 -
一看就懂的哈希表(上)
关于哈希表这个数据结构的内容有很多,所以我打算用三个博客进行描述,这一篇主要介绍什么是哈希思想,我们想彻底明白哈希表肯定要先知道他的思想是吧。之后是对哈希函数的描写和如何处理哈希冲突。哈希思想哈希表(hash table)是数组的一种扩展,是经过数组演化过来的,底层依赖数组支持按照下标来进行访问元素的特性。下面举一个简单的例子,先来了解一下简单的哈希思想是什么。假设有89个学生参加运动会,每名学生依次编号1到89,现在如何通过编号能够快速获得选手的信息呢?我们可以把这89名选手依次加入到数组原创 2021-10-02 16:07:51 · 1139 阅读 · 0 评论 -
一看就懂的二分查找
无处不在的二分思想二分查找是一个简单而且容易理解的算法。在实际生活中也有很多的时候能够用到。比如说简单的猜字游戏,在一组卡片中,有0到99个数字,你可以写出一个你想要的数字,之后在里面抽取,抽取的结果由主持人进行告知,大的时候可以往左边抽取,小的时候往右边抽取。假设选的数字是23,也仅仅只需要七次就可以抽取到。但是如果要是一个一个遍历的话,速度上就会慢很多,所以这种思想就叫做二分查找。看一张图现在来看一个例子,假设我们有10个订单,订单金额分别是:8,11,19,23,27,33,55,67原创 2021-10-01 16:52:18 · 557 阅读 · 0 评论 -
排序算法3(桶排序,计数排序,基数排序)
前面关于一篇冒泡,选择,和插入排序的文章小爆了一下,真是让我受宠若惊,这是文章链接,大家感兴趣可以一起看一下,最后,博主现在也是一名大学生,让我们一起努力!https://blog.csdn.net/weixin_46272350/article/details/120501644?spm=1001.2014.3001.5502之前我们学习的几种排序算法中,第一篇时时间复杂度为O(n^2)的冒泡排序,选择排序和插入排序,还有时间复杂度O(nlogn)的快速排序和归并排序,其中这两个排序的主要思想还是..原创 2021-09-30 15:27:31 · 224 阅读 · 0 评论 -
排序算法2(归并排序,快速排序)
归并排序的原理和实现对于归并排序,重点是要理解分治算法和递归处理的思想。如果要排序一个数组,那么我们首先要把数组从中间分成两段,然后对这两段分别进行排序,最后将排序好的两部分进行性别,这样整个数组就是一个有序的了。首先看一个图进行理解。归并排序使用的是分治算法的思想。分治,就是分而治之,将一个大问题分解成一个小问题来进行解决。分治算法的思想与之前提到的递归很是相似,分治算法就是通过递归来进行实现的,分治是一种解决问题的思想,递归是一种编程技巧。下面来看看代码class Test{..原创 2021-09-28 18:16:44 · 353 阅读 · 0 评论 -
排序算法1(冒泡,选择,插入)
排序算法的执行效率1.最好时间复杂度,最坏时间复杂度,平均时间复杂度在分析排序算法的时间复杂度时,需要给出最好、最坏、平均情况下的时间复杂度,以及这些复杂度对应的待排序数据的特点。对于排序算法,原始数据的有序度对排序的执行时间有较大的影响。在极端情况下,对接近有序或完全无序的原始数据进行排序,排序需要的时间会有较大的差别。2.时间复杂度的系数,常数和低阶时间复杂度反应的时算哒的执行时间随数据规模n的增长趋势。在用大O表示法表示复杂度的时候,我们常常会忽略系数,常数和低阶.但是在实际的开发中,原创 2021-09-27 20:07:56 · 1167 阅读 · 4 评论 -
队列的再一次深入
队列的定义队列这个概念很好理解,我们可以把队列想象成买票,先来的人先得到票,后来的人后得到票,不允许插队,队列的特点是先入先出。因此这样看来,队列也是一个受限制的线性表。...原创 2021-09-25 18:07:11 · 122 阅读 · 0 评论 -
栈的再一次深入
栈的定义可以把栈比作成一摞盘子,我们只能将盘子放在最上面,而且拿的时候,也是拿最上面的盘子。这就是典型的栈结构。从栈的操作特性来说,栈是一个受限制的线性表。只允许在一段插入、删除数据。但从功能上讲,数组和链表确实可以完全替代栈,但是,特定的数据结构是对特定场景的抽象。数组或链表暴露了太多的操作接口,操作起来确实灵活,自由,但是使用起来也更加不可控。当某个数据集合只涉及在一端插入和删除数据,并且满足先进后出的特性时,我们可以首选栈。顺序栈和链式栈从栈的定义上看,栈主要包含两个操作,入栈和出原创 2021-09-25 16:01:51 · 201 阅读 · 0 评论 -
链表的再次深入
链表的底层存储结构相对比于数组,链表更加复杂,在底层存储结构上,链表的特定与数组也截然不同。数组需要一块连续的内存空间进行存储,对内存的要求比较高,假如我们需要创建一个数组需要申请100MB的内存空间,但是内存中没有连续的存储空间时,即使剩余的内存空间大于100MB,也会申请失败。而链表却与之相反,它并不需要一块连续的内存空间,链表通过“指针”,将一块块零散的内存块(一般在链表中称之为节点)串联起来,这样就有效避免了因没有连续的内存而导致创建失败的问题。但是两种不同的数据结构决定了两者有着不原创 2021-09-24 10:32:13 · 329 阅读 · 0 评论 -
数组的应用与理解
在说数组之前,我们先说说线性表。先来看看线性表的定义:线性表是具有相同数据类型的n(n>=0)个数据元素的有限序列,其中n为表长,当n=0是,线性表为空。线性表除最第一个元素外,每个元素有且仅有一个直接前驱,除最后一个元素外,每个元素有且仅有一个直接后继。线性表:#表中元素的个数有限#表中元素具有逻辑上的顺序性,表中元素有其先后顺序#表中元素都是数据元素,每个元素都是单个元素#表中元素的数据类型都相同,意味着每个元素占有相同大小的存储空间#线性表是数据结构中的逻辑结构,可以原创 2021-09-23 09:55:40 · 291 阅读 · 0 评论 -
复杂度分析
复杂度分析的意义我们平时把写的代码运行一遍,然后通过监控和统计等手段,可以计算出算法执行的时间和占用的内存大小。对于这种方法,我们称之为事后统计法。这种方法有着很大的局限性。一方面他的测试结果受测试环境的影响,另一方面测试结果受测试数据的影响也很大。大O复杂度表示法下面来看一个例子,int cal(int n){ int sum = 0; int i = 1; for(;i < n;i++){ sum = sum + i; } return原创 2021-09-22 17:03:07 · 361 阅读 · 0 评论 -
数据结构——栈和队列
栈栈的定义栈作为一种限定性线性表,是将线性表的插入和删除操作限制为仅在表的一端进行,通常将表中允许进行插入,删除操作的一端称为栈顶(Top),因此栈顶的当前位置是动态变化的,它由一个栈顶指针的位置指示器来指示。同时,表的另一端称为栈底(Bottom)。当栈中没有元素时称为空栈。栈又被称为先入后出地线性表,简称LIFO 表。栈的表示和实现栈在计算机中主要有两种基本的存储结构:顺序存储结构(顺序栈)和链式存储结构(链栈)。顺序栈顺序栈是用顺序存储结构实现的栈,即用一组地址连续的存储单元依原创 2021-08-16 14:36:02 · 262 阅读 · 0 评论 -
数据结构——线性表的链式存储
通常采用链式存储结构的线性表称为线性链表。从链式方式的角度看,链表可以分为单链表,循环链表和双链表。1.单链表 链表是用一组任意存储单元来存放线性表的结点,这组存储单元可以是连续的,也可以是非连续的,甚至是零散分布在内存的任何位置上。因此,链表中结点的逻辑顺序和物理顺序不一定相同。 结点包括两个域:数据域用来存储结点的值,指针域用来存储数据元素的直接后继的地址。线性链表正是通过每个结点的指针域将线性表的n个结点按其逻辑顺序连接在一起。又因为线性链表的每个结点只有一个next指针域,所以这...原创 2021-08-11 22:56:11 · 5055 阅读 · 0 评论 -
数据结构——线性表的顺序存储
1.线性表的概念线性表的逻辑结构线性表(Linear List):线性表是n个类型相同数据元素的有限序列,对n > 0,除第一个元素无直接前驱、最后一个元素无直接后继外,其余的每个数据元素只有一个直接前驱和一个直接后继,数据元素之间具有一对一的关系。线性表中元素的个数n被定义为线性表的长度,n = 0时称为空表。线性表的特点:#同一性:线性表由同类数据元素组成,每一个元素必须属于同意数据类型#有穷性:线性表由有限个数据元素组成,表长度就是表中数据元素的个数#有序性:线性表相邻数原创 2021-08-10 16:46:44 · 692 阅读 · 0 评论 -
数据结构——绪论
1.数据结构的基础概念1.1数据(Data)数据是描述客观事物的数值、字符以及能输入机器且能被处理的各种符号集合。也就是说,数据是对客观事物采用计算机能够识别、存储和处理的形式所进行描述。简而言之,数据就是计算机化的信息。目前,数据已经由纯碎的数值概念发展为图像、字符、声音等各种符号。1.2数据元素(Data Element)数据元素是组成数据的基本单位,是数据集合的个体,在计算机中通常作为一个整体进行考虑和处理。一个数据元素可以由一个或者多个数据项组成,数据项(Data Item)是.原创 2021-08-09 17:10:53 · 816 阅读 · 0 评论