2.6 C++数据结构面试笔试问题考点
1、如何只让类对象只在栈(堆)上分配对象?
①:只在堆上分配对象
如果类的析构函数是私有的,则编译器不会在栈空间上为类对象分配内存。因此,将析构函数设为私有,类对象就无法建立在栈上了。
②:只在栈上分配对象
只要禁用new运算符(设为私有)就可以实现类对象只能建立在栈上。
2、#define与typedef的区别。
1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查。
2)typedef是在编译时处理的。它在自己的作用域内给一个已经存在的类型一个别名。
3)typedef int * int_ptr;与#defineint_ptr int * (注意没有分号,否则连同分号一起替换)
作用都是用int_ptr代表 int * ,但是二者不同,正如前面所说 ,#define在预处理时进行简单的替换,而typedef不是简单替换 ,而是采用如同定义变量的方法那样来声明一种类型。
3、堆和栈的区别。
1)栈,由编译器自动管理,无需我们手工控制;堆,申请释放工作由程序员控制
2)堆的生长方向是向上的,也就是向着内存地址增加的方向;栈的生长方向是向下的,是向着内存地址减小的方向增长。
3)对于堆来讲,频繁的 new/delete 势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题
4)一般来讲在 32 位系统下,堆内存可以达到4G的空间,但是对于栈来讲,一般都是有一定的空间大小的(2M)。
4、vector是顺序存储的,只有在尾部插入(删除)才不会导致迭代器失效,在头部或者中间插入(删除)都会导致插入(删除)部位及其后的所有迭代器失效。
5、二叉树的度
1)度:结点拥有的子树数称为结点的度。度为0的结点称为叶结点或终端结点。
2)分支线总数:从分支线进入结点的角度计算分支线总数,对于二叉树除了根结点以外每个结点都有一个分支线,因此分支线总数为n-1,其中n为结点的总数。
若用n1表示度为1的结点数,那么二叉树结点总数n=n 0+n1+n 2(此式比较好理解,二叉树只有度为0,1,2的结点)
而分支线总数为n-1=n1 +2* n 2
两式可推出n 0 + n 1 + n 2-1=n 1 +2* n 2,即n 2 =n 0 -1,即度为2的节点个数比度为0的节点个数少一个。
当知道二叉树度为1的节点和度为2的节点,由此式可以得出二叉树的节点数。
2.7 C++数据结构代码附录
由于内容在上述部分中已经部分介绍了,本章便不再详细给出具体的代码实现。在笔者的另一篇文档《C++进阶》中将会详细地给出向量、列表、栈和队列的数据结构代码,读者可以参考。
第三章 参考文献
[1] C++笔试面试知识考点汇总(一)https://blog.csdn.net/hmxz2nn/article/details/53151772
[2] C++笔试面试知识考点汇总(二)https://blog.csdn.net/hmxz2nn/article/details/53152598
[3] C++笔试面试知识考点汇总(三)https://blog.csdn.net/hmxz2nn/article/details/53157155
[4] 数据结构https://blog.csdn.net/qq_23912545/article/category/6868003
[5] 哈夫曼树的C++实现https://blog.csdn.net/qq1263292336/article/details/50115363
[6] 广度优先搜索算法https://blog.csdn.net/m0_37316917/article/details/70879977
[7] 深度优先搜索算法https://blog.csdn.net/m0_37316917/article/details/70880521
[8] Dijkstra算法原理https://blog.csdn.net/yalishadaa/article/details/55827681
[9] 谭浩强《C++程序设计》
[10] 邓俊辉《数据结构(C++语言版)》