【计算机类职业资格】程序员-数据结构与算法(二)及答案解析.doc
《【计算机类职业资格】程序员-数据结构与算法(二)及答案解析.doc》由会员分享,可在线阅读,更多相关《【计算机类职业资格】程序员-数据结构与算法(二)及答案解析.doc(18页珍藏版)》请在麦多课文档分享上搜索。
1、程序员-数据结构与算法(二)及答案解析(总分:29.00,做题时间:90 分钟)一、综合知识试题(总题数:8,分数:8.00)1.当二叉树的结构形如_时,其后序遍历序列和中序遍历序列相同。(分数:1.00)A.B.C.D.2.设线性表(59,53,46,48,37,31,25)采用散列(Hash)法进行存储和查找,散列函数为 H(Key)=KeyMOD 7(MOD 表示整除取余运算)。若用链地址法解决冲突(即将相互冲突的元素存储在同一个单链表中)构造散列表,则散列表中与哈希地址_对应的单链表最长。(分数:1.00)A.2B.3C.4D.63.对长度为 n 的有序表进行二分(折半)查找时,无论查
2、找指定的一个元素是否成功,最多只与表中的_个元素进行比较即可。(分数:1.00)A.log2n-1B.log2n+1C.n/2D.n-14.对于具有 n 个元素的关键字序列(K 1,K 2,K n),当且仅当满足关系 KiK 且 2ikik 2i+1 (分数:1.00)A.59,53,48,46,37,31,25B.59,46,53,48,37,31,25C.59,37,53,25,31,46,48D.59,53,48,31,25,46,375.输入受限的双端队列是指只有一端可以进行入队操作而从两端都可以进行出队操作的队列,如图 123所示。对于输入序列 1 2 3 4,经过一个初始为空且输入
3、受限的双端队列后,不能得到的输出序列为_。(分数:1.00)A.1 2 3 4B.4 3 2 1C.1 2 4 3D.4 2 1 36.设递增序列 A 为 a1,a 2,an,递增序列 B 为 b1,b 2,b m,且 mn,则将这两个序列合并为一个长度为 m+n 的递增序列时,当_时,归并过程中元素的比较次数最少。(分数:1.00)A.anb mB.anb 1C.a1b 1D.a1b m7.若二维数组 arr18,16的首地址为 base,数组元素按列存储,且每个元素占用 4 个存储单元,则元素 arr5,5在该数组空间的地址为_。(分数:1.00)A.base+(4*8+4)*4B.bas
4、e+(5*8+5)*4C.base+(4*6+4)*4D.base+(5*6+5)*48.已知某带权有向图 G(顶点数为 6,顶点编号为 1 至 6)的邻接表如下所示,其中表结点的结构为:(分数:1.00)A.9B.11C.15D.18二、案例分析试题(总题数:0,分数:0.00)三、试题一(总题数:1,分数:5.00)说明对于具有 n 个元素的整型数组 a,需要进行的处理是删除 a 中所有的值为 0 的数组元素,并将 a 中所有的非 0 元素按照原顺序连续地存储在数组空间的前端。下面分别用函数 CompactArr_v1 和 CompactArr_v2 来实现上述处理要求,函数的返回值为非零
5、元素的个数。函数 CompactArr_v1(int a,intn)的处理思路是:先申请一个与数组 a 的大小相同的动态数组空间,然后顺序扫描数组 a 的每一个元素,将遇到的非 0 元素依次复制到动态数组空间中,最后再将动态数组中的元素传回数组 a 中。函数 CompactArr_v2(int a,int n)的处理思路是:利用下标 i(初值为 0)顺序扫描数组 a 的每一个元素,下标 k(初值为 0)表示数组 a 中连续存储的非 0 元素的下标。扫描时,每遇到一个数组元素,i 就增1,而遇到非 0 元素并将其前移后 k 才增 1。程序 1-4int CompactArr_v1(int a,i
6、nt n)int i,k;int*temp=(int*)malloc(n* (1) if(!temp)return-1;for(i=0,k=0;in;i+)if(ai!=0)(2) =ai;for(i=0; (3) ;i+)ai=tempi;return k;程序 1-5int CompactArr v2(int a,int n)int i,k;for(i=0,k=0;in;i+)if(ai!=0)(4) =ai;return k;(分数:5.00)(1).请根据说明中函数 CompactArr_v1 的处理思路填补空缺(1)(3),根据 CompactArr_2 的处理思路填补空缺(4)。(
7、分数:2.50)填空项 1:_(2).请说明函数 CompactArr_v1 存在的缺点。(分数:2.50)填空项 1:_四、试题二(总题数:1,分数:5.00)说明假设一个算术表达式中可以包含以下三种括号:“(”和“)”、“”和“”、“”和“”,并且这三种括号可以按照任意的次序嵌套使用。下面仅考虑表达式中括号的匹配关系,其他问题暂时忽略。例如,表达式“a.(b.5)*c”中的括号是完全匹配的,而表达式“a-(b-5)*c”中的括号不是完全匹配的,因为“(”与“”不能匹配,而且多了一个“)”,即缺少一个与“)”相匹配的“(”。函数 ifMatched(char expr)的功能是用栈来判断表达
8、式中的括号是否匹配,表达式以字符串的形式存储在字符数组 expr 中。若表达式中的括号完全匹配,则该函数的返回值为 Matched,否则返回值为该函数的处理思路如下:(1)设置一个初始为空的栈,从左至右扫描表达式。(2)若遇上左括号,则令其入栈;若遇上右括号,则需要与栈顶的左括号进行匹配。(3)若所遇到的右括号能与栈顶的左括号配对,则令栈顶的左括号出栈,然后继续匹配过程;否则返回Mismatched,结束判断过程。(4)若表达式扫描结束,同时栈变为空,则说明表达式中的括号能完全匹配,返回 Mached。函数 ifMached 中用到了两种用户自定义数据类型 BOOL 和 STACK,其中,BO
9、OL 类型的定义如下:STACK(即栈类型)的定义省略,栈的基本操作的函数原型说明如下: void InitStack(STACK*S):初始化一个空栈。 void Push(STACK*S,char e):将一个字符压栈,栈中元素数目增 1。 void Pop(STACK*S):栈顶元素出栈,栈中元素数目减 1。 char Top(STACK S):返回非空栈 S 的栈顶元素值,栈中元素数目不变。 int IsEmpty(STACK S):若 S 是空栈,则返回 1,否则返回 0。程序 16BOOL ifMatched(char expr)char*cptr; /*cptr 指向表达式中的字
10、符*/STACK S;char e;InitStack(*cptr!=/0; (1) if(*cptr=(|*cptr=|*cptr=)(2) ;elseif(*cptr=)|*cptr=)if(IsEmpty(S)return Mismatched;e= (3) ; /*取栈顶的左括号*/if(*cptr=)/flgj=0;j+);printf(“%4d=%d“,total,dj);for(j+;j=i;j+)if(flgj)printf(“+%d“,dj);printf(“n“);else /*继续考虑后面的元素有可能找到解答时*/if(in-1in;i+)if(ai!=0)(2) =ai
11、;for(i=0; (3) ;i+)ai=tempi;return k;程序 1-5int CompactArr v2(int a,int n)int i,k;for(i=0,k=0;in;i+)if(ai!=0)(4) =ai;return k;(分数:5.00)(1).请根据说明中函数 CompactArr_v1 的处理思路填补空缺(1)(3),根据 CompactArr_2 的处理思路填补空缺(4)。(分数:2.50)填空项 1:_ (正确答案:(1)sizeof(int)(2)tempk+或*(temp+k+)或等价表示(3)ik 或等价表示(4)ak+或。(a+k+)或等价表示)解析
12、:解析 本题是一个对数组进行操作的问题。题目要求删除数组 a 中所有的值为 0 的数组元素,并将 a 中所有的非 0 元素按照原顺序连续地存储在数组空间的前端。并且在题目中给出了两个实现函数分别为函数 CompactArr_v1 和 CompactArr_v2。根据题目说明,我们可知本题的逻辑关系并不复杂,只要找到数组中值不为 0 的元素,然后按原来的顺序连续存储即可,这里可以借助其他的存储空间来完成,也可以不借助其他的存储空间来完成。下面我们就来具体分析 CompactArr_v1 和 CompactArr_v2。前面三空都在函数 CompactArr v1 中,在函数 CompactArr
13、_v1 的开始处定义了一个指针变量 temp,并使其指向一块动态分配的存储空间,而空(1)就在该动态分配存储空间的语句中,根据函数 malloc 的格式我们可以知道函数 malloc 后面括号中要给出分配空间的大小,结合整个函数 CompactArr_v1 来看,这里动态分配的存储空间是用来-临时存放数组中非 0 元素的,因此其空间大小应该为 n 乘以一个整型变量所占的空间,而这可以通过函数 sizeof 求得,因此空(1)处应填 sizeof(int)。空(2)在函数的第一个 for 循环结构中,从题目意思及结合程序不难看出,该 for 循环的作用是变量整个数组,并找出数组中值不为 0 的元
14、素,而空(2)所在的赋值语句是在数组当前元素的值不等于 0 的情况下执行的语句,并且是将数组的当前元素赋值给空(2),很显然,这里是将非 0 元素存放到动态分配的存储空间中,因此本空应填 tempk+。k 是 temp 数组的下标。空(3)是第二个 for 循环的结束条件,根据题目意思和程序不难看出该循环的作用是将存放在临时空间的非 0 元素依次存放至数组 a 中,因此循环结束的条件是循环变量 i 小于非 0 元素的个数,从上一个循环中可以看出变量 k 的值就是非 0 元素的个数值。因此本空应填 ik。第(4)空在函数 CompactArr_v2 中,根据题目意思,函数 CompactArr_
15、v2 没有借助其他的存储空间来完成删除数组 0 元素的任务,这里采用覆盖前面元素的方式来实行。再看程序,空 4 所在的赋值语句是在数组当前元素的值不等于 0 的情况下执行的语句,并且是将数组的当前元素赋值给空(4),因此本空应填ak+,当然填*(a+k+)也是一样的。(2).请说明函数 CompactArr_v1 存在的缺点。(分数:2.50)填空项 1:_ (正确答案:可能由于动态内存申请操作失败而导致函数功能无法实现,时间和空间效率低。)解析:解析 本题的函数 CompactArr_v1 在完成题目要求的功能时,利用了其他的辅助存储空间,很显然,其空间和时间效率都比函数 CompactAr
16、r_v2 要低,而且在动态申请存储空间时,有可能会失败,从而导致函数功能无法实现。四、试题二(总题数:1,分数:5.00)说明假设一个算术表达式中可以包含以下三种括号:“(”和“)”、“”和“”、“”和“”,并且这三种括号可以按照任意的次序嵌套使用。下面仅考虑表达式中括号的匹配关系,其他问题暂时忽略。例如,表达式“a.(b.5)*c”中的括号是完全匹配的,而表达式“a-(b-5)*c”中的括号不是完全匹配的,因为“(”与“”不能匹配,而且多了一个“)”,即缺少一个与“)”相匹配的“(”。函数 ifMatched(char expr)的功能是用栈来判断表达式中的括号是否匹配,表达式以字符串的形式
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
5000 积分 0人已下载
下载 | 加入VIP,交流精品资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 职业资格 程序员 数据结构 算法 答案 解析 DOC
