![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
文章平均质量分 79
biaogexf
这个作者很懒,什么都没留下…
展开
-
C++ - 顺序表实现Josephus问题
Josephus问题描述 : 设有n个人围坐在一个圆桌周围,现从第s个人开始报数,数到第m的人出列、然后从出列的下一个人开始重新报数,数到第m的人又出列,如此反复直到所有人全部出列为止。要求:对于任意给定的n、s、m,求出按出列次序得到的n个人员的序列。/* 上机题1 - josephus问题 - 顺序表 */#include <iostream>const int Ma...原创 2018-03-24 14:43:28 · 2324 阅读 · 1 评论 -
C++ - 表达式二叉树
问题描述与解题思路与我之前用C语言写过的博客一模一样,这里这不过是用面向对象的思想以C++语言的方式再次呈现一遍。C语言版本:点击打开链接https://blog.csdn.net/y_16041527/article/details/79835727So......这里直接上C++的完整代码头文件声明://BinaryTree.h#include <iostream>const...原创 2018-04-20 14:16:36 · 2409 阅读 · 2 评论 -
树 - Huffman树的建立与Huffman编码的形成(C语言)
Huffman树的存储结构:结构数组。Huffman树形成的关键:如何在一堆带权节点中每次选取两个权值最小的节点。1.哈夫曼树哈夫曼树又称最优二叉树。它是 n 个带权叶子结点构成的所有二叉树中,带权路径长度 WPL 最小的二叉树。如下图为一哈夫曼树示意图。2、构造哈夫曼树假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为:(1) 将w...原创 2018-04-20 15:20:02 · 4048 阅读 · 0 评论 -
图 - C++实现最短路径(单源、多源)附加:Prim实现最小生成树
代码中所对应的图:最小生成树:涉及到的知识:1. Dijkstra算法。2. Floyd算法。3. 无向有权图的建立。4. Prim算法。//use邻接矩阵存储的图的最短路径问题#include <iostream>#include <malloc.h>using namespace std;const int ERROR = -100; //错误标记con...原创 2018-05-18 22:14:44 · 668 阅读 · 0 评论 -
图 - 用邻接表存储一个自定义的图,输出DFS和BFS序列(C++)
涉及的知识点:1. 邻接表的建立。2. Breadth First Search:广度优先搜索,利用队列,使用类似于二叉树层次遍历的方法,将顶点V出队后将V的邻接点入队,重复上述过程,直至访问完所有的节点(队列为空)。3.Depth First Search: 深度优先搜索,从顶点V出发一路走到黑,走不下去的时候利用回溯的思想原路返回,直到从起点V出发并且利用回溯法又一次回到了起点时,搜索完成。(...原创 2018-05-19 09:55:33 · 1635 阅读 · 0 评论 -
树 - 堆排序(C++)
前言: 理论(文字)知识很枯燥,但是如果读者真正想把一个问题搞明白,搞清楚,光靠成天撸代码是不行的,而需要理解其中的思想本质,否则只能是知其然而不知其所以然,我之前常说:“话不多说,直接上代码”希望不要误导读者。SO,请耐心的看下去,平常心,借用金庸老先生的一句话:“他强由他强,清风拂山岗;他横由他横,明月照大江.他自狠来他自恶,我自一口真气足。”最后,希望各位同行者可以提出问题,我们共...原创 2018-05-25 11:30:06 · 407 阅读 · 0 评论 -
排序 - 归并排序的递归实现(C语言)
前言:理论很枯燥、文字更烦人,但是这里将理论知识告诉大家并不是让大家一上来就看干巴巴的文字,因为我在代码中能注释的地方都进行了注释希望大家先跟着注释打一遍,不要着急,当在黑色的星空中出现了结果,你就会为之振奋,有了继续学下去的勇气,当你对代码中的思想有了较深的理解后,再回过头来看这些理论文字,我相信会好很多,最后一句话:书读百遍,其义自见。归并排序:1.归并排序(merge sorting)简单地...原创 2018-05-25 23:50:40 · 4356 阅读 · 0 评论 -
排序 - 快速排序(C++)
前言:排序算法哪家强,从实际应用的角度上将,快排表现很好。很自然地,人们会觉得短数组比长数组更好处理,因此可能会想到将原始数组分为若干各子部分然后分别进行排序。快速排序就是基于分治法的排序算法,这不过它更多地侧重于“分”,没有明显的“合”过程。快速排序的要点:1.快排算法思想:(1)从待排序序列S中“任意”选择一个记录k作为轴值(Pivot)。(2)将剩余的记录分割(partition)成左子序列...原创 2018-05-26 11:55:21 · 961 阅读 · 0 评论 -
排序 - 次位优先实现基数排序(C++、静态链表)
基数排序:假如直到某个长度为n的序列中所有记录的值都在0~m-1之间。当值域m很大时可以对桶式排序做一些改进:将排序码(待排数据)拆分成多个部分进行比较。例如,如果要对0~9999之间的整数进行排序,可以先按千、百、十、个位拆分。这种将排序码按照其进制数的基数进行拆分排序的方法就是基数排序,是分配排序的一种特例。低位优先法(least significant digit first,LSD)分配排...原创 2018-05-26 18:43:02 · 1939 阅读 · 1 评论 -
排序 - 堆排序、快速排序、基数排序(静态链表)(C++)
前言:在此之前,我分别写了堆排、快排、基数排序三篇文章,现在来进行一下总结,大家如果看过这三篇文章,会发现其中很多成员函数一模一样,嘿嘿嘿,说道这里,大家一定有一种能不能进行代码重用呢?答案当然是:可以啦!所以,我们将上述三个独立的算法整合到一起,命名为Sort类,其中的成员函数和成员变量都没有发生改变,只是进行了3次Ctrl+C和3次Ctrl+V,然后对main()函数进行了改动,然后就没有然后...原创 2018-05-27 17:18:14 · 1032 阅读 · 0 评论 -
树 - 堆的建立、插入和删除(C语言)
前言:理论(文字)知识很枯燥,但是如果读者真正想把一个问题搞明白,搞清楚,光靠成天撸代码是不行的,而需要理解其中的思想本质,否则只能是知其然而不知其所以然,我之前常说:“话不多说,直接上代码”希望不要误导读者。SO,请耐心的看下去,平常心,借用金庸老先生的一句话:“他强由他强,清风拂山岗;他横由他横,明月照大江.他自狠来他自恶,我自一口真气足。”最后,希望各位同行者可以提出问题,我们共同进步。涉及...原创 2018-05-24 22:42:00 · 1480 阅读 · 0 评论 -
查找 - 散列表(分离链接法+除留余数法)C++实现
散列(Hashing)的基本思想:1.计算位置:构造散列函数确定关键词存储位置。2.解决冲突:应用某种策略解决多个关键词位置相同的问题。完整代码如下:如下程序实现统计打电话次数最多的人输入:通话记录的条数N。接下来输入N条记录,每条记录含有两个电话号码。冲突解决办法:分离链接法。散列函数:除留余数法。//查找打电话最多的人//冲突处理的方法:分离链接法//哈希函数:出留余数法//#incl...原创 2018-05-29 22:48:09 · 1212 阅读 · 2 评论 -
二叉树 - 表达式二叉树(C语言)
问题描述:表达式可以用表达式二叉树来表示。对于简单的四则运算表达式,请实现以下功能。 (1)对于任意给出的前缀表达式(不带括号)、中缀表达式(可以带括号)或后缀表达式(不带括号),能够在计算机内部构造出一颗表达式二叉树,并且以图示显示出来(字符图或图形的形式)。 (2)对于构造好的内部表达式二叉树、按照用户的要求,输出相应的前缀表达式(不带括号)、中缀表达式(可以带括号,但不允许冗余括号)或后缀表...原创 2018-04-06 19:40:27 · 13772 阅读 · 4 评论 -
二叉树 - 链式二叉树的层次遍历(C语言)
问题描述:二叉树采用链接存储结构,试设计一个按层次顺序(同一层次自左至右)遍历二叉树的算法解题思路:本算法要采用一个队列q,先将二叉树的根节点入队列,然后出队列并输出该节点。若它有左子树,便将左子树树根节点入队列;若它有右子树,便将右子树根节点入队列,如此直到队列为空为止。因为队列的特点是先进先出,从而达到层次遍历二叉树的目的。完整代码如下:/* 二叉树 - 层次遍历 */#include "...原创 2018-04-06 11:27:22 · 4004 阅读 · 0 评论 -
队列 - 顺序循环队列的基本运算(C语言)
循环队列sq中: 1. front(队头指针)指向实际队列元素的第一个元素的前一个位置,rear(队尾指针)指向实际队列元素的最后一个元素位置。(可根据需要自定义) 2. 循环队列中的满并非真正意义上的满,即并不是所有的位置上都存储有元素,而是front和rear之间仍然隔着一个空位。若不隔此空位,当sq->rear == sq->front时,是满?还是空?。 3. 初始时:sq-&...原创 2018-04-05 20:39:37 · 3032 阅读 · 0 评论 -
C++ - 链式实现Josephus问题(不带头节点的单链表)
Josephus问题描述 : 设有n个人围坐在一个圆桌周围,现从第s个人开始报数,数到第m的人出列、然后从出列的下一个人开始重新报数,数到第m的人又出列,如此反复直到所有人全部出列为止。要求:对于任意给定的n、s、m,求出按出列次序得到的n个人员的序列。/* 上机题1 - 单链表实现Josephus问题 */#include <iostream>#include <m...原创 2018-03-24 17:51:15 · 805 阅读 · 0 评论 -
C++ - 中缀表达式转后缀表达式
中缀表达式转后缀表达式遵循以下原则: 1.遇到操作数,直接输出; 2.栈为空时,遇到运算符,入栈; 3.遇到左括号,将其入栈; 4.遇到右括号,执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出; 5.遇到其他运算符’+”-”*”/’时,弹出所有优先级大于或等于该运算符的栈顶元素,然后将该运算符入栈...原创 2018-03-25 10:15:40 · 4481 阅读 · 1 评论 -
二叉树 - 通过不断的插入生成一棵二叉搜索树(C语言)
二叉搜索树:其各个节点的关键字码必须是唯一的;若某结点左子树非空,则左子树上的所有节点的值均小于该结点的关键字码,而其右子树上的所有节点的值均大于该结点的关键字码。所以,按照中序周游整个二叉树的可以得到一个由小到大的有序排列。通过不断读取数组中的数据而插入生成的二叉搜索树的代码如下:/* 二叉搜索树 - 通过不断插入建立一棵二叉搜索树 */#include "stdafx.h"#includ...原创 2018-03-31 16:26:51 · 4170 阅读 · 0 评论 -
二叉树 - 先序创建一棵二叉树(C++)
二叉树的定义:二叉树由节点的有限集合构成,这个有限集合或者为空集,或者为由一个根节点(root)及两棵互不相交、分别称作这个根的左子树(left subtree)和右子树(right subtree)的二叉树组成的集合。按照先序序列输入的数据构建一棵由先序方式构建的二叉树:代码如下/* 先序创建一棵任意二叉树 *//* 注意:输入数据的顺序很有特点,本题输入的顺序要求为,先是根节点,再是左子树,...原创 2018-03-31 17:11:28 · 38003 阅读 · 11 评论 -
二叉树 - 用嵌套括号表示法建立和输出一棵二叉树(C语言)
实现方法如下:(1)从左到右扫描树的括号表示;(2)每当遇到左括号时,其前一个结点进栈,并读入下一个符号;(3)每当遇到右括号时,栈顶元素出栈。说明以栈顶元素为根的树(子树)构造完毕,此时若栈为空,算法结束,否则读入下一个符号(4)每当遇到结点时,则它一定为栈顶元素的子女,将其挂到栈顶元素的某子女位置上,并读入下一个符号; (5)每当遇到“,”,则略过该符号,并...原创 2018-03-31 20:27:57 · 18671 阅读 · 2 评论 -
二叉树的输出 - 以凹入表表示法输出一棵二叉树(C语言)
凹入表表示法:使用栈将二叉树中的数据按照指定格式(兄弟间等长、(r)代表根节点、(0)代表左节点、(1)代表右节点)输出。完整代码如下:/* 二叉树的输出 - 以凹入表表示法输出一棵二叉树 */#include "stdafx.h"#include <iostream>#include <malloc.h>using namespace std;const in...原创 2018-03-31 22:32:54 · 24591 阅读 · 5 评论 -
队列 - 使用front和count表示循环数组队列(C++)
问题描述:如果用一个循环数组q[0..m-1]表示队列时,该队列只有一个队列头指针front,不设队列尾指针rear,而设置计数器count用以记录队列中节点的个数。使编写算法实现队列的4个基本操作:判空、入队、出队以及输出队列中所有元素。完整代码如下://C++ - 77.2 - 循环数组表示队列,只用头指针和计数变量count /* 算法 - 实现判空、入队、出队 *//* 队列 - 先入...原创 2018-04-01 12:03:49 · 4806 阅读 · 0 评论 -
栈 - 在一个长度为n的数组中实现两个栈(C++)
1.问题描述: 试在一个长度为n的数组中实现两个栈,使得二者在元素的总数目为n之前都不会溢出,并且保证push和pop操作的时间代价为O(1)。2.完整代码如下:/* 77.6 - C++ - 在一个长度为n的数组中实现两个栈、且共享存储区[0,max_size-1] *//* 构栈方法 - 栈顶相向,迎面增长 */#include <iostream>using names...原创 2018-04-02 10:32:25 · 2556 阅读 · 1 评论 -
二叉树 - 递归计算二叉树的高度(C语言)
1.规定:只有一个根节点的二叉树高为1。2.完整代码如下:/* 递归函数 - 计算二叉树高度(只有一个根节点的二叉树高为1) */#include <iostream>#include <malloc.h>using namespace std;//二叉树节点定义typedef int ElementType;typedef struct bitnode{...原创 2018-04-03 21:54:31 · 17181 阅读 · 2 评论 -
二叉搜索树 - 节点的删除(C语言)
考虑三种情况:1.要删除的是叶节点:直接删除,并在修改其父节点的指针为NULL。2.要删除的节点只有一个孩子节点:将其父节点的指针指向要删除节点的孩子节点。3.要删除的节点有左、右两棵子树:用另一节点替代被删除节点:右子树的最小元素或左子树的最大元素。完整代码如下:/** * Definition for a binary tree node. * struct...原创 2018-04-04 15:17:03 · 2532 阅读 · 0 评论 -
二叉搜索树 - 查找操作(C语言)
内容包括:1.查找最大、小值。2.查找任意值。完整代码如下:/* 二叉搜素树 - 查找算法 *//* 查找最值、查找任意的某个值 */#include <iostream>#include <malloc.h>using namespace std;//二叉搜索树节点类型定义typedef int ElementType; //给int起别名为Ele...原创 2018-04-04 16:23:37 · 476 阅读 · 0 评论 -
排序 - 快速排序(非递归实现)C++
前言:为什么要实现快排非递归算法,不是已经有了递归算法了吗? 计算机在实现递归时会调用系统的堆栈,这很消耗计算机内存资源,所以采用非递归算法的本质就是手动模拟系统的堆栈调用来降低computer资源的消耗。 快排的详细讲解和递归算法的入口:https://blog.csdn.net/y_16041527/article/details/80460015话不多讲,直接看代码(有注释...原创 2018-10-04 13:44:00 · 8629 阅读 · 2 评论