数组和链表的区别
- 链表申请的内存不连续,数组申请的内存连续;
- 由于链表节点不仅包含数据,还包含指针,所以链表占用的内存空间比数组大;
- 由于数组可以通过下标访问元素,所以数组有序数据的查找速度较快;
- 链表的插入速度比数组快,因为数组每插入一个新元素,插入元素后面的其它元素需要依次往后移一个位置。
如何理解Linux下的线程和进程?两者有什么区别?
- 进程是系统进行资源分配和调度的一个独立单位。线程是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位;
- 区别:
- 进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响。线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差;
- 地址空间:线程是进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;
- 资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源;
- 运行效率:进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
动态库和静态库各有什么特点?它们之间的区别是什么?什么时候用静态库,什么时候用动态库?
- 静态库(.a、.lib)的特点:
-
- 静态库对函数库的链接是放在编译时期完成的;
-
- 程序在运行时与函数库再无瓜葛,移植方便;
-
- 占用较多的空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件,而且每用到一个接口,就需要将该接口重复地拷贝到对应的位置。
- 动态库(.so、.dll)的出现是静态库的问题导致的,其一是空间浪费。其二是静态库对程序的更新、部署和发布也会带来麻烦。如果静态库更新了,所有使用它的应用程序都需要重新编译、发布给用户(对于玩家来说,可能是一个很小的改动,却导致整个程序重新下载,全量更新,这会耗费大量的时间)。动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,解决了静态库对程序的更新、部署和发布带来的问题,用户只需要更新动态库即可,增量更新。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题==。动态库的特点:
-
- 动态库把对一些库函数的链接载入推迟到程序运行的时期;
-
- 可以实现进程之间的资源共享;(因此动态库也称为共享库)
-
- 将一些程序升级变得简单。
- 静态库和动态库的选择:如果程序的规模比较小,静态库和动态库都可以选择;如果程序规模比较大,考虑到编译、开发效率,优先使用动态库。
用两个栈实现一个队列的功能
一个栈(记栈A)用于存储插入的数据,一个栈(记为栈B)用于弹出数据
针对取数据,需要分四种情况进行讨论:
1.栈A和栈B都有数据(数字表示数据的插入顺序,小数字表示先插入)
如果栈B有数据,则不能将栈A的数据放进栈B,因为现在栈B的数据是比栈A的数据先插入到“队列“中的。应该先将栈B的数据取完,再将栈A的数据压入栈B中。
2.栈B为空,栈A有数据
这种情况就需要将栈A的数据全部压入栈B,然后取出栈B的顶部。
3.栈A无数据,栈B有数据
这种情况直接取出栈B的顶部数据即可。
4.栈A和栈B都无数据
这种情况说明队列无数据,返回错误即可。