本题15分请利用两个栈S1和S2来模拟一个队列。已

合集下载

栈和队列-题库

栈和队列-题库

(A)调用子程序 (B)购物排队
(C)后置式转换 (D)执行中断
12.下列哪些数据结构可用来实现堆栈
(1)链表 (2)数组 (3)树 (4)图
(A)(2),(3) (B)(2),(4) (C)(1),(4) (D)(1),(2)
13.有一栈,一开始是空的,假设 push(X)指令会将数据放入栈,pop 指令会将栈顶的数
位置
(A)链头 (B)链尾 (C)链中
27.在解决计算机主机与打印机之间速度不匹配问题时通常设置一个打印数据缓冲区,主机
将要输出的数据依次写入该缓冲区,而打印机则从该缓冲区中取出数据打印.该缓冲区应该是
一个
结构.
(A)堆栈 (B)队列 (C)数组 (D)线性表

28.设栈的输入序列为 1,2,3,…,n,输出序列为 a1,a2,a3,…,an,若存在 1<=k<=n 使得 ak=n,则当 k<=i<=n 时,ai 为 (A)n-i+1 (B)n-(i-k) (C)不确定 29、若已知一个栈的入栈序列是 1,2,3,4….,n,其输出序列为 p1,p2,p3,p4,….,pn,若 p1=n,
据输出。现在有 ABCDE 五个数据依次以 push 指令放入栈中,在放入的过程与结束后,陆
续执行了一些 pop 指令,下列哪个选项为不可能的输出结果
(A)ABCDE (B)EDCBA (C)EABCD (D)ABDEC
14.下列哪种数据结构常用于系统程序的作业调度
(A)栈 (B)队列 (C)链表 (D)数组
出队列操作应执行以下
(A) temp=queue[rear];rear--;
(B) rear++; temp=queue[rear];

东南大学研究生入学考试数据结构试题

东南大学研究生入学考试数据结构试题

东南大学一九九四年攻读硕士学位研究生入学考试试题试题编号:451试题名称:数据结构一: 回答下列问题(共32分)1.最近最少使用(Least-Recently-Used)页替换是虚拟存储系统中常用的策略,试说明如何利用一页链接表时刻跟踪最近最少使用页?(8分)2.已知无向图G,V(G)={1,2,3,4},E(G)={(1,2),(1,3),(2,3),(2,4),(3,4)},试画出G的邻接多表(Adjacency Multilists),并说明,若已知点i,如何根据邻接多表找到与i相邻的点j?(8分)3.欲求前k个最大元素,用什么分类(sorting)方法好?为什么?什么是稳定分类?分别指出下列算法是否稳定分类算法,或易于改成稳定分类算法?(a) 插入分类 (b) 快速分类 (c) 合并分类 (d) 堆(heap)分类 (e) 基数分类(radix sort) (8分)4.构造最佳二叉检索树的前提条件是什么?在动态情况下,一般A VL树的查询性能不如完全二叉检索树的,为什么人们却采用A VL树呢?(8分)二:下列算法对一n位二进制数加1,假设无溢出,该算法的最坏时间复杂度是什么?并分析它的平均时间复杂性.(15分)type Num=array[1..n] of [0..1];procedure Inc(var A:Num);var j: integer;begin i:=n;while A[i]=1 doA[i]:=0;i:=i-1;end;A[i]:=1;end Inc;三:给定n*m矩阵A[a..b,c..d],并设A[i,j]<=A[i,j+1](a<=i<=b,c<=j<=d-1)和A[i,j]<=A[i+1,j](a<=i<=b-1,c<=j<=d),设计一算法以比O(n*m)小的时间复杂度判定值x是否在A中.(17分)四:设图G有n个点,利用从某个源点到其余各点最短路径算法思想,设计一产生G 的最小生成树的算法.(18分)五:字符序列的子序列由删除该序列任意位置的任意个元素而得.序列x和y的最长公共子序列记为Lcs(x,y),是x和y的公共子序列,且长度最大.例如,adcbcb是x=abdcbcbb和y=adacbcb的最长公共子序列.设x长度为n,y长度为m,设计一算法计算x和y的最长公共子序列的长度,尽可能改进你的算法,使它的时间复杂性为O(n*m).(18分)_______________________________________________________________________________东南大学一九九五年攻读硕士学位研究生入学考试试题试题编号:451试题名称:数据结构1.在磁带文件上进行二分查找行吗?为什么?(6分)2.分析确定下列程序中语句k:=k+1执行次数与n所成的数量级关系(即表示为O(f(n))的形式).(6分)k:=1; i:=k;while i<n dobegin k:=k+1; i=i+k; end;3.外排序中为什么采用k-路合并而不采用2-路合并?这种技术用于内排序有意义吗?为什么?(8分)4.索引顺序存取方法(ISAM)中,主文件已按主关键字(primary key)排序,为什么还需要主关键字索引?(6分)5.满二叉检索树(full binary search tree)符合B树定义吗?B树的插入(insetb)和删除(deleteb)算法适用于满二叉检索树吗?为什么?(10分)6.设无向图G有n个点e条边,写一算法建立G的邻接多表(adjacency multilists),要求该算法的时间复杂性为O(n+e),且除邻接多表本身所占空间外只用O(1)辅助空间.(16分)7.写一改进的递归快速排序算法,要求对于n个记录,该算法的递归深度<=1+log2(n),并说明你的算法满足这一要求.(17分)8.定义前序排列(preorder permutation)为1,2,……n的全部二叉树的中序排列(inorder permutation)集合为IP;再定义将1,2,……n从右到左经过一个栈可得到的全部排列集合为SP.例如,当n=3,SP={123,132,213,231,321}.问:IP包含于SP成立否?证明你的结论.(16分)9.设记录R[i]的关键字为R[i].key(1<=i<=k),树结点T[i](1<=i<=k-1)指向败者记录,T&#0;为全胜记录下标.写一算法产生对应上述R[i](1<=i<=k)的败者树(tree of loser),要求除R[1..k]和T[0..k-1]以外,只用O(1)辅助空间.(15分)_________________________________________________________________ 东南大学一九九六年攻读硕士学位研究生入学考试试题试题编号:451试题名称:数据结构一:回答下列问题(共46分)1.线性表(a(1),a(2),……a(n))用顺序映射表示时,a(i)与a(i+1)(1<=i<n)的物理位置相邻吗?链接表示时呢?(5分)2.一棵前序序列为1,2,3,4的二叉树,其中序序列可能是4,1,2,3吗?设一棵二叉树的前序序列为1,2,3,4,5,6,7,8,9,其中序序列为2,3,1,5,4,7,8,6,9,试画出该二叉树.(7分)3.在模式匹配KMP(Knuth,Morris and Pratt)算法中所用失败函数f的定义中,为什么要求p(1)p(2)……p(f(j))为p(1)p(2)……p(j)两头匹配的真子串?且为最大真子串?(7分)4.在union-find问题中,控制union操作的权重(weighting)规则是何含义, 有何效果?控制find操作的倒塌(collapsing)规则是何含义,有何效果?(7分)5.堆排序(heap sort)是稳定排序吗?举例说明.(6分)6.给定输入文件:101,48,19,65,3,74,33,17,21,20,99,53,24,并设记录缓冲区个数k=4,写出基于败者树的外排序顺串生成算法runs输出的顺串.(6分)7.m阶B树中,m大小的确定与什么因素有关?(8分)二:设结点结构为:| data | link |,试用一个全局指针p和某种链接结构实现一个队列,画出示意图,并给出入队和出队deleteq过程,要求它们的时间复杂性都是O(1)(不计new和dispose时间).(10分)三:设有向图G有n个点(用1,2,……n表示),e条边,写一算法根据G的邻接表生成反向邻接表,要求时间复杂性为O(n+e).(13分)四:设二叉树结点结构为:| left | data | bf | right |,定义二叉树结点T的平衡因子bf(T)=h(左)-h(右),写一递归算法确定二叉树tree中所有节点的平衡因子bf,同时返回二叉树tree中非叶结点个数.(15分)五:设符号表T重的标识符x满足1<=x<=m,且n为对T表的最大插入次数.设计符号表T的表示结构,允许使用O(m+n)空间,并写出T的初始化(init),查找(search),插入(insert)和删除(delete)算法,要求它们的时间复杂性都是O(1).(16分)_____________________________________________________________________东南大学一九九七年攻读硕士学位研究生入学考试试题试题编号:451试题名称:数据结构一:简要回答下列问题(共32分)1.在表达式中,有的运算符要求从右到左运算,如A^B^C的计算次序应为(A^(B^C)),这在由中缀生成后缀的算法中是怎样实现的?(8分)2.给出KMP算法中失败函数f的定义,并说明利用f进行串模式匹配的规则,该算法的技术特点是什么?(8分)3.Fibonacci查找算法(fibsrch)中为什么要求m<F(a-1),试用图示说明.(8分)4.为什么在倒排文件(inverted files)组织中,实际记录中的关键字域(key fields)可删除以节约空间?而在多表(multilists)结构中这样做为什么要牺牲性能?(8分)二:试写一算法,建立无向图G的邻接多表(adjacency multilists),要求说明算法中主要数据结构和变量的意义.(15分)三:给出中序线索树的结点结构并画出一个具有头结点的中序线索树,使其树结点至少应有6个,写一算法在不使用栈和递归的情况下前序遍历一中序线索树,并分析其时间复杂性.(18分)四:若S是n个元素的集合,则S的幂集P(S)定义为S的所有子集的集合.例如,S=(a,b,c),P(S)={(),(a),(b),(c),(a,b),(a,c),(b,c),(a,b,c)}.给定S,写一递归算法求P(S).(15分)五:已知在llink-rlink存储法表示的二叉树中,指针t指向该二叉树的根结点,指针p,q分别指向树中的二个结点,试写一算法,求距离这两个结点最近的共同的祖先结点.(20分)_____________________________________________________________________东南大学一九九八年攻读硕士学位研究生入学考试试题试题编号:451试题名称:数据结构一:简要回答下列问题(共40分)1.设胜者树(selection tree)由k个记录缓冲区和k-1个非叶结点构成.概念上非叶结点表示其两个子女中关键字较小者,而实际上非叶结点存放的是什么?(5分)2.索引顺序存取方法(ISAM)中,主文件已按主关键字(primary key)排序,为什么还需要主关键字索引?(6分)3.一棵前序序列为1,2,3,4的二叉树,其中序序列可能是4,1,2,3吗?设一棵二叉树的前序序列为1,2,3,4,5,6,7,8,9,其中序序列为2,3,1,5,4,7,8,6,9,试画出该二叉树.(7分)4.构造最佳二叉检索树的前提条件是什么?在动态情况下,一般AVL树的查询性能不如完全二叉检索树的,为什么人们却采用AVL树呢?(8分)5.将两个栈存入数组V[1..m]中应如何安排最好?这时栈空栈满的条件是什么?(6分)6.已知无向图G,V(G)={1,2,3,4},E(G)={(1,2),(1,3),(2,3),(2,4),(3,4)},试画出G的邻接多表(Adjacency Multilists),并说明,若已知点i,如何根据邻接多表找到与i相邻的点j?(8分)二:写出用堆排序(heap sort)算法对文件F=(12,3,15,30,9,28)进行排序时,初始堆及以后每挑好一个元素重新调整后堆的状态,并指出这里的堆和败者树(tree of loser)的一个主要区别.(8分)三:设数组A存放一n位二进制数,试说明下列算法X的功能.假设无溢出,算法X的最坏时间复杂度是什么?分析它的平均时间复杂性.(8分)type Num=array[1..n] of [0..1];procedure X(var A:Num);var j: integer;begin i:=n;while A[i]=1 dobeginA[i]:=0;i:=i-1;end;A[i]:=1;end;四:下面是一改进了的快速分类算法:1 procedure qsort1(var list:afile;m,n:integer);2 (设list[m].key<list[n+1].key)3 var i,j,k:integer;4 begin5 while m<n do6 begin7 i:=m;j:=n+1;k:=list[m].key;8 repeat9 repeat i:=i+1 until list[i].key>=k;10 repeat j:=j-1 until list[j].key<=k;11 if i<j then interchange(list[i],list[j]);12 until i>=j;13 interchange(list[m],list[j]);14 if n-j>=j-m15 then begin qsort1(list,m,j-1);m:=j+1;end16 else begin qsort1(list,j+1,n);n:=j-1;end17 end;(of while)18 end;问: (共20分)1.将第9,10行中的>=,<=分别改成>,<行吗?为什么?(5分)2.该排序算法稳定否,举例说明.(5分)3.对输入文件(22,3,30,4,60,11,58,18,40,16),列表表示该文件在每次调用qsort1时的状态及相应m,n的值.(5分)4.若输入文件有n个记录,简要说明支持qsort1递归所需最大栈空间用量(设一层递归用一个单位栈空间).(5分)五:给定AOE网络各事件(标号1..n)的ee,le值和邻接表,写一算法求该AOE的所有活动(用相应边的两端点表示)的关键度(criticality).(10分)六:给出中序线索树的结点结构,并画出一个具有头结点和六个树结点的中序线索树,试写一算法在不使用栈和递归的情况下前序遍历一中序线索树,并分析它的时间复杂性.(18分)_____________________________________________________________________东南大学一九九九年攻读硕士学位研究生入学考试试题试题编号:451试题名称:数据结构注意事项:(1) 答卷上需写清题号,不必抄题;回答问题字迹工整,卷面清洁.(2) 编程中所用的数据结构及主要变量需加以说明,必要时程序中加以注释. 一:简要回答下列问题(共40分)1.利用两个栈s1,s2模拟一个队列时,如何用栈的运算实现队列的插入,删除以及判队空运算.请简述算法思想.(7分)2.二叉树有n个顶点,编号为1,2,3,……n,设:T中任一顶点V的编号等于左子树中最小编号减一;T中任一顶点V的右子树中最小编号等于其左子树中最大编号加一;试描绘该二叉树.(7分)3.设某文件经内排序后得到100个初始归并段(初始顺串),若使用多路归并排序算法,并要求三趟归并完成排序,归并路数最少为多少?(5分)4.若一棵树中有度数为1至m的各种结点数分别为n1,n2,...nm(nm表示度数为m的结点个数),请推导出该树中共有多少个叶结点n0的公式.(8分)5.试举例分析,堆排序法是否稳定.(5分)6.试利用KMP算法和改进算法分别求p1='abcabaa'和p2='aabbaab'的NEXT函数和NEXTVAL函数.(8分)二:阅读下列算法,指出算法A的功能和时间复杂性.(10分)procedure A(h,g: pointer);(h,g分别为单循环链表(single linked circular list)中两个结点指针)procedure B(s,q: pointer);var p: pointer;beginp:=s;while p^.next<>q do p:=p^.next;p^.next:=s;end; (of B)beginB(h,g);B(g,h);end; (of A)三:已知无向图采用邻接表存储方式,试写出删除边(i,j)的算法.(10分)四:线性表中有n个元素,每个元素是一个字符,存在向量R[1..n]中,试写一个算法,使R中的字符按字母字符,数字字符和其它字符的顺序排列.要求利用原空间,且元素移动次数最少.(15分)五:四阶B树中(如图所示),插入关键字87,试画出插入调整后树的形状.(10分)|30 60 80|/ / \ \|20 25| |35 50| |60 70 75| |82 85 90|六:试编写一算法对二叉树按前序线索化.(15分)_____________________________________________________________________东南大学二○○○年攻读硕士学位研究生入学考试试题科目编号:451科目名称:数据结构一:简要回答下列问题(共40分)1.假设一棵二叉树的层序序列是ABCDEFGHIJ和中序序列是DBGEHJACIF,请画出该树.(6分)2.简单比较文件的多重表和倒排表组织方式各自的特点.(6分)3.画出对算术表达式A-B*C/D+E^F求值时操作数栈和运算符栈的变化过程.(6分)4.找出所有满足下列条件的二叉树6分)a)它们在先序遍历和中序遍历时,得到的结点访问序列相同;b)它们在后序遍历和中序遍历时,得到的结点访问序列相同;c)它们在先序遍历和后序遍历时,得到的结点访问序列相同.5.对一个由n个关键字不同的记录构成的序列,能否用比2n-3少的次数选出该序列中关键字取最大值和关键字取最小值的记录?请说明如何实现?在最坏情况下至少进行多少次比较?(8分)6.已知某文件经过置换选择排序后,得到长度分别为47,9,31,18,4,12,23,7的8个初始归并段.试为3路平衡归并设计读写外存次数最少的归并方案,并求出读写外存的次数.(8分)二:已知L是无表头结点的单链表,其中P结点既不是首元结点,也不是尾元结点,(10分)a)在P结点后插入S结点的语句序列是______b)在P结点前插入S结点的语句序列是______c)在表首插入S结点的语句序列是______d)在表尾插入S结点的语句序列是______(1) P^.next:=S;(2) P^.next:=P^.next^.next;(3) P^.next:=S^.next;(4) S^.next:=P^.next;(5) S^.next:=L;(6) S^.next:=NIL;(7) Q:=P;(8) WHILE P^.next<>Q DO P:=P^.next;(9) WHILE P^.next<>NIL DO P:=P^.next;(10) P:=Q;(11) P:=L;(12) L:=S;(13) L:=P;三:设计一个符号表的表示方法,编写算法使得在该表中进行查询,插入和删除任何一个标识符X的操作在O(1)的时间内.假设1<=x<=m,n为要插入的个数,所需空间为m+n.(10分)四:试利用Dijkstra算法求下图中从顶点a到其它各顶点的最短路径,写出执行算法过程中各步的状态.(10分)____________/ 4 \↓ 6 \b------→e___9\15↑↑ \ // 2 /8 ↓/a------→c g (和严蔚敏习题集上题目相同)\ \4 ↑↑12↓ 5 ↓ 10/ /d←------f__/ /\___________/3五:以顺序存储结构表示串,设计算法,求串S中出现的第一个最长重复子串及其位置并分析算法的时间复杂度.(15分)六:写出按后序序列遍历中序线索树的算法.(15分)_____________________________________________________________________二○○一年的题目(缺两道小题):一:1.设胜者树(selection tree)由k个记录缓冲区和k-1个非叶结点构成.概念上非叶结点表示其两个子女中关键字较小者,而实际上非叶结点存放的是什么?3.给出KMP算法中失败函数f的定义,并说明利用f进行串模式匹配的规则,该算法的技术特点是什么?5.是一道关于Huffman树中叶子结点和非叶结点数量关系的计算题,具体题目记不得了.6.求有向图中任意一对顶点之间最短路径的弗洛伊德算法(allcosts-Floyd)中,要求有向图满足什么前提条件?二:在二叉树的结点结构中增加一个域:leftsize,t^.leftsize表示t结点的左子树中结点的总个数,试编写算法alloc(k),在二叉树中查找中序序号为k 的结点,要求时间复杂度为O(log2(n)).三:编写算法输出从n个自然数中取k个(k<=n)的所有组合.例如,当n=5,k=3时,你的算法应该输出:543,542,541,532,531,521,432,431,421,321.四:设有向图G用邻接表的方式存储,u,v是G中的任意两个结点,写一算法,求出G中从u到v的所有简单路径.五:下面是一改进了的快速排序算法,试补充其中的空白语句,并分析该算法所需的最大递归空间是多少?procedure qsort1(var list:afile;m,n:integer);(设list[m].key<list[n+1].key)var i,j,k:integer;beginwhile m<n dobegini:=m;j:=n+1;k:=list[m].key;repeatrepeat i:=i+1 until list[i].key>=k;repeat j:=j-1 until list[j].key<=k;if i<j then interchange(list[i],list[j]);until i>=j;interchange(list[m],list[j]);if n-j>=j-mthen begin qsort1(list,m,___);______;endelse begin qsort1(list,___,n);______;end end;(of while)end;六:给定n*m矩阵A[a..b,c..d],并设A[i,j]<=A[i,j+1](a<=i<=b,c<=j<=d-1)和A[i,j]<=A[i+1,j](a<=i<=b-1,c<=j<=d),设计一算法以O(n+m)的时间复杂度判定值x是否在A中.。

数据结构简答题和论述题

数据结构简答题和论述题

数据结构简答题和论述题1、试描述数据结构和抽象数据类型的概念与程序设计语⾔中数据类型概念的区别。

【解答】数据结构是指相互之间存在⼀定关系的数据元素的集合。

⽽抽象数据类型是指⼀个数据结构以及定义在该结构上的⼀组操作。

程序设计语⾔中的数据类型是⼀个值的集合和定义在这个值集上⼀组操作的总称。

抽象数据类型可以看成是对数据类型的⼀种抽象。

串:是零个或多个字符组成的有限序列。

串是⼀种特殊的线性表,它的每个结点仅由⼀个字符组成。

空串 :长度为零的串,它不包含任何字符。

空⽩串 :仅由⼀个或多个空格组成的串⼦串 :串中任意个连续字符组成的⼦序列称为该串的⼦串。

串变量和串常量通常在程序中使⽤的串可分为:串变量和串常量。

(1)串变量 :串变量和其它类型的变量⼀样,其取值是可以改变的。

(2)串常量 :串常量和整常数、实常数⼀样,在程序中只能被引⽤但不能改变其值。

即只能读不能写。

(1)树形图表⽰: 树形图表⽰是树结构的主要表⽰⽅法。

(2)树的其他表⽰法① 嵌套集合表⽰法:是⽤集合的包含关系来描述树结构。

② 凹⼊表表⽰法:类似于书的⽬录③ ⼴义表表⽰法:⽤⼴义表的形式表⽰的。

上图 (a)树的⼴义表表⽰法如下:(A(B(E,F(I,J)), C,D(G,H)))1.中序遍历的递归算法定义:若⼆叉树⾮空,则依次执⾏如下操作:(1)遍历左⼦树; (2)访问根结点; (3)遍历右⼦树。

2.先序遍历的递归算法定义:若⼆叉树⾮空,则依次执⾏如下操作:(1) 访问根结点; (2) 遍历左⼦树; (3) 遍历右⼦树。

3.后序遍历得递归算法定义:若⼆叉树⾮空,则依次执⾏如下操作:(1)遍历左⼦树; (2)遍历右⼦树; (3)访问根结点。

2、链表具有的特点是B 插⼊、删除不需要移动元素C 不必事先估计存储空间D 所需空间与线性表长度成正⽐顺序队列(1)队列的顺序存储结构称为顺序队列,顺序队列实际上是运算受限的顺序表。

(2) 顺序队列的表⽰①和顺序表⼀样顺序队列⽤⼀个向量空间存放当前队列中的元素。

第三章栈和队列习题-数据结构

第三章栈和队列习题-数据结构

第三章栈和队列习题-数据结构习题三栈和队列一单项选择题1.在作进栈运算时,应先判别栈是否(①),在作退栈运算时应先判别栈是否(②)。

当栈中元素为n个,作进栈运算时发生上溢,则说明该栈的最大容量为(③)。

①,②:A.空B.满C.上溢D.下溢③:A.n-1B.nC.n+1D.n/22.若已知一个栈的进栈序列是1,2,3,,n,其输出序列为p1,p2,p3,...,pn,若p1=3,则p2为()。

A可能是2B一定是2C可能是1D一定是13.有六个元素6,5,4,3,2,1的顺序进栈,问下列哪一个不是合法的出栈序列?()A.543612B.453126C.346521D.2341564.设有一顺序栈S,元素1,2,3,4,5,6依次进栈,如果6个元素出栈的顺序是2,3,4,6,5,1,则栈的容量至少应该是()A.2B.3C.5D.65.若栈采用顺序存储方式存储,现两栈共享空间V[1..m],top[i]代表第i个栈(i=1,2)栈顶,栈1的底在v[1],栈2的底在V[m],则栈满的条件是()。

A.|top[2]-top[1]|=0B.top[1]+1=top[2]C.top[1]+top[2]=mD.top[1]=top[2]6.执行完下列语句段后,i值为:()intf(int某){return((某>0)某某f(某-1):2);}inti;i=f(f(1));A.2B.4C.8D.无限递归7.表达式3某2^(4+2某2-6某3)-5求值过程中当扫描到6时,对象栈和算符栈为(),其中^为乘幂A.3,2,4,1,1;(某^(+某-B.3,2,8;(某^-C.3,2,4,2,2;(某^(-D.3,2,8;(某^(-8.用链接方式存储的队列,在进行删除运算时()。

A.仅修改头指针B.仅修改尾指针C.头、尾指针都要修改D.头、尾指针可能都要修改9.递归过程或函数调用时,处理参数及返回地址,要用一种称为()的数据结构。

数据结构第三章考试题库(含答案)

数据结构第三章考试题库(含答案)

第3章栈和队列一选择题1. 对于栈操作数据的原则是()。

【青岛大学2001 五、2(2分)】A. 先进先出B. 后进先出C. 后进后出D. 不分顺序2. 在作进栈运算时,应先判别栈是否( ①),在作退栈运算时应先判别栈是否( ②)。

当栈中元素为n个,作进栈运算时发生上溢,则说明该栈的最大容量为( ③)。

为了增加内存空间的利用率和减少溢出的可能性,由两个栈共享一片连续的内存空间时,应将两栈的( ④)分别设在这片内存空间的两端,这样,当( ⑤)时,才产生上溢。

①, ②: A. 空 B. 满 C. 上溢 D. 下溢③: A. n-1 B. n C. n+1 D. n/2④: A. 长度 B. 深度 C. 栈顶 D. 栈底⑤: A. 两个栈的栈顶同时到达栈空间的中心点.B. 其中一个栈的栈顶到达栈空间的中心点.C. 两个栈的栈顶在栈空间的某一位置相遇.D. 两个栈均不空,且一个栈的栈顶到达另一个栈的栈底.【上海海运学院1997 二、1(5分)】【上海海运学院1999 二、1(5分)】3. 一个栈的输入序列为123…n,若输出序列的第一个元素是n,输出第i(1<=i<=n)个元素是()。

A. 不确定B. n-i+1C. iD. n-i【中山大学1999 一、9(1分)】4. 若一个栈的输入序列为1,2,3,…,n,输出序列的第一个元素是i,则第j个输出元素是()。

A. i-j-1B. i-jC. j-i+1D. 不确定的【武汉大学2000 二、3】5. 若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,p N,若p N是n,则p i是( )。

A. iB. n-iC. n-i+1D. 不确定【南京理工大学2001 一、1(1.5分)】6. 有六个元素6,5,4,3,2,1 的顺序进栈,问下列哪一个不是合法的出栈序列?()A. 5 4 3 6 1 2B. 4 5 3 1 2 6C. 3 4 6 5 2 1D. 2 34 15 6【北方交通大学2001 一、3(2分)】7. 设栈的输入序列是1,2,3,4,则()不可能是其出栈序列。

用两个栈模拟一个队列,并实现判断栈空.栈满以及入队和出队操作

用两个栈模拟一个队列,并实现判断栈空.栈满以及入队和出队操作
4、测试数据:
操作选项 输入a;
入队元素个数:3
1 2 3
操作选项 输入b;
出队元素个数:2
操作选项 输入a;
入队元素个数 12
11 12 13 14 15 16 17 18 19 20 21 22

(1)抽象数据类型定义:
定义两个链表:
typedef struct
{
int data[Maxsize];
s1.top++;
s1.data[s1.top]=x;
}
else
{
s1.top++;
s1.data[s1.top]=x;
}
}
(3)出队函数
void pop(seqstack &s2)
{
int x;
if(s2.top==-1)
{
while(s1.top!=-1)
}
else {
}

1.程序使用说明;
(1)本程序的运行环境为VC6.0。
(2)进入演示程序后即显示提示信息:
"执行进队操作请输入a;
执行出队操作请输入b;
停止操作请输入c;
2、测试结果与分析;
操作选项: 输入a;
入队元素个数:3
1 2 3
共入队3个元素;
操作选项 输入b;
出队元素个数:2
1 2
共出队2个元素;
操作选项 输入a;
入队元素个数 12
11 12 13 14 15 16 17 18 19 20 21 22
if(w=='a')
{
cout<<"请输入入队元素个数"<<endl;

两个栈模拟一个队列

两个栈模拟一个队列

《数据结构》实验报告班级:JS001001 姓名:周卫华学号:2010300028 E-mail:770234417@◎实验题目: 用两个栈模拟一个队列的功能◎实验目的:1.掌握使用visual c++6.0上机调试程序的基本方法。

2.掌握栈和队列的顺序存储结构,以便在实际背景下灵活应用。

3.掌握栈和队列的特点,即先进后出与先进先出的原则。

4.掌握栈和队列的基本操作实现方法。

◎实验内容:利用两个栈模拟队列的功能,其中一个栈用来模拟入队,另外一个栈用来模拟出队。

同时判断队空,队满和队列的初始化操作。

一、需求分析本实验需要编程一个程序来达到这样的目的:在程序中定义两个顺序栈来模拟队列的功能。

其中一个顺序栈用来模拟队列的入队操作,另外一个栈用来模拟队列的出队操作。

操作过程中可以动态的将若干个元素入队和若干个元素的出队,在元素入队和出队操作过程中伴随有判断队空和队满操作。

(1)输入的形式和输入值的范围:该程序以键盘的形式进行输入,输入的种类有以下几种:对操作种类的选择,例如入队,出队,退出;入队元素的个数和数值;出队元素的个数和数值;输入值为整型类型。

(2)输出的形式:出队元素;队空或者队满显示。

(3)程序所能达到的功能:实现两个栈模拟队列的功能;显示入队和出队情况;判断对空或者队满。

(4)测试数据:本实验中我们定义该队列的长度为6。

从截图中可以看出该程序实现了基本的入队出队操作和判断队空队满操作。

二概要设计1.抽象数据类型:typedef struct //定义栈的类型{int data[MAXSIZE];int top;}seqStack;2.主程序流程:由以上分析,实现队列的模拟程序主要包括三个模块:选择模块、入队、出队。

选择模块主要显示选择菜单,以提供入队、出队和结束程序三种操作。

设计界面如下:请选择操作: 1.入队 2.出队 3.结束入队模块将输入的元素压入栈1,也包括对栈满的判断。

函数中会调用入栈、出栈函数。

数据结构与算法试卷及答案8

数据结构与算法试卷及答案8

广州大学学年第学期考试卷课程数据结构与算法考试形式(闭卷,考试)信息学院系专业级班学号:姓名:一、填空题:(每格2分,共20分)1.以{5,6,8,10,15}作为叶子结点的权值所构造的哈夫曼树的带权路径长度是。

2.判断一个无向图是一棵树的条件是。

3.设n0为哈夫曼树的叶子结点数目,则该哈夫曼树共有个结点。

4.一个无序序列可以通过构造一棵树而变成一个有序序列,构造树的过程即为对无序序列进行排序的过程。

5.如果结点A有 3个兄弟,而且B是A的双亲,则B的度是。

6.设有向图有n个顶点和e条边,进行拓扑排序时,总的时间复杂度为7.在排序算法中,每次从未排序的记录中挑出最小(或最大)关键码字的记录,加入到已排序记录的恰当位置,该排序方法叫。

8.用一维数组存放的一棵完全二叉树;ABCDEFGHIJKL。

后序遍历该二叉树的访问结点序列是。

9.设散列函数H(k)=K mod 7,散列表的地址空间为0—6,则关键字为32的元素在哈希表中的下标为。

10.一棵非空二叉树的先序序列和后序序列正好相反,则树的形状是。

二、单项选择题(每题1分,共10分)1.()设一个栈的输入序列是1,2,3,4,5 则下列序列中,是栈的合法输出序列的是:A. 5 1 2 3 4B. 4 5 1 3 2C. 4 3 1 2 5D. 3 2 1 5 42.()在图采用邻接表存储时,求最小生成树的prim 算法的时间复杂度为A. O(n)B. O(n+e)C. O(n2)D. O(n3)3.()下列排序算法中,哪种算法不能保证每趟排序至少能将一个元素放到其最终的位置上?A.快速排序B. shell排序C. 堆排序D. 冒泡排序4.()一棵非空的二叉排序树在先序线索化后,其中值为空的链域的个数是:A.不确定B. 0C. 1D. 25()对于线性表最常用的操作是查找指定序号的元素和在末尾插入元素,则选择哪种最节省时间?A.顺序表 B. 单链表C带头接点的双循环链表D带尾接点的单循环链表6()求解最短路径的Floyd算发的时间复杂度为:A.O(n) B. O(n+c) C. O(n2) D. O(n3)7()数据序列(8,9,10,4,5,6,20,1,2)只能是下列排序算发中哪种算法的两趟排序后的结果?A.选择排序 B 冒泡排序 C 插入排序 D 堆排序8()下列序列中,哪个是堆?A.(100,80,55,60,50,40,58,35,20)B.(100,80,55,60,50,40,35,58,20)C.(100,80,55,58,50,40,60,35,20)D.(100,70,55,60,50,40,58,35,20)9()一棵左子树为空的二叉树在先序线索化后,其中空的链域的个数是:A.不确定 B 0 C 1 D 210()算术表达式A+B*(C+D/E)转为后缀表达式后为:A:AB+CDE/*B:ABCDE/+*+C:ABCDE/*++D:ABCDE*/++三、判断题(在括号内填上“√”或“╳”,每题1分,共10分,做错不倒扣)1.()线性表的特点是每个元素都有一个前驱和一个后继。

计算机专业基础综合(数据结构)模拟试卷2

计算机专业基础综合(数据结构)模拟试卷2

计算机专业基础综合(数据结构)模拟试卷2(总分:70.00,做题时间:90分钟)一、单项选择题(总题数:21,分数:42.00)1.单项选择题1-40小题。

下列每题给出的四个选项中,只有一个选项是最符合题目要求的。

(分数:2.00)__________________________________________________________________________________________ 解析:2.栈和队列的主要区别在于( )。

(分数:2.00)A.它们的逻辑结构不一样B.它们的存储结构不一样C.所包含的运算不一样D.插入和删除运算的限定不一样√解析:解析:栈和队列的逻辑结构都是线性的,都有顺序存储和链式存储,有可能包含的运算不一样,但不是其主要区别。

任何数据结构在针对具体问题时所包含的运算都可能不同。

所以正确答案是D。

3.若循环队列以数组Q[0..m-1]作为其存储结构,变量rear。

表示循环队列中的队尾元素的实际位置,其移动按rear=(rear+1)MOD m进行,变量length表示当前循环队列中的元素个数,则循环队列的队首元素的实际位置是( )。

(分数:2.00)A.rear-lengthB.(rear—length+m)MOD mC.(rear—length+1+m)MOD m √D.m-length解析:解析:按照循环队列的定义,因为元素移动按照rect=(rear+1)MOD m进行,则当数组Q[m—1]存放了元素之后,下一个入队的元素将存放到Q[0]中,因此队列的首元素的实际位置是(rear—length+1+m)MOD m。

4.一个以向量V[n]存储的栈,其初始栈顶指针top为n+1,则对于x,其正确的进栈操作是( )。

(分数:2.00)A.top=top+1;V[top]=xB.V[top]=x;top=top+1C.top=top-1;V[top]=x √D.V[top]=x;top=top-1解析:解析:此题考查的知识点是入栈的具体操作。

数据结构用两个栈模拟队列的操作

数据结构用两个栈模拟队列的操作

《数据结构》实验报告◎实验题目:用两个栈模拟队列的操作。

◎实验目的:1、掌握使用Visual C++6.0上机调试程序的基本方法;2、掌握栈与队列中的基本操作并学会灵活运用;3、提高自己分析问题和解决问题的能力,在实践中理解教材上的理论。

◎实验内容:通过两个栈s1和s2模拟队列的进队操作,出队操作,对队满和队空的判断,遍历输出队列中的所有数据。

一、需求分析1、输入的形式和输入值的范围:根据提示,输入序号以选择要进行的操作(进队、出队、结束),进行进队或出队前,需输入进队或出队数据的个数,再输入相应个数的数据。

2、输出的形式:在进队的数据输入完毕后后,输出已经进入队列的所有数据,若队已满存在未进入队列的数据,则输出相应的队满的提示;在输入出队数据的个数完成后,则输出要出队的所有数据,若队列中的数据个数小于操作者想要输出的数据个数,则提示队空,然后再输出出队后队列中的所有数据。

3、程序所能达到的功能:根据提示进行操作,模拟进队,出队,判断队满和队空,以及输出队列中的所有数据。

4、测试数据:请选择要进行的操作(1.进队 2.出队 3.结束):1请输入进队数据个数:14输入数据:1 2 3 4 5 6 7 8 9 10 11 12 13 14队已满,11未进入队列队已满,12未进入队列队已满,13未进入队列队已满,14未进入队列此时队列中的数据依次为:1 2 3 4 5 6 7 8 9 10请选择要进行的操作(1.进队 2.出队 3.结束):2请输入出队数据个数:3出队的数据为:1 2 3此时队列中的数据依次为:4 5 6 7 8 9 10请选择要进行的操作(1.进队 2.出队 3.结束):2请输入出队数据个数:10出队的数据为:4 5 6 7 8 9 10 队空!此时队列中已没有数据请选择要进行的操作(1.进队 2.出队 3.结束):3谢谢你的使用二概要设计(一)栈按照“后进先出”的顺序进行操作,队列按照“先进后出”的顺序进行操作,所以本题中利用两个顺序栈s1和s2模拟队列的操作。

数据结构与算法第3章课后答案

数据结构与算法第3章课后答案

第 3 章特殊线性表——栈、队列和串(2005-07-14) -第 3 章特殊线性表——栈、队列和串课后习题讲解1. 填空⑴设有一个空栈,栈顶指针为1000H,现有输入序列为1、2、3、4、5,经过push,push,pop,push,pop,push,push后,输出序列是(),栈顶指针为()。

【解答】23,1003H⑵栈通常采用的两种存储结构是();其判定栈空的条件分别是(),判定栈满的条件分别是()。

【解答】顺序存储结构和链接存储结构(或顺序栈和链栈),栈顶指针top= -1和top=NULL,栈顶指针top等于数组的长度和内存无可用空间⑶()可作为实现递归函数调用的一种数据结构。

【解答】栈【分析】递归函数的调用和返回正好符合后进先出性。

⑷表达式a*(b+c)-d的后缀表达式是()。

【解答】abc+*d-【分析】将中缀表达式变为后缀表达式有一个技巧:将操作数依次写下来,再将算符插在它的两个操作数的后面。

⑸栈和队列是两种特殊的线性表,栈的操作特性是(),队列的操作特性是(),栈和队列的主要区别在于()。

【解答】后进先出,先进先出,对插入和删除操作限定的位置不同⑹循环队列的引入是为了克服()。

【解答】假溢出⑺数组Q[n]用来表示一个循环队列,front为队头元素的前一个位置,rear为队尾元素的位置,计算队列中元素个数的公式为()。

page: 2The Home of jetmambo - 第 3 章特殊线性表——栈、队列和串【解答】(rear-front+n)% n【分析】也可以是(rear-front)% n,但rear-front的结果可能是负整数,而对一个负整数求模,其结果在不同的编译器环境下可能会有所不同。

⑻用循环链表表示的队列长度为n,若只设头指针,则出队和入队的时间复杂度分别是()和()。

【解答】O(1),O(n)【分析】在带头指针的循环链表中,出队即是删除开始结点,这只需修改相应指针;入队即是在终端结点的后面插入一个结点,这需要从头指针开始查找终端结点的地址。

两个栈实现一个队列

两个栈实现一个队列

入队列时: 如果s1为空,把s2中所有的元素倒出压到s1中 否则直接压入s1 出队列时:

如果s2不为空,把s2中的栈顶元素直接弹出
否则,把s1的所有元素全部弹出压入s2中,再弹出s2的栈顶元素
思路2
思路1无条件时较思路1简单
可不可以不要这么麻烦呢?
使用两个栈实现一个队列
第二组分享
思路一:

我们设定s1是入栈的,s2是出栈的。
入队列,直接压到s1即可 出队列,先把s1中的元素倒入到s2中,弹出s2中的栈顶元素;
再把s2的剩余元素全部倒回s1中。
思路1
缺点:
每次只要出栈一个元素就要将元素倒来倒去,麻烦!!!
思路2
我们设定s1是入栈的,s2是出栈的。保证所有元素都在一个栈里面
思路3
我们设定s1是入栈的,s2是出栈的

入队列:直接压入元素至s1即可

出队列:如果s2不为空,把s2中的栈顶元素直接弹出 否则,把s1的所有元素全部弹出压入s2中,再弹出s2的栈顶元素
思路3
相比于方法2,入队直接压入即可~
代码实现(1个细节)

算法与数据结构C语言版课后习题答案(机械工业出版社)第3,4章习题参考答案

算法与数据结构C语言版课后习题答案(机械工业出版社)第3,4章习题参考答案

算法与数据结构C语⾔版课后习题答案(机械⼯业出版社)第3,4章习题参考答案第3章栈和队列⼀、基础知识题3.1有五个数依次进栈:1,2,3,4,5。

在各种出栈的序列中,以3,4先出的序列有哪⼏个。

(3在4之前出栈)。

【解答】34215 ,34251,345213.2铁路进⾏列车调度时,常把站台设计成栈式结构,若进站的六辆列车顺序为:1,2,3,4,5,6,那么是否能够得到435612, 325641, 154623和135426的出站序列,如果不能,说明为什么不能;如果能,说明如何得到(即写出"进栈"或"出栈"的序列)。

【解答】输⼊序列为123456,不能得出435612和154623。

不能得到435612的理由是,输出序列最后两元素是12,前⾯4个元素(4356)得到后,栈中元素剩12,且2在栈顶,不可能让栈底元素1在栈顶元素2之前出栈。

不能得到154623的理由类似,当栈中元素只剩23,且3在栈顶,2不可能先于3出栈。

得到325641的过程如下:1 2 3顺序⼊栈,32出栈,得到部分输出序列32;然后45⼊栈,5出栈,部分输出序列变为325;接着6⼊栈并退栈,部分输出序列变为3256;最后41退栈,得最终结果325641。

得到135426的过程如下:1⼊栈并出栈,得到部分输出序列1;然后2和3⼊栈,3出栈,部分输出序列变为13;接着4和5⼊栈,5,4和2依次出栈,部分输出序列变为13542;最后6⼊栈并退栈,得最终结果135426。

3.3若⽤⼀个⼤⼩为6的数组来实现循环队列,且当前rear和front的值分别为0和3,当从队列中删除⼀个元素,再加⼊两个元素后,rear和front的值分别为多少?【解答】2和43.4设栈S和队列Q的初始状态为空,元素e1,e2,e3,e4,e5和e6依次通过栈S,⼀个元素出栈后即进队列Q,若6个元素出队的序列是e3,e5,e4,e6,e2,e1,则栈S的容量⾄少应该是多少?【解答】43.5循环队列的优点是什么,如何判断“空”和“满”。

东北林业大学数据结构(A)2005-2006答案

东北林业大学数据结构(A)2005-2006答案

东北林业大学2005-2006学年第二学期考试试题考试科目:数据结构(A)评分标准及参考答案一、单项选择题(在每个小题四个备选答案中选出一个正确答案,填在题末的括号中)(本大题共10小题,每小题1.5分,总计10分)(选对1个题给1.5分,选错1个题不给分)1、从逻辑上可以把数据结构分为()两大类。

A.动态结构、静态结构 B.顺序结构、链式结构C.线性结构、非线性结构 D.初等结构、构造型结构答案(C)2、若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用()存储方式最节省时间。

A.顺序表 B.双链表 C.带头结点的双循环链表 D.单循环链表答案( A )3、循环队列A[0..m-1]存放其元素值,用front和rear分别表示队头和队尾,则当前队列中的元素数是( )。

A.(rear-front+m)%mB. rear-front+1C. rear-front-1D. rear-front答案( A )4、串的长度是指()A.串中所含不同字母的个数 B.串中所含字符的个数C.串中所含不同字符的个数 D.串中所含非空格字符的个数答案( B)5、设广义表L=((a,b,c)),则L的长度和深度分别为()。

A. 1和1B. 1和3C. 1和2D. 2和3答案(C)6、二叉树的先序遍历和中序遍历如下:先序遍历:EFHIGJK;中序遍历: HFIEJKG 。

该二叉树根的右子树的根是:( )A. EB. FC. GD. H答案( C )7、深度为h的满m叉树的第k层有()个结点。

(1=<k=<h)A.m k-1 B.m k-1 C.m h-1 D.m h-1答案(A)8、关键路径是事件结点网络中()。

A.从源点到汇点的最长路径 B.从源点到汇点的最短路径C.最长回路 D.最短回路答案(A)9、散列文件使用散列函数将记录的关键字值计算转化为记录的存放地址,因为散列函数是一对一的关系,则选择好的()方法是散列文件的关键。

本题15分请利用两个栈S1和S2来模拟一个队列。已

本题15分请利用两个栈S1和S2来模拟一个队列。已

厦门大学《—数据结构—》课程期末试卷信息科学与技术学院计算机科学系2005年级 ________ 专业主考教师:_________ 试卷类型: (A卷/B卷)一、(本题15分)请利用两个栈S1和S2来模拟一个队列。

已知栈的三个运算定义如下:Push(Stack ST,int x): 元素x 入ST栈;Pop(Stack ST,int x) : ST栈顶元素出栈,赋给变量x;StackEmpty(Stack ST):判ST栈是否为空。

那么如何利用栈的运算来实现该队列的三个运算:EnQueue 插入一个元素入队列;DeQueue:删除一个元素出队列;QueueEmpty判队列为空。

解:利用两个栈S1、S2模拟一个队列(如客户队列)时,当需要向队列中输入元素时,用S1来存放输入元素,用push运算实现。

当需要从队列中输出元素时,到栈S2中去取,如果S2为空,则将S1中的元素全部送入到S2中,然后再从S2中输出元素。

判断队空的条件是:S1和S2同时为空。

Status En Queue(DataType x){if StackFull(S1){ //S1 栈满if StackEmpty(S2){ // S1 栈满,S2 栈空while (!StackEmpty(S1)){ Pop(S1, y); Push(S2, y); /栈S1 的内容反向搬到栈S2 Push(S1, x);return OK;}else //S1栈满,S2栈非空,则不可进行插入操作return ERROR;}else{ //S1栈不满,则直接进栈Push(S1, x); return OK;}}Status DeQueue(DataType &x){if !StackEmpty(S2) {Pop(S2, x);return OK;}else{if !StackEmpty(S1){while (!StackEmpty(S1)){ Pop(S1, y); Push(S2, y);} //栈S1 的内容反向搬到栈S2 Pop(S2, x);return OK;}else //栈S1和S2都为空return ERROR;二、(本题15分)用孩子兄弟链表作为树的存储结构,设计算法求出树的深度。

数据结构简答题汇总

数据结构简答题汇总

数据结构简答题1.简述逻辑结构与存储结构的联系和区别。

答:联系:数据的逻辑结构与存储结构是密不可分的两个方面, 一个算法的设计取决于所选定的逻辑结构, 而算法的实现依赖于所采用的存储结构在数据结构中, 逻辑结构与计算机无关, 存储结构是数据元素之间的逻辑关系在计算机中的表示。

存储结构不仅将逻辑结构中所有数据元素存储到计算机内存中, 而且还要在内存中存储各数据元素间的逻辑关系。

通常情况下, 一种逻辑结构可以有多种存储结构, 例如, 线性结构可以采用顺序存储结构或链式存储结构表示。

2.简述顺序表和链表存储方式的特点。

答:顺序表的优点是可以随机存取元素, 存储密度高;缺点是不便于插入和删除元素(需要移动大量的元素)。

链表的优点是便于节点的插入和删除(只需要修改指针域, 不需要移动节点) ;缺点是不能进行随机访问, 只能顺序访问, 另外, 每个节点上增加指针域, 导致存储密度较低。

3.头指针和头结点的区别答:头指针是指在第一个结点之前的指针, 它是一个链表存在的标志, 是必须存在必不可少的。

头结点是第一个结点之前的结点, 它是为了方面在第一个结点之前进行元素的插入和删除操作, 它不是必须的, 并且数据域也可以不存放信息。

4.栈和队列的区别答:栈是只能在一端进行插入和删除的线性表, 插入和删除都在栈顶进行, 它的特点是“先进后出”。

常用于括号的匹配问题, 递归问题, 但是递归问题要注意堆栈的溢出现象队列是在一端插入在另一端删除的线性表, 插入的那端是队尾, 删除的那端是队首, 特点是“先进先出”, 在层次遍历和 BFS 算法、迪杰斯特拉算法中使用到5.解释带头结点的单链表和不带头结点的单链表的区别。

答:带头结点的单链表和不带头结点的单链表的区别主要体现在其结构上和算法操作上。

在结构上, 带头结点的单链表, 不管链表是否为空, 均含有一个头结点, 不带头结点的单链表不含头结点。

在操作上, 带头结点的单链表的初始化为申请一个头结点。

数据结构课程设计分类题目 (1)

数据结构课程设计分类题目 (1)
15、设有一个正整数序列组成的有序单链表(按递增次序有序,且允许有相等的整数存在),试编写能实现下列功能的算法 :(要求用最少的时间和最小的空间)
(1)确定在序列中比正整数x大的数有几个(相同的数只计算一次,如序列{20,20,17,16,15,15,11,10,8,7,7,5,4}中比10大的数有5个);
13、设有一个由正整数组成的无序单链表,编写完成下列功能的算法:
(1)找出最小值结点,且打印该数值;
(2)若该数值是奇数,则将其与直接后继结点的数值交换;
(3)若该数值是偶数,则将其直接后继结点删除。
14、在一个递增有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法去掉数值相同的元素,使表中不再有重复的元素。例如:(7,10,10,21,30,42,42,42,51,70)将变作(7,10,21,30,42,51,70)。
printf(sum);}
树和二叉树
1、二叉树用二叉链表存储,写一个算法将二叉树中的叶子结点按从右至左的顺序建立一个单链表。
2、知二叉树用二叉链表存储,写出求二叉树宽度的算法。所谓宽度是指在二叉树的各层上,具有结点数最多的那一层上的结点总数。
3、叉树用二叉链表存储,写一个算法交换各结点的左右子树。
4、二叉树用二叉链表存储,若结点的左孩子的数据域的值大于右孩子数据域的值,则交换其左右子树。
19、试设计一个算法打印出由根结点出发到达叶结点的所有路径。
20、试写出算法,求任意二叉树中第一条最长的路径长度,并输出此路径上各结点的值。
21、给定一组项及其权值,假定项都存放于二叉树的树叶结点,则具有最小带权外部路径长度的树称为huffman 树。编写构造huffman 树 的算法。
22、已知一中序线索二叉树,写一算法完成对它的中序扫描。

7-22堆栈模拟队列(25分)

7-22堆栈模拟队列(25分)

7-22堆栈模拟队列(25分)设已知有两个堆栈S1和S2,请⽤这两个堆栈模拟出⼀个队列Q。

所谓⽤堆栈模拟队列,实际上就是通过调⽤堆栈的下列操作函数:int IsFull(Stack S):判断堆栈S是否已满,返回1或0;int IsEmpty (Stack S ):判断堆栈S是否为空,返回1或0;void Push(Stack S, ElementType item ):将元素item压⼊堆栈S;ElementType Pop(Stack S ):删除并返回S的栈顶元素。

实现队列的操作,即⼊队void AddQ(ElementType item)和出队ElementType DeleteQ()。

输⼊格式:输⼊⾸先给出两个正整数N1和N2,表⽰堆栈S1和S2的最⼤容量。

随后给出⼀系列的队列操作:A item表⽰将item⼊列(这⾥假设item为整型数字);D表⽰出队操作;T表⽰输⼊结束。

输出格式:对输⼊中的每个D操作,输出相应出队的数字,或者错误信息ERROR:Empty。

如果⼊队操作⽆法执⾏,也需要输出ERROR:Full。

每个输出占1⾏。

输⼊样例:3 2A 1 A 2 A 3 A 4 A 5 D A 6 D A 7 D A 8 D D D D T输出样例:ERROR:Full1ERROR:Full23478ERROR:Empty⾸先保证栈1是空间⼩的那个栈,栈2是空间⼤的那个栈,⼊队操作实际就是往栈1压栈,出队就是从栈2弹栈,队满的情况包括栈1满且栈2不空,哪怕栈2只有⼀个元素,可以仔细捋捋为什么。

队空包括两代码:#include <cstdio>#include <iostream>using namespace std;int n1,n2,d;char s[2];int s1[1000],s2[1000],c1,c2;int main() {scanf("%d%d",&n1,&n2);if(n1 > n2) swap(n1,n2);while(scanf("%s",s) && s[0] != 'T') {if(s[0] == 'A') {scanf("%d",&d);if(c1 == n1) {printf("ERROR:Full\n");}else s1[c1 ++] = d;}else {if(c2) printf("%d\n",s2[-- c2]);else if(c1) {while(c1) s2[c2 ++] = s1[-- c1];printf("%d\n",s2[-- c2]);}else printf("ERROR:Empty\n");}if(!c2 && c1 == n1) {while(c1) s2[c2 ++] = s1[-- c1];}}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

厦门大学《_数据结构_》课程期末试卷
信息科学与技术学院计算机科学系2005年级___专业
主考教师:____试卷类型:(A卷/B卷)
一、(本题15分)请利用两个栈S1和S2来模拟一个队列。

已知栈的三个运算定义如下:Push(Stack ST,int x):元素x入ST栈;Pop(Stack ST,int x):ST栈顶元素出栈,赋给变量x;StackEmpty(Stack ST):判ST栈是否为空。

那么如何利用栈的运算来实现该队列的三个运算:EnQueue:插入一个元素入队列; DeQueue:删除一个元素出队列;QueueEmpty:判队列为空。

解:利用两个栈S1、S2模拟一个队列(如客户队列)时,当需要向队列中输入元素时,用S1来存放输入元素,用push运算实现。

当需要从队列中输出元素时,到栈S2中去取,如果S2为空,则将S1中的元素全部送入到S2中,然后再从S2中输出元素。

判断队空的条件是:S1和S2同时为空。

Status EnQueue(DataType x)
{
if StackFull(S1){ //S1栈满
if StackEmpty(S2){ // S1栈满,S2栈空
while (!StackEmpty(S1)){ Pop(S1, y); Push(S2, y); //栈S1的内容反向搬到栈S2
Push(S1, x); return OK;
}
else //S1栈满,S2栈非空,则不可进行插入操作
return ERROR;
}
else{//S1栈不满,则直接进栈
Push(S1, x);
return OK;
}
}
Status DeQueue(DataType &x)
{
if !StackEmpty(S2) {
Pop(S2, x);return OK;
}
else{
if !StackEmpty(S1){
while (!StackEmpty(S1)){ Pop(S1, y); Push(S2, y);} //栈S1的内容反向搬到栈S2
Pop(S2, x); return OK;
}
else //栈S1和S2都为空
return ERROR;
}
}
二、(本题15分)用孩子兄弟链表作为树的存储结构,设计算法求出树的深度。

解:算法思路:一棵树的深度可以递归定义为:若树为空,则深度为0,否则树的深度为根结点的所有子树深度的最大值加1。

数据结构为:
typedef struct CSNode{
ElemType data;
struct CSNode *firstchild, * nextsibling;
} CSNode, *CSTree;
算法如下:
int depth(CSNode * t)
{
CSNode *p; int m, d;
if (t==NULL) return 0;
p=t→firstchild; m=0;
while (p) {
d=depth(p);
if (d>m) m=d;
p=p→nextsibling;
}
return m+1;
}
三、(本题15分)已知在某并发处理系统的Petri网基础上建立的可达图如下图所示。

图中每个顶点表示系统运行中的一种状态,有向边(弧)表示事件(用t表示),例如有向边(V i,V j)表示系统在状态V i时出现该事件将引发系统由状态V i到状态V j。

(1)请分别给出该可达图的邻接表、邻接矩阵以及邻接矩阵的三元组3种存储表示的形式说明和存储结果示意图,要求每种存储结构能够表达出该可达图的全部信息,并分别对这三种形式中每个部分的含义予以简要说明。

(2)若假设每个域(包括指针域)的长度为2个字节,请分别计算出这三种结构所占用的空间大小。

四、(本题15分)设计一个算法,判断无向图G(图中有n个顶点)是否是一棵树。

解:算法思路:从第v个顶点出发,对图进行深度优先搜索。

若在算法结束之前,又访问了某一已访问过的顶点,则图G中必定存在环,G不是一棵以v为根的树。

若在算法结束之后,所访问的顶点数小于图的顶点个数n,则图G不是连通图,G也不是一棵以v为根的树。

Boolean visited[MAX] ; //用于标识结点是否已被访问过
Status ( * VisitFunc) (int v); //函数变量
void DFSTraverse( Graph G, Status ( * VisitFunc) (int v));
{ VisitFunc = Visit;
for ( v=0; v <G.vexnum; ++v ) visited[v] = false;
if (DFS(G, v )==FALSE) return FALSE;
for ( v=0; v <G.vexnum; ++v )
if (visited[v] == false) return FALSE;
return OK;
}
Status DFS( Graph G, int v );
{ Visited[v] = true; VisitFunc(v);
for ( w = FirstAdjVex(G, v) ; w ; w = NextAdjVex(G, v, w) )
if (Visited[w]) return FALSE;
else DFS(G, w );
return OK;
}
五、(本题15分)
(1)设有3阶B-树,如下图所示,分别画出在该树插入关键字20和在原树删除关键字150得到的B-树。

(2)包括n个关键字的m阶B-树最大深度是多少?(要求写出推导过程)
解:(1)插入20后的B-树为:
删除150后的B -树为:
(2)根据B-树的定义,第一层至少有1个结点;第二层至少有2个结点;由于除根之外的每个非终端结点至少有⎡⎤2/m 棵子树,则第三层至少有2⎡⎤2/m 个结点;……;依次类推,第L+1层至少有2(⎡⎤2/m )t-1个结点。

而L+1层的结点为叶子结点。

若m 阶B-树种具有n 个关键字,则叶子结点即查找不成功的结点为n+1,由此有:
N+1>=2(⎡⎤2/m )t-1
反之,⎡⎤1)2
1(log 2/++≤N l m 因此,含有n 个关键字的B-树,最大深度为⎡⎤1)21(
log 2/++N m 。

六、(本题10分)设关键字序列为:49,38,66,80,70,15,22。

(1)用直接插入排序法进行排序,写出每趟的结果。

(2)采用待排序列的第一个关键字作为枢轴,写出用快速排序法的一趟和二趟排序之后的状态。

解:(1)直接插入排序法
原始关键字序列为:(49) 38 66 80 70 15 22
(38 49) 66 80 70 15 22
(38 49 66) 80 70 15 22
(38 49 66 80) 70 15 22
(38 49 66 70 80) 15 22
(38 49 66 70 80) 15 22
(15 22 38 49 66 70 80)
(2)快速排序法
原始关键字序列为:49,38,66,80,70,15,22
第一趟排序后 22 38 15 (49) 70 80 66
第二趟排序后 15 (22) 38 66 (70) 80
七、(本题15分)有一种简单的排序算法,叫做计数排序。

这种排序算法对一个待排序的表进行排序,并将排序结果存放到另一个新的表中。

必须注意的是,表中所有待排序的关键字互不相同。

计数排序算法针对表中的每个记录,扫描待排序的表一趟,统计表中有多少个记录的关键字比该记录的关键字要小。

假设针对某一个记录,统计出的计算值为c,那么这个记录在新的有序表中的合适的存放位置为c+1。

(1)编写实现计数排序的算法;
(2)分析该算法的时间复杂性。

解:(1)假设数据结构如下:
#define MAXSIZE 20
typedef int KeyType;
typedef struct {
KeyType key;
InfoType otherinfo;
} RedType;
typedef struct {
RedType r [MAXSIZE + 1 ] ; // r[0] 空或作哨兵
int length;
} SqList;
void CountSort(SqList L1, SqList L2)
{//把L1计数排序后,结果放在L2
int i, j, n, count;
n=L1.length;
L2.length=L1.length;
for (i=1; i<=n; i++){
count=0;
for (j=1; j<=n; j++)
if (L1.r[j]<L1.r[i]) count++;
L2.r[count+1]=L1.r[i];
}
}
(2)基本操作是关键字比较操作和记录移动操作。

其中关键字比较操作为O(n2),记录移动操作为O(n)。

因此,总的时间复杂性为O(n2)。

相关文档
最新文档