C++数据结构与算法实现
文章平均质量分 63
基于《C++自学精简实践教程》,是该课程的后续课程。
主要目标是让学生熟练掌握C++复制控制这一C++语言的核心概念。以数据结构为载体,打下以后工作开发的坚实基础。
C++程序员Carea
十年一线开发经验,热爱 C++ ,热爱编程
展开
-
时间复杂度和空间复杂度的量化描述 Big O 表示法
在上面的文章里,我们给出了时间复杂度和空间复杂度的最小单位。现在我们来量化描述各种算法(计算过程)的时间复杂度和空间复杂度。原创 2023-09-13 07:10:24 · 257 阅读 · 0 评论 -
6.5 项目2 文本文件单词搜索程序
看完了这一节,就有想自己实现一下的感觉。主要是体验一下作者对交互类的设计思路,以及shared_ptr运用的正统方法和小的细节。按照书上的实现代码如下:#include #include #include #include #include #include #include #include #include using namespace std;typede原创 2016-12-08 14:08:51 · 1922 阅读 · 0 评论 -
教程自带的错误检测和内存泄露检测介绍
在教程的每一篇文章的最后,我们都会给出预期输出结果。其中,表示在这篇文章里的练习作业中的源代码 180行有一个。原创 2023-09-02 09:39:27 · 194 阅读 · 0 评论 -
实现智能指针shared_ptr(难度3)(源码与测试用例)
本作业主要考察:复制控制/动态内存管理/模板编程/基于引用计数的智能指针原理/测试驱动开发。实现代码完成下面的my_shared_ptr以及main函数中的测试用例。本实现主要是利用复制控制来增加引用计数实现智能指针。原创 2023-09-01 11:33:10 · 209 阅读 · 0 评论 -
图 Graph
从一个顶点开始加入已经遍历的集合,每次从连接已经遍历集合和未遍历集合的边里面选长度最短的那条边加入即可。3 从一个灰色顶点v的外围找白色顶点,找到的都设置为灰色,此时这个v遍历完成,遍历完成设置成黑色;深度优先搜索是一个递归函数,总是优先对第一次遍历到底灰色顶点接着去遍历灰色顶点的邻接白色顶点。每次选一个距离最近的顶点进来,用这个最近的顶点的边,更新外围可达顶点到源点的距离。2 树上的每个顶点都有一个距离,表示这个顶点离起始顶点的边的个数。4 起始点s加入队列Q,灰色顶点都要加入Q,只要Q不空就继续;原创 2023-09-01 11:31:04 · 183 阅读 · 0 评论 -
各种排序算法性能对比
上图中最后一列为:n+n*(n-1)/2。原创 2023-08-31 12:50:35 · 403 阅读 · 0 评论 -
快速排序(Quit Sort)
每次都把数据分成左右两部分,左边的小于某个数,右边的大于某个数。递归操作左侧和右侧,最终完成所有数据的排序。原创 2023-08-31 12:47:00 · 148 阅读 · 0 评论 -
选择排序(Selection Sort)
每次从未排序子数组中选中最小的元素,与已排序子数组的末尾元素交换。原创 2023-08-31 12:45:40 · 147 阅读 · 0 评论 -
插入排序(Insertion Sort)
每次选择未排序子数组中的第一个元素,从后往前,插入放到已排序子数组中,保持子数组有序。原创 2023-08-31 12:43:28 · 658 阅读 · 3 评论 -
排序 Bubble Sort(提取函数)
这时候再将剩下的元素序列用同样的方法处理,就会出现所有元素中第二大的元素冒泡,第3大的元素冒泡,一直到最后一个元素不用冒泡了。是指当前待排序的序列中元素最大的那个元素,我们找到这个元素,并把这个元素放到最后一个位置,那么最大的元素就已经排好序了(冒泡了)。我们将冒泡函数Bubble提出出来,交换两个变量的值的函数Swap也提取出来,代码一下子简单了很多。这两个元素的值,不断重复这个过程,最终让所有元素都按照从小到大的顺序存放。是将元素按照从小到大的顺序存放的方法。这时候我们需要找到需要调整的元素对,并。原创 2023-08-31 12:39:33 · 145 阅读 · 0 评论 -
平衡二叉树AVLTree的实现与应用(难度5/10)
平衡的动作就是AVLTree的成员函数;两种Tree公用TreeIterator;这是目前难度最高的一个作业,主要难点在于树的平衡,树的平衡依赖于调试输出的图形化,也就是输出二叉树的实现,二叉树的输出技巧性比较强,一般人很难直接想到控制台可以打印二叉树。平衡部分的调试最好用很少很少量的数据,把各种情况跑一遍,因为一旦不考虑测试集的大小,容易给自己添麻烦。测试集大了之后,调试起来很不方便,哪怕是有输出工具的帮忙。本作业主要考察:二叉树的平衡、平衡的时机、树的迭代器、模板容器、与二叉搜索树的性能比较。原创 2023-08-31 12:35:55 · 127 阅读 · 0 评论 -
二叉查找树(binary search tree)(难度7)
部分内容参《算法导论》原创 2023-08-31 12:31:44 · 1078 阅读 · 0 评论 -
哈希表HashMap(基于vector和list)
我们这里要实现的HashMap接口不会超过标准库的版本(是一个子集)。HashMap是一种键值对容器(关联容器),又叫字典。和其他容易一样,它可以对存储的元素进行增删改查操作。它之所以叫关联容器,是因为它的每个元素都是一对(键 key 和值 valueHashMap h;h[123] = string("张三");//每个元素包括一个键(123)和值("张三")这种容器可以快速的访问容器中的任何一个元素。原创 2023-08-31 12:25:22 · 1794 阅读 · 0 评论 -
队列的链表实现 题目(难度1/10)
队列这种容器,就像大家排队上公交车一样。第一个来到的人排在最前面;最后来的排在最后面;第一个先上车(离开队列);原创 2023-08-31 12:19:54 · 2207 阅读 · 0 评论 -
4.3 实现基于栈的表达式求值计算器(难度4/10)
还有就是一些高级比如指数运算怕不会操作Windows的自带计算器算错,要用自己的计算器再验证一遍;第三个就是Windows的计算器不支持回车键和命令行,我的就可以,回车一下就行,Windows的总是要鼠标点来点去,烦不胜烦。通过栈的应用,理解特定领域设计的关键作用,给大家眼前一亮的感觉。是作业中的上等作品,是数据结构与算法的典型代表。本作业主要考察:解释器模式的实现思想/栈结构在表达式求值方面的绝对优势。实现表达式求值的计算器,以支持加、减、乘、除、指数幂、括号,6种操作。原创 2023-08-31 12:16:43 · 1462 阅读 · 0 评论 -
4.2 基于链表list封装栈StackL 题目+答案 2分钟看完
由于链表的接口功能超过了栈的功能范围,所以,我们只需要把链表的一部分功能包装成栈即可。由于vector也有同样的接口,所以我们也可以用vector来实现栈。,所以我们的std::list成员变量可以当作值类型来使用。这样就不用再把指针指来指去那种容易出错的代码再写一遍了。下面使用标准库中的std::list来封装栈。因为标准库的容器已经实现了。,这样工作量大大降低。原创 2023-08-31 12:04:21 · 169 阅读 · 0 评论 -
4.1 链式栈StackT
对象被赋值的时候,可能已经有元素了,所以这时候copy 内部需要先调用 clear 成员函数来清空自己管理的堆内存。由于包装的代码就是接口转发,只要类型写对,接口名别调用错了就可以了,所以出问题的概率极大的降低了。原来对链表的测试用例已经把链表的稳定性保证了,所以现在的不确定性只是在栈对链表的包装上。由于使用了现成的代码,所以有些底层的代码直接拿来用,这就节省了工作量。或者用户确定调用pop的时候栈是不可能为空的,这样就避免了不必要的代码的执行。这样做的注意目的是为了效率,类的接口各司其职,分工明确。原创 2023-08-31 11:26:57 · 1495 阅读 · 0 评论 -
3.2 模板双向排序链表
本文素材来自于。原创 2023-08-31 10:43:56 · 246 阅读 · 0 评论 -
2.5 动态字符串 String (完整源码)
所以,本文就直接给出全部的源码和运行结果。欢迎参考借鉴,如有问题欢迎评论指出!因为大部分接口都一样。原创 2023-08-31 00:07:39 · 1103 阅读 · 0 评论 -
2.4 Vector<T> 动态数组(随机访问迭代器)
这里的版本主要是使用模板实现、支持随机访问迭代器,支持std::sort等所有STL算法。(本文对随机迭代器的支持参考了 复旦大学 大一公共基础课C++语言的一次作业)随机访问迭代器的实现主要是继承std::iterator来实现的。1 为何下面代码中的iterator是struct而不是class?原创 2023-08-31 00:04:24 · 1088 阅读 · 0 评论 -
2.3 Vector 动态数组(迭代器)(友元类 friend class 与内部类)
对迭代器的详细介绍参考 :迭代器 iterator范围for循环删除容器的元素 remove erase迭代器的能力。原创 2023-08-30 23:37:11 · 1332 阅读 · 0 评论 -
2.1 动态数组 Vector(难度1)(V)
自定义的类型class/struct Vector是不可以使用下标操作符[]的。扩容如果要保持元素挨在一起存放,只能另起一个更大的炉灶,把现在的数据拷贝过去。这样的数组,使用起来也很不方便。这个类有下面的一些功能。每当元素增加一个的时候,我们记得把这个成员变量的值加1。对操作符[]的重载是一个特殊的成员函数,有固定的格式。此时容器再也没有剩余的空间可以添加元素了,需要扩容。数组的元素数量,我们可以用一个成员变量来记录。现在,我们也开始考虑如何实现下面的这些功能。如果原来有元素,需要释放原来的全部动态内存。原创 2023-08-30 23:24:02 · 351 阅读 · 2 评论 -
时间复杂度和空间复杂度的最小单位是什么
如上图所示,由于CPU运算(加减乘除)特别快,而内存的速度与之相比慢了很多,但是CPU又只有有限的几个寄存器可以参与计算,所以,数据总是保存在内存中,通过内存数据反复的和寄存器交换数据,再由CPU加工寄存器数据来完成实际的运算,这就导致瓶颈发生在内存的读写上。如果一个计算过程需要更多的内存字节数量,我们就说这个计算过程的空间复杂度比较高。如果一个计算过程需要更多的内存读写次数,我们就说这个计算过程的时间复杂度比较高。:内存占用一个字节作为空间复杂度的最小单位。读内存的场景:获取变量的值。原创 2023-08-30 23:15:59 · 322 阅读 · 0 评论 -
C++数据结构与算法实现(目录)
很多学生在学习数据结构的时候,不知道如何实现,没有思路。实际上是缺少良好代码的参考,没有模仿对象。你只需要填写关键的几行代码即可。大部分时间在理解现有的设计。3.1 单向链表( signal linked list)(指针成员)1 《C++数据结构与算法(第4版)》 Adam Drozdek 著。(难度7)(A)---------------节省了大量的繁杂时间,大幅提高了学习效率。你只需要让程序运行的和标准答案一样即可。2 《数据结构》清华大学 邓俊辉。下标操作符重载 (A)(V)原创 2023-08-30 22:27:49 · 1185 阅读 · 0 评论