收藏 分享(赏)

答案《数据结构》试卷.doc

上传人:dzzj200808 文档编号:2278405 上传时间:2018-09-09 格式:DOC 页数:8 大小:515.50KB
下载 相关 举报
答案《数据结构》试卷.doc_第1页
第1页 / 共8页
答案《数据结构》试卷.doc_第2页
第2页 / 共8页
答案《数据结构》试卷.doc_第3页
第3页 / 共8页
答案《数据结构》试卷.doc_第4页
第4页 / 共8页
答案《数据结构》试卷.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

1、1任选 5 题(1,2) , (3,4) , (5,6) , (7,8)中必须至少做一题) ,每题 20 分。一、试设计一个双栈结构,它有两个端点 end1 和 end2,满足从 end1 端插入的表目只能从end1 端被删除,从 end2 端插入的表目只能从 end2 端被删除,并给出指定端 i(i=1,2)的进栈 push(S,e,i)和出栈 pop(S,e,i)操作的算法描述。再设计一个算法,它能够将一个有限长度的数据序列 a1,a2 , an,按照下标奇偶序号交替的方式将 ai (1i n)分别从两端入栈,然后将数据出栈以实现整个数据序列的倒排。该双栈宜采用顺序存储、栈顶迎面增长的存储

2、方式,其形式定义如下:#define STACK_SIZE 1000typedef struct SElemType baseSTACK_SIZE;SElemType *top3; /top1表示 end1 端的栈顶指针,top2表示 end2 端的栈顶指针/初始值分别为 base 和 base+STACK_SIZE-1DSqStack;指定端 i(i=1,2)的进栈 push(S,e,i)和出栈 pop(S,e,i)操作的算法描述如下:Status push(DSqStack else if (i=1)*S.top1+ = e;else if (i=2)*S.top2- = e;elsere

3、turn ERROR;return OK;Status pop(DSqStack e = *-S.top1 = e;return OK;else if (i=2) if (S.top2 = S.base+STACK_SIZE-1) return ERROR;e = *+S.top2;厦门大学数据结构课程期中试卷信息科学与技术学院计算机科学系 2003 年级专业主考教师:试卷类型:(A 卷/B 卷)2return OK; elsereturn ERROR;基于上述结构的数据序列的倒排算法描述如下:Status resevers(DSqStack j=1;j-)if (j%2=0) pop(S,

4、an-j,2);else pop(S, an-j,1);return OK;二、利用两个栈 S1、S2 模拟一个队列(如客户队列)时,如何用栈的运算实现队列的插入、删除运算。使用算法描述。解:利用两个栈 S1、S2 模拟一个队列(如客户队列)时,当需要向队列中输入元素时,用S1 来存放输入元素,用 push 运算实现。当需要从队列中输出元素时,到栈 S2 中去取,如果 S2 为空,则将 S1 中的元素全部送入到 S2 中,然后再从 S2 中输出元素。判断队空的条件是:S1 和 S2 同时为空。Status EnQueue(DataType x)if StackFull(S1) /S1 栈满if

5、 StackEmpty(S2) / S1 栈满,S2 栈空while (!StackEmpty(S1) Pop(S1, y); Push(S2, y); /栈 S1 的内容反向搬到栈 S2Push(S1, x); return OK;else /S1 栈满,S2 栈非空,则不可进行插入操作return ERROR;else /S1 栈不满,则直接进栈Push(S1, x);return OK;3Status DeQueue(DataType return OK;elseif !StackEmpty(S1)while (!StackEmpty(S1) Pop(S1, y); Push(S2, y

6、); /栈 S1 的内容反向搬到栈 S2Pop(S2, x); return OK;else /栈 S1 和 S2 都为空return ERROR;三、模式匹配算法是在主串中快速寻找模式的一种有效的方法。如果设主串的长度为 m,模式串的长度为 n,则在主串中寻找模式的 KMP 算法的时间复杂性是多少?如果某一模式p=”abcaacabaca”,请给出它的 next 函数值及 nextval 函数值。解:在主串中寻找模式的 KMP 算法的时间复杂度是 O(n+m ) 。模式 p=”abcaacabaca”, 它的 next 函数值及 nextval 函数值分别是:j 1 2 3 4 5 6 7

7、8 9 10 11模式 a b c a a c a b a c anextj 0 1 1 1 2 2 1 2 3 2 1nextvalj 0 1 1 0 2 2 0 1 3 2 0四、编写算法对读入的一段文字(设以字符“”结束) ,统计其中所出现的字符及其频度。要求采用双向循环链表存储,每读入一个字符就扫描链表,若在表中已有该字符,则其频度4增加 1,同时调整链表中各结点之间的次序,使其按频度非递增排列,若表中尚无该字符,则在表尾插入该字符的一个结点,相应的频度设为 1。typedef struct ElemType char key;unsigned int freq;ElemType;ty

8、pedef struct DuLNode ElemType Data;Struct DuLNode *prior, *next;DuLNode, *DuLinkList;/设带头结点,其 freq=0Status Stat(DuLinkList while (ch!=#) p=L;while (p-next != L) if (p-data.key = ch) p-data.freq+;q=p-prior;while (q!=L) if (q!=p-prior) p-next-prior=p-prior;p-next=q-next; p-prior=q;q-next=p; p-next-pri

9、or=p; else if (!(p=(DuLiinkList) malloc(sizeof(DuLNode) return ERROR;p-data.key = ch; p-data.freq=1;p-prior=L-prior; p-next = L;L-prior-next=p; L-prior=p;getchar(ch);五、设矩阵 A 是一个 n 阶稀疏方阵,下标分别从 0 到 n1。A 中对角线上有 t 个 m 阶下三角阵 A0、A1、At1(如下图) ,且 mtn。在为矩阵 A 设计的压缩存储方案中,问用于存储矩阵 A 的一维数组 B 的大小?若将这些下三角阵中的元素以行序为主序

10、存放,设 A 中某元素 aij存放在 bk中,试给出求解 k 的计算公式。 (数组 B 的下标也从0 开始)5一维数组 B 的大小为(1m)/2*m*t = (1+m)*n/2 jMODmiiMODmmik 2/)1(2/)1(六、对下面给出的广义表做:(1)给出广义表的数据结构(2)画出下列广义表的存储结构图(3)利用取表头和表尾的操分离出原子 e(给出 GetHead、GetTail 的操作序列)(a, () ,) , () ) ) )答:(1)广义表有两种存储结构,头尾链和扩展线性链(写出其中一个即可)头尾链typedef enumATOM,LISTElemTag;typedef str

11、uct GLNodeElemTag tag;unionAtomType atom;struct struct GLNode *hp,*tp;ptr;*GList扩展线性链typedef enumATOM,LISTElemTag;typedef struct GLNodeElemTag tag;unionAtomType atom;struct GLNode *hp;struct GLNode *tp;*GList(2)两种存储结构下的存储结构图如下(只要写出对应的一种即可):头尾链61L0 a111 1 1 0 b1 1 1 0 e().)() ) )()扩展线性链L 1 0 a 1 1 1

12、0 b 1 1 0 e 1 (a,().),() ) ) )().)() )()(3)分离出来的序列为:GetHead(GetHead(GetHead(GetHead(GetTail (GetTail(L)七、编写算法求二叉树中任意两个结点最近的共同祖先,并分析算法的时间复杂性。自然语言描述:1初始化(a,().),() ) ) )().),() ) ) )() )() )()() )()7获取二叉树 T,任意两结点 P,Q2查找到任意两点的路径 使用递归算法做:A若树根为结点 P,则返回。B记录当前树根为路径中的一点。C递归遍历树根的左子树D递归遍历树根的右子树E若左右子树中都找不到,则从路

13、径中删除树根结点3查找最近祖先遍历树根到结点 P 和 Q 的路径,找到两条路径上最后一个相同结点,该结点为最近祖先4算法结束程序描述:int found=FALSE; Bitree* Find_Near_Ancient(Bitree T,Bitree p,Bitree q)/求二叉树 T 中结点 p 和 q 的最近共同祖先Bitree pathp 100 ,pathq 100 /设立两个辅助数组暂存从根到 p,q 的路径Findpath(T,p,pathp,0);found=FALSE;Findpath(T,q,pathq,0); /求从根到 p,q 的路径放在 pathp 和 pathq 中

14、for(i=0;pathpi=pathqii+); /查找两条路径上最后一个相同结点return pathp-i;/Find_Near_Ancient void Findpath(Bitree T,Bitree p,Bitree path ,int i)/求从 T 到 p 路径的递归算法if(T=p)found=TRUE;return; /找到pathi=T; /当前结点存入路径if(T-lchild) Findpath(T-lchild,p,path,i+1); /在左子树中继续寻找if(T-rchild /在右子树中继续寻找if(!found) pathi=NULL; /回溯/Findpa

15、th 算法复杂性分析:算法中 Findpath 的时间复杂性为:O(n)(因为最坏情况下需要遍历所有的二叉树结点)查找最后一个相同结点的复杂性为:O(n) (因为最坏情况下路径为二叉树所有结点)所以算法的时间复杂性为:O(n)八、编写算法判断一棵用二叉链表存储的二叉树是否为完全二叉树。自然语言描述:8(1)初始化初始化一个队列 Q,将二叉树的根结点入队,置 flag=0 表示未发现存在某个结点的孩子为空;(2)按层序遍历二叉树,并相应修改 flag循环 直到队列为空I) 将队首结点出队;II) 若该结点有左子树且 flag=0,则将左子树的根结点入队;若该结点无左子树且flag=0,则 fla

16、g=1;若该结点有左子树且 flag=1,则不是完全二叉树,退出;III) 若该结点有右子树且 flag=0,则将右子树的根结点入队;若该结点无右子树且flag=0,则 flag=1;若该结点有右子树且 flag=1,则不是完全二叉树,退出;(3)算法结束程序描述int IsFull_Bitree(Bitree T)/判断二叉树是否完全二叉树,是则返回 1,否则返回 0InitQueue(Q);flag=0;EnQueue(Q,T); /建立工作队列while(!QueueEmpty(Q)DeQueue(Q,p);if(!p) flag=1;else if(flag) return 0;elseEnQueue(Q,p-lchild);EnQueue(Q,p-rchild); /不管孩子是否为空,都入队列/whilereturn 1;/IsFull_Bitree

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报