VC++2012编程演练数据结构
文章平均质量分 90
主要基于Visual Studio2012 实践中演练数据机构,算法。在实践中学习数据机构,实践中学习算法。
尹成
尹成微信18510341407,助理微信18514203048
展开
-
VC++2012编程演练数据结构《1》循环双端队列
循环队列中,由于入队时尾指针向前追赶头指针;出队时头指针向前追赶尾指针,造成队空和队满时头尾指针均相等。因此,无法通过条件front==rear来判别队列是"空"还是"满"。队列的操作特点是“先进先出”。前者主要是头指针、尾指针的使用,后者主要是理解循环队列提出的原因及其特点。两者都要掌握队列空与满的判定条件以及出队列、入队列操作的实现。为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想原创 2012-11-19 15:57:17 · 5988 阅读 · 1 评论 -
VC++2012编程演练数据结构《2》单循环链表与约瑟夫问题
循环链表(Circular Linked List)是一种首尾相接的链表,它与单链表的唯一区别在于对尾结点的处理;因为在单链表中尾结点的指针域NULL改为指向头结点就得到了单循环链表。单循环链表可以用头指针head或尾指针rear表示,用尾指针rear表示的单循环链表查找开始结点a1和尾结点an就很方便;查找时间都是O(1)。启动IDE我们基于VC++2012创建一个2的工程。我们来实现一个单循环原创 2012-11-19 16:42:19 · 3692 阅读 · 2 评论 -
VC++2012编程演练数据结构《3》堆栈实现进制转换
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。 栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底原创 2012-11-19 17:07:25 · 2723 阅读 · 0 评论 -
VC++2012编程演练数据结构《4》队列实现检验回文数
队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。 在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将是最后被删除的元素,因此队列又称为“先进先出”(FIFO—first in first out)的线性表。 队列空的条件:fr原创 2012-11-19 17:45:18 · 2611 阅读 · 0 评论 -
VC++2012编程演练数据结构《5》堆栈实现解析任意计算表达式
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。 栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底原创 2012-11-19 18:10:05 · 2605 阅读 · 2 评论 -
VC++2012编程演练数据结构《6》优先级队列演练
如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了。这样,我们就引入了优先级队列 这种数据结构。 优先级队列(priority queue) 是0个或多个元素的集合,每个元素都有一个优先权,对优先级队列执行的操作有(1)查找(2)插入一个新元素 (3)删除 一般情况下,查找操作用来搜索优先权最大原创 2012-11-19 18:26:07 · 2495 阅读 · 0 评论 -
VC++2012编程演练数据结构《5》堆栈实现递归运算
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。 栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底原创 2012-11-19 18:40:57 · 2330 阅读 · 0 评论 -
VC++2012编程演练数据结构《8》回溯法解决迷宫问题
回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。可用回溯法求解的问题P,通常要能表达为:对于已知的由n元组(x1,x2,…,xn)组成的一个状态空间E={(x1,x2,…,xn)∣xi∈Si ,i=1,2,…,n},给定关于原创 2012-11-19 19:05:53 · 3143 阅读 · 1 评论 -
VC++2012编程演练数据结构《9》平衡二叉搜索树
平衡二叉搜索树 任何结点的左子树和右子树高度最多相差1的二叉搜索树。 (1)AVL树的插入算法 a. 插入结点之后仍然是AVL树,则不调整; b. 插入结点之后不再满足AVL树条件,则进行调整,根据导致不平衡的原因,分为: a) LL型――单旋转调整 b) LR型――双旋转调整 c) RL型――双旋转调整 d) RR型――单旋转调整 下图是顺序插入单词{cup,cop,copy,原创 2012-11-19 19:49:46 · 2258 阅读 · 2 评论 -
VC++2012编程演练数据结构《11》哈希表
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。* 若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f为散列函数(Hash function),按这个原创 2012-11-19 20:07:43 · 2435 阅读 · 0 评论 -
VC++2012编程演练数据结构《12》二叉排序树
二叉排序树(Binary Sort Tree)又称二叉查找树。 它或者是一棵空树;或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉排序树; 每个结点的C(i)为该结点的层次数。最坏情况下,当先后插入的关键字有序时,构成的二叉排序树蜕变为单支树,树的深度为原创 2012-11-19 20:20:28 · 2333 阅读 · 0 评论 -
VC++2012编程演练数据结构《13》单链表
单链表简介 用一组地址任意的存储单元存放线性表中的数据元素。 以元素(数据元素的映象) + 指针(指示后继元素存储位置) = 结点 (表示数据元素 或 数据元素的映象) 以“结点的序列”表示线性表 ?? 称作线性链表(单链表) 单链表是一种链式存取的结构,为找第 i 个数据元素,必须先找到第 i-1 个数据元素。 因此,查找第 i 个数据元素的基本操作为:移动指针,比较 j原创 2012-11-20 11:02:53 · 2826 阅读 · 0 评论 -
VC++2012编程演练数据结构《14》链式堆栈
链式存储结构特点: 在计算机中用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的). 它不要求逻辑上相邻的元素在物理位置上也相邻.因此它没有顺序存储结构所具有的弱点,但也同时失去了顺序表可随机存取的优点.链式存储结构链式存储结构特点: 1、比顺序存储结构的存储密度小 (每个节点都由数据域和指针域组成,所以相同空间内假设全存满的话顺序比链式存储更多)。 2、原创 2012-11-20 11:28:51 · 2187 阅读 · 0 评论 -
VC++2012编程演练数据结构《15》双循环链表
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。打开IDE 我们来创建一个工程实践之类的声名如下#if !defined(AFX_DCIRLINKL_H__4D93E797_B8BC_4781_BD9A_0EF8A6458A75__INCLUDE原创 2012-11-20 12:04:44 · 2593 阅读 · 0 评论 -
VC++2012编程演练数据结构《16》广义表
广义表是一种非线性的数据结构,顾名思义,它也是线性表的一种推广。它被广泛的应用于人工智能等领域的表处理语言LISP语言中。在LISP语言中,广义表是一种最基本的数据结构,就连LISP 语言的程序也表示为一系列的广义表。线性表被定义为一个有限的序列(a1,a2,a3,…,an)其中ai被限定为是单个数据元素。广义表也是n个数据元素d1,d2,d3,…,dn的有限序列,但不同的是,广义表中的di 则既原创 2012-11-20 12:32:41 · 2800 阅读 · 0 评论 -
VC++2012编程演练数据结构《17》稀疏矩阵
如果在矩阵中,多数的元素为0,称此矩阵为稀疏矩阵(sparse matrix)。由于矩阵在程序中常使用二维阵列表示,二维阵列的大小 稀疏矩阵与使用的存储器空间成正比,如果多数的元素没有数据,则会造成存储器空间的浪费,为此,必须设计稀疏矩阵的阵列储存方式,利用较少的存储器空间储存完整的矩阵数据。 二维数组Amn中有N个非零元素,若N 由于稀疏矩阵中含有很多的0元素,在计算机中存储会浪费很多的空原创 2012-11-20 13:38:59 · 3123 阅读 · 0 评论 -
VC++2012编程演练数据结构《18》KMP算法
KMP算法是通过分析子串,预先计算每个位置发生不匹配的时候,所需GOTO的下一个比较位置,整理出来一个next数组,然后在上面的算法中使用。Knuth-Morris-Pratt Algorithm,简称KMP算法。 一种由Knuth(D.E.Knuth)、Morris(J.H.Morris)和Pratt(V.R.Pratt)三人设计的线性时间字符串匹配算法。这个算法不用计算变迁函数δ,匹配时间为Θ原创 2012-11-20 13:58:03 · 3100 阅读 · 0 评论 -
VC++2012编程演练数据结构《19》散列文件
散列文件是利用散列存储方式组织的文件,亦称为直接存取文件。它类似于散列表[1],即根据文件中关键字的特点,设计一个散列函数和处理冲突的方法,将记录散列到存储设备上。 与散列表不同的是,对于文件来说,磁盘上的文件记录通常是成组存放的,若干个记录组成一个存储单位,在散列文件中,这个存储单位叫做桶(Bucket)。假如一个桶能存放m个记录,则当桶中已有m个同义词的记录时,存放第m+1个同义词会发生"溢原创 2012-11-20 14:37:16 · 3707 阅读 · 0 评论 -
VC++2012编程演练数据结构《20》索引文件
索引文件由索引表和主文件两部分构成。 索引表是一张指示逻辑记录和物理记录之间对应关系的表。索引表中的每项称作索引项。索引项是按键(或逻辑记录号)顺序排列。若文件本身也是按关键字顺序排列,则称为索引顺序文件。否则,称为索引非顺序文件。(1)索引顺序文件 (Indexed Sequential File) 主文件按主关键字有序的文件称索引顺序文件。在索引顺序文件中,可对一组记录建立一个索引项。这原创 2012-11-20 14:50:00 · 2873 阅读 · 0 评论 -
VC++2012编程演练数据结构《21》二叉排序树
二叉排序树(Binary Sort Tree)又称二叉查找树。 它或者是一棵空树;或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉排序树; 步骤:若根结点的关键字值等于查找的关键字,成功。 否则,若小于根结点的关键字值,递归查左子树。 若大于根结点的关键原创 2012-11-20 15:02:48 · 3039 阅读 · 0 评论 -
VC++2012编程演练数据结构《22》常规排序算法
排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。分内部排序和外部排序。若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序。反之,若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。内部排序的过程是一个逐步扩大记录的有序序列长度的过程。内排序的方法有许多种,按所用策略不同,可归纳为五类:插入排序、选择原创 2012-11-20 15:23:59 · 2806 阅读 · 0 评论 -
VC++2012编程演练数据结构《23》二叉树排序
在计算机科学中,树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构。二叉树是每个节点最多有两个子树的有序树。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。值得注意的是,二叉树不是树的特殊情形。在图论中,二叉树是一个连通的无环图,并且每一个顶点的度不大于3。有根二叉树还原创 2012-11-20 16:39:28 · 3048 阅读 · 0 评论 -
VC++2012编程演练数据结构《24》哈夫曼树
给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman tree)。哈夫曼树又称为最优树. 1、路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子或子孙结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。 2、结点的权及带权路径长度 若将树中原创 2012-11-20 16:52:48 · 3124 阅读 · 0 评论 -
VC++2012编程演练数据结构《25》线索二叉树
线索二叉树按照某种遍历方式对二叉树进行遍历,可以把二叉树中所有结点排序为一个线性序列。在该序列中,除第一个结点外每个结点有且仅有一个直接前驱结点;除最后一个结点外每一个结点有且仅有一个直接后继结点。这些指向直接前驱结点和指向直接后续结点的指针被称为线索(Thread),加了线索的二叉树称为线索二叉树。 n个结点的二叉链表中含有n+1个空指针域。利用二叉链表中的空指针域,存放指向结点在某种遍历次序下原创 2012-11-20 17:09:52 · 2794 阅读 · 0 评论 -
VC++2012编程演练数据结构《27》最小堆二叉树
最大堆和最小堆是二叉堆的两种形式。 最大堆:根结点的键值是所有堆结点键值中最大者。 最小堆:根结点的键值是所有堆结点键值中最小者。 而最大-最小堆集结了最大堆和最小堆的优点,这也是其名字的由来。 最大-最小堆是最大层和最小层交替出现的二叉树,即最大层结点的儿子属于最小层,最小层结点的儿子属于最大层。 以最大(小)层结点为根结点的子树保有最大(小)堆性质:根结点的键值为该子树结点键值中最大原创 2012-11-20 17:29:05 · 2660 阅读 · 1 评论 -
VC++2012编程演练数据结构《26》最大堆二叉树
最大堆是二叉堆的两种形式之一。 根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大根堆,又称最大堆. 注意: ①堆中任一子树亦是堆。 ②以上讨论的堆实际上是二叉堆(Binary Heap),类似地可定义k叉堆最大堆和最小堆是二叉堆的两种形式。 最大堆:根结点的键值是所有堆结点键值中最大者。 最小堆:根结点的键值是所有堆结点键值中最小者。 而最大-最小堆集结了最大堆和最小堆的优原创 2012-11-20 17:31:59 · 2858 阅读 · 0 评论 -
VC++2012编程演练数据结构《28》拓扑排序算法
对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若 ∈E(G),则u在线性序列中出现在v之前。什么是拓扑序列 通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。离散数学原创 2012-11-20 17:47:29 · 2794 阅读 · 0 评论 -
VC++2012编程演练数据结构《29》图
图是由结点的有穷集合V和边的集合E组成。其中,为了与树形结构加以区别,在图结构中常常将结点称为顶点,边是顶点的有序偶对,若两个顶点之间存在一条边,就表示这两个顶点具有相邻关系。 在上面两个图结构中,一个是有向图,即每条边都有方向,另一个是无向图,即每条边都没有方向。 在有向图中,通常将边称作弧,含箭头的一端称为弧头,另一端称为弧尾,记作,它表示从顶点vi到顶点vj有一条边。 若有向图中有n个原创 2012-11-20 18:00:51 · 3322 阅读 · 0 评论 -
VC++2012编程演练数据结构《30》弗洛伊德算法
弗洛伊德算法是基于动态规划的求解有负权图的单源最短路的一种较高效的算法。时间复杂度:O(n^3)空间复杂度:O(n^2)弗洛伊德算法采用图的带权邻接矩阵存储结构。算法基本思想 假设求顶点Vi到Vj的最短路径。弗洛伊德算法依次找从Vi到Vj,中间经过结点序号不大于0的最短路径,不大于1的最短路径,…直到中间顶点序号不大于n-1的最短路径,从中选取最小值,即为Vi到Vj的最短路径。算法具体描述 若原创 2012-11-20 18:22:12 · 4151 阅读 · 0 评论 -
VC++2012编程演练数据结构《31》狄杰斯特拉算法
狄杰斯特拉算法 Dijkstra(狄杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表的原创 2012-11-20 18:28:47 · 3681 阅读 · 0 评论 -
VC++2012编程演练数据结构《32》桶排序
桶排序假定:输入是由一个随机过程产生的[0, 1)区间上均匀分布的实数。将区间[0, 1)划分为n个大小相等的子区间(桶),每桶大小1/n:[0, 1/n), [1/n, 2/n), [2/n, 3/n),…,[k/n, (k+1)/n ),…将n个输入元素分配到这些桶中,对桶中元素进行排序,然后依次连接桶输入0 ≤A[1..n] 算法思想 平均情况下桶排序以线性时间运行。像基数排序一样,桶排序原创 2012-11-20 18:41:40 · 3309 阅读 · 1 评论 -
VC++2012编程演练数据结构《33》希尔排序
希尔排序(Shell Sort)是插入排序的一种。是针对直接插入排序算法的改进。该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成(n除以d1)个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2 该方法实质上是一种分组插入方法。 比较相隔较远距离(称为增量)的数,使得数移原创 2012-11-20 18:49:49 · 3078 阅读 · 1 评论 -
VC++2012编程演练数据结构《34》树形选择排序
树形选择排序(Tree Selection Sort) 树形选择排序又称锦标赛排序(Tournament Sort),是一种按照锦标赛的思想进行选择排序的方法。首先对n个记录的关键字进行两两比较,然后在n/2个较小者之间再进行两两比较,如此重复,直至选出最小的记录为止。 这个过程可用一棵有n个叶子结点的完全二叉树表示。例如,图表2中的二叉树表示从8个数中选出最小数的过程。8个叶子结点到根接点中原创 2012-11-20 19:04:40 · 3833 阅读 · 0 评论 -
VC++2012编程演练数据结构《35》多路平衡归并
多路平衡归并一般说来,如果初始归并段有m个,那么这样的二路归并树就有élog2mù+1层,要对数据进行élog2mù遍扫描。采用k路平衡归并时,则相应的归并树有élogkmù+1层,要对数据进行élogkmù遍扫描。 做内部归并时,在k个记录中选择最小者,需要顺序比较k-1次。每趟归并u个记录需要做(u-1)*(k-1)次比较,s趟归并总共需要的比较次数为:(其中U代表总的记录个数,k代表的是归并原创 2012-11-20 19:26:35 · 3271 阅读 · 0 评论 -
VC++2012编程演练数据结构《36》磁盘文件进行排序
如何给磁盘文件排序问题描述:输入:一个最多含有n个不相同的正整数的文件,其中每个数都小于等于n,且n=10^7。输出:得到按从小到大升序排列的包含所有输入的整数的列表。条件:最多有大约1MB的内存空间可用,但磁盘空间足够。且要求运行时间越短越好。分析:一步一步地解决这个问题,创建一个工程声名如下#include "stdafx.h"//对外存文件(磁盘文件)进行排序的算法typedef st原创 2012-11-20 19:31:58 · 4760 阅读 · 2 评论