C++及数据结构复习笔记(十五)(数据结构面试笔试考点、代码附录和参考文献)

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++语言版)》

猜你喜欢

转载自blog.csdn.net/lao_tan/article/details/81054892