数据结构与算法1800题-题目 下载本文

内容发布更新时间 : 2024/12/23 2:56:23星期一 下面是文章的全部内容请认真阅读。

16. 循环队列通常用指针来实现队列的头尾相接。( )【南京航空航天大学 1996 六、1(1分)】 17. 循环队列也存在空间溢出问题。( )【青岛大学 2002 一、2 (1分)】 18. 队列和栈都是运算受限的线性表,只允许在表的两端进行运算。( )【长沙铁道学院1997一、5(1分)】 19. 栈和队列都是线性表,只是在插入和删除时受到了一些限制。( )【北京邮电大学2002一、3(1分)】 20. 栈和队列的存储方式,既可以是顺序方式,又可以是链式方式。( ) 三 填空题

1.栈是_______的线性表,其运算遵循_______的原则。【北京科技大学 1997 一、3】 2._______是限定仅在表尾进行插入或删除操作的线性表。【燕山大学 1998 一、3 (1分)】

3. 一个栈的输入序列是:1,2,3则不可能的栈输出序列是_______。【中国人民大学2001一、1(2分)】

4. 设有一个空栈,栈顶指针为1000H(十六进制),现有输入序列为1,2,3,4,5,经过PUSH,PUSH,POP,PUSH,POP,PUSH,PUSH之后,输出序列是_______,而栈顶指针值是_______H。设栈为顺序栈,每个元素占4个字节。【西安电子科技大学 1998 二、1(4分)】

5. 当两个栈共享一存储区时,栈利用一维数组stack(1,n)表示,两栈顶指针为top[1]与top[2],则当栈1空时,top[1]为_______,栈2空时 ,top[2]为_______,栈满时为_______。 6.两个栈共享空间时栈满的条件_______。【中山大学 1998 一、3(1分)】

7.在作进栈运算时应先判别栈是否_(1)_;在作退栈运算时应先判别栈是否_(2)_;当栈中元素为n个,作进栈运算时发生上溢,则说明该栈的最大容量为_(3)_。

为了增加内存空间的利用率和减少溢出的可能性,由两个栈共享一片连续的空间时,应将两栈的_(4)_分别设在内存空间的两端,这样只有当_(5)_时才产生溢出。【山东工业大学 1994 一、1(5分)】 8. 多个栈共存时,最好用_______作为存储结构。【南京理工大学 2001 二、7(2分)】

9.用S表示入栈操作,X表示出栈操作,若元素入栈的顺序为1234,为了得到1342出栈顺序,相应的S和X的操作串为_______。【西南交通大学 2000 一、5】

10. 顺序栈用data[1..n]存储数据,栈顶指针是top,则值为x的元素入栈的操作是_______。 11.表达式23+((12*3-2)/4+34*5/7)+108/9的后缀表达式是_______。【中山大学 1998 一、4(1分)】

12. 循环队列的引入,目的是为了克服_______。【厦门大学 2001 一、1 (14/8分)】 13.用下标0开始的N元数组实现循环队列时,为实现下标变量M加1后在数组有效下标范围内循环,可采用的表达式是:M:=_______(填PASCAL语言,C语言的考生不填); M= _______(填C语言,PASCAL语言的考生不填)。 14.________又称作先进先出表。【重庆大学 2000 一、7】 15. 队列的特点是_______。【北京理工大学 2000 二、2(2分)】

16.队列是限制插入只能在表的一端,而删除在表的另一端进行的线性表,其特点是_______。 17. 已知链队列的头尾指针分别是f和r,则将值x入队的操作序列是_______。 18.区分循环队列的满与空,只有两种方法,它们是______和______。【北京邮电大学2001 二、2(4分)】 19.设循环队列用数组A[1..M]表示,队首、队尾指针分别是FRONT和TAIL,判定队满的条件为_______。

20. 设循环队列存放在向量sq.data[0:M]中,则队头指针sq.front在循环意义下的出队操作可表示为_______,若用牺牲一个单元的办法来区分队满和队空(设队尾指针sq.rear),则队满的条件为_______。 21.表达式求值是_______应用的一个典型例子。【重庆大学 2000 一、10】

22.循环队列用数组A[0..m-1]存放其元素值,已知其头尾指针分别是front和rear ,则当前队列的元素个数是_______。【厦门大学 2000 六、1(16%/3分)】

23.设Q[0..N-1]为循环队列,其头、尾指针分别为P和R,则队Q中当前所含元素个数为_______。 四 应用题

1. 名词解释:栈。2. 名词解释:队列3. 什么是循环队列? 4. 假设以S和X分别表示入栈和出栈操作,则对初态和终态均为空的栈操作可由S和X组成的序列表示(如SXSX)。 (1)试指出判别给定序列是否合法的一般规则。

(2)两个不同合法序列(对同一输入序列)能否得到相同的输出元素序列?如能得到,请举列说明。

5. 有5 个元素,其入栈次序为:A,B,C,D,E,在各种可能的出栈次序中,以元素C,D最先出栈(即C第一个且D第二个出栈)的次序有哪几个?【西南交通大学 2000 二、1】

6. 如果输入序列为1 2 3 4 5 6,试问能否通过栈结构得到以下两个序列:4 3 5 6 1 2和1 3 5 4 2 6;请说明为什么不能或如何才能得到。【武汉交通科技大学 1996 二、3 (3分)】

7. 若元素的进栈序列为:A、B、C、D、E,运用栈操作,能否得到出栈序列B、C、A、E、D和D、B、A、C、E?为

什么?

8. 设输入序列为a,b,c,d,试写出借助一个栈可得到的两个输出序列和两个不能得到的输出序列。

9. 设输入序列为2,3,4,5,6,利用一个栈能得到序列2,5,3,4,6吗?栈可以用单链表实现吗? 10. 试证明:若借助栈由输入序列1,2,?,n得到输出序列为P1,P2,?,Pn(它是输入序列的一个排列),则在输出序列中不可能出现这样的情形:存在着i

11. 设一数列的输入顺序为123456,若采用堆栈结构,并以A和D分别表示入栈和出栈操作,试问通过入出栈操作的合法序列。

(1) 能否得到输出顺序为325641的序列。(5分)(2) 能否得到输出顺序为154623的序列。(5分) 12.(1) 什么是递归程序?(2) 递归程序的优、缺点是什么?

(3) 递归程序在执行时,应借助于什么来完成?(4) 递归程序的入口语句、出口语句一般用什么语句实现? 14. 当过程P递归调用自身时,过程P内部定义的局部变量在P的2次调用期间是否占用同一数据区?为什么? 15. 试推导出当总盘数为n的Hanoi塔的移动次数。

17. 用一个数组S(设大小为MAX)作为两个堆栈的共享空间。请说明共享方法,栈满/栈空的判断条件,并用C或PASCAL设计公用的入栈操作push(i,x),其中i为0或1,用于表示栈号,x为入栈值。 19. 用栈实现将中缀表达式8-(3+5)*(5-6/2)转换成后缀表达式,画出栈的变化过程图。

20. 在表达式中,有的运算符要求从右到左计算,如A**B**C的计算次序应为(A**(B**C)),这在由中缀生成后缀的算法中是怎样实现的?(以**为例说明)

22. 画出对算术表达式A-B*C/D-E↑F求值时操作数栈和运算符栈的变化过程。

23. 计算算术表达式的值时,可用两个栈作辅助工具。对于给出的一个表达式,从左向右扫描它的字符,并将操作数放入栈S1中,运算符放入栈S2中,但每次扫描到运算符时,要把它同S2的栈顶运算符进行优先级比较,当扫描到的运算符的优先级不高于栈顶运算符的优先级时,取出栈S1的栈顶和次栈顶的两个元素,以及栈S2的栈顶运算符进行运算将结果放入栈S1中(得到的结果依次用T1、T2等表示)。为方便比较,假设栈S2的初始栈顶为?(?运算符的优先级低于加、减、乘、除中任何一种运算)。现假设要计算表达式: A-B*C/D+E/F。写出栈S1和S2的变化过程。

24. 有字符串次序为3*-y-a/y^2,利用栈,给出将次序改为3y-*ay2^/-的操作步骤。(可用X代表扫描该字符串过程中顺序取一个字符进栈的操作,用S代表从栈中取出一个字符加入到新字符串尾的出栈操作。例如,ABC变为BCA的操作步骤为XXSXSS)【东北大学 2001 一、4 ( 4分)】

25. 内存中一片连续空间(不妨假设地址从1到m)提供给两个栈S1和S2使用,怎样分配这部分存储空间,使得对任一个栈,仅当这部分空间全满时才发生上溢。【东北大学 2000 一、1 (3分)】

26. 将两个栈存入数组V[1..m]应如何安排最好?这时栈空、栈满的条件是什么?【东南大学1998一、5】

27. 在一个算法中需要建立多个堆栈时可以选用下列三种方案之一,试问:这三种方案之间相比较各有什么优缺点?

(1)分别用多个顺序存储空间建立多个独立的堆栈;(2)多个堆栈共享一个顺序存储空间; (3)分别建立多个独立的链接堆栈。【北京航空航天大学 1998 一、6(4分)】

28.在某程序中,有两个栈共享一个一维数组空间SPACE[N]、SPACE[0]、SPACE[N-1] 分别是两个栈的栈底。 (1)对栈1、栈2,试分别写出(元素x)入栈的主要语句和出栈的主要语句。 (2)对栈1、栈2,试分别写出栈满、栈空的条件。【北京理工大学 1999 二、2(8分)】 29. 简述顺序存储队列的假溢出的避免方法及队列满和空的条件。【山东大学 2000 一、2 (4分)】 30. 举例说明顺序队的“假溢出”现象,并给出解决方案。31. 怎样判定循环队列的空和满?

32. 简要叙述循环队列的数据结构,并写出其初始状态、队列空、队列满时的队首指针与队尾指针的值。 33. 利用两个栈sl,s2模拟一个队列时,如何用栈的运算实现队列的插入,删除以及判队空运算。请简述这些运算的算法思想。

给出循环队列的队空和队满的判断条件,并且分析一下该条件对队列实际存储空间大小的影响,如果为了不损失存储空间,你如何改进循环队列的队空和队满的判断条件?【西北工业大学 1999 三 (8分)】

35. 如果用一个循环数组q[0..m-1]表示队列时,该队列只有一个队列头指针front,不设队列尾指针rear,而改置计数器count用以记录队列中结点的个数。

(1)编写实现队列的三个基本运算:判空、入队、出队(3分) (2)队列中能容纳元素的最多个数是多少?(1分)【东北大学 2002 一、1】

36. 给出循环队列中元素个数的计算式(设队最大长度为N,队首指针FRONT,队尾指针REAR)

37. 顺序队列一般应该组织成为环状队列的形式,而且一般队列头或尾其中之一应该特殊处理。例如,队列为listarray[0..n-1],队列头指针为 front,队列尾指针为 rear, 则listarray [rear]表示下一个可以插入队列的位置。请解释其原因。【北京大学 1999 一、3 (20/3分)】

38. 设一个双端队列,元素进入该队列的次序为a,b,c,d。求既不能由输入受限的双端队列得到,又不能由输出受限的双端队列得到的输出序列。【中山大学 1999 一、4 (3分)】

39. 若以1、2、3、4作为双端队列的输入序列,试分别求出以下条件的输出序列: (1)能由输入受限的双端队列得到,但不能由输出受限的双端队列得到的输出序列; (2)能由输出受限的双端队列得到,但不能由输入受限的双端队列得到的输出序列; (3)既不能由输入受限的双端队列得到,也不能由输出受限的双端队列得到的输出序列。

40. 假设以数组sq[0..7]存放循环队列元素,变量f指向队头元素的前一位置,变量r指向队尾元素,如用A和D分别表示入队和出队操作,请给出:

3152124

(1) 队空的初始条件;(2) 执行操作序列ADADADA时的状态,并作必要的说明。 41、设输入元素为1、2、3、P和A,输入次序为123PA,如图(编者略)。元素经过栈后达输出序列,当所有元素均到达输出序列后,有哪些序列可以作为高级语言的变量名。【中山大学 1997】 五 算法设计题

1. 设有两个栈S1,S2都采用顺序栈方式,并且共享一个存储区[O..maxsize-1],为了尽量利用空间,减少溢出的可能,可采用栈顶相向,迎面增长的存储方式。试设计S1,S2有关入栈和出栈的操作算法。

2. 设从键盘输入一整数的序列:a1, a2, a3,?,an,试编写算法实现:用栈结构存储输入的整数,当ai≠-1时,将ai进栈;当ai=-1时,输出栈顶整数并出栈。算法应对异常情况(入栈满等)给出相应的信息。 3. 设表达式以字符形式已存入数组E[n]中,‘#’为表达式的结束符,试写出判断表达式中括号(‘(’和‘)’)是否配对的C语言描述算法:EXYX(E); (注:算法中可调用栈操作的基本算法。)

4. 从键盘上输入一个逆波兰表达式,用伪码写出其求值程序。规定:逆波兰表达式的长度不超过一行,以$符作为输入结束,操作数之间用空格分隔,操作符只可能有+、-、*、/四种运算。例如:234 34+2*$

5. 假设以I和O分别表示入栈和出栈操作。栈的初态和终态均为空,入栈和出栈的操作序列可表示为仅由I和O组成的序列,称可以操作的序列为合法序列,否则称为非法序列。 (1)下面所示的序列中哪些是合法的?

A. IOIIOIOO B. IOOIOIIO C. IIIOIOIO D. IIIOOIOO

(2)通过对(1)的分析,写出一个算法,判定所给的操作序列是否合法。若合法,返回true,否则返回false(假定被判定的操作序列已存入一维数组中)。【武汉大学 2000 五、2】

6.设计一个算法,判断一个算术表达式中的括号是否配对。算术表达式保存在带头结点的单循环链表中,每个结点有两个域:ch和link,其中ch域为字符类型。【南京邮电大学 2000五】

8. 设结点结构为(data,link),试用一个全局指针p和某种链接结构实现一个队列,画出示意图,并给出入队addq和出队deleteq过程,要求它们的时间复杂性都是O(l)(不计new和dispose时间)

9. 假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾结点,但不设头指针,如图所示(编者略),请写出相应的入队列和出队列算法。【西安电子科技大学 1999计应用 六 (10分)】 10. 如果允许在循环队列的两端都可以进行插入和删除操作。要求: (1)写出循环队列的类型定义;(2)写出“从队尾删除”和“从队头插入”的算法。 11. 在一个循环链队中只有尾指针(记为rear,结点结构为数据域data,指针域next),请给出这种队列的入队和出队操作的实现过程。【山东科技大学 2002 一、2 (6分)】

13. 一个双端队列deque是限定在两端end1,end2都可进行插入和删除的线性表。队空条件是end1=end2。若用顺序方式来组织双端队列,试根据下列要求,定义双端队列的结构,并给出在指定端i(i=1,2)的插入enq和删除deq操作的实现。

(1) 当队满时,最多只能有一个元素空间可以是空的。(2) 在做两端的插入和删除时,队列中其它元素一律不动。

14. 已知Q是一个非空队列,S是一个空栈。仅用队列和栈的ADT函数和少量工作变量,使用Pascal或C语言编写一个算法,将队列Q中的所有元素逆置。栈的ADT函数有:

makeEmpty(s:stack); 置空栈

push(s:stack;value:datatype); 新元素value进栈 pop(s:stack):datatype; 出栈,返回栈顶值

isEmpty(s:stack):Boolean; 判栈空否 队列的 ADT函数有:

enqueue(q:queue:value:datatype); 元素value进队 deQueue(q:queue):datatype; 出队列,返回队头值

isEmpty(q:queue):boolean; 判队列空否 【清华大学 2000 六(12分)】

15. 将n个队列顺序映射到数组v[l..m]中,每一队列在v中表示为一循环队列。试画出其示意图并写出对应这种表示的addq和deleteq过程。【东南大学 1993 二(20分)】 16. 设整数序列a1,a2,?,an,给出求解最大值的递归程序。【南京航空航天大学 2000 六】

17.线性表中元素存放在向量A(1,?,n)中,元素是整型数。试写出递归算法求出A中的最大和最小元素。 18. 已知求两个正整数m与n的最大公因子的过程用自然语言可以表述为反复执行如下动作:第一步:若n等于零,则返回m;第二步:若m小于n,则m与n相互交换;否则,保存m,然后将n送m,将保存的m除以n的余数送n。 (1)将上述过程用递归函数表达出来(设求x除以y的余数可以用x MOD y 形式表示)。 (2)写出求解该递归函数的非递归算法。【北京航空航天大学 2001 五(15分)】 20. 试将下列递归过程改写为非递归过程。 void test(int &sum) { int x; scanf(x);

if(x=0) sum=0 else {test(sum); sum+=x;} printf(sum);

} 【北京轻工业学院 2000 三 (15分)】 21. 已知Ackermann函数定义如下: (1) 写出Ack(2,1)的计算过程。(2) 写出计算Ack(m,n)的非递归算法。

22.设计算法以求解从集合{1..n}中选取k(k<=n)个元素的所有组合。例如,从集合{1..4}中选取2个元素的所有组合的输出结果为:1 2,1 3,1 4,2 3, 2 4,3 4。

第四章 串

一、选择题

1.下面关于串的的叙述中,哪一个是不正确的?( )【北方交通大学 2001 一、5(2分)】

A.串是字符的有限序列 B.空串是由空格构成的串

C.模式匹配是串的一种重要运算 D.串既可以采用顺序存储,也可以采用链式存储 2 若串S1=‘ABCDEFG’, S2=‘9898’ ,S3=‘###’,S4=‘012345’,执行

concat(replace(S1,substr(S1,length(S2),length(S3)),S3),substr(S4,index(S2,‘8’),length(S2))) 其结果为( )【北方交通大学 1999 一、5 (25/7分)】

A.ABC###G0123 B.ABCD###2345 C.ABC###G2345 D.ABC###2345 E.ABC###G1234 F.ABCD###1234 G.ABC###01234

3.设有两个串p和q,其中q是p的子串,求q在p中首次出现的位置的算法称为( )

A.求子串 B.联接 C.匹配 D.求串长 【北京邮电大学 2000 二、4(20/8分)】【西安电子科技大学 1996 一、1 (2分)】 4.已知串S=‘aaab’,其Next数组值为( )。【西安电子科技大学 1996 一、7 (2分)】

A.0123 B.1123 C.1231 D.1211 5.串 ‘ababaaababaa’ 的next数组为( )。【中山大学 1999 一、7】

A.012345678999 B.012121111212 C.011234223456 D.0123012322345 6.字符串‘ababaabab’ 的nextval 为( )

A.(0,1,0,1,04,1,0,1) B.(0,1,0,1,0,2,1,0,1) C.(0,1,0,1,0,0,0,1,1) D.(0,1,0,1,0,1,0,1,1 ) 7.模式串t=‘abcaabbcabcaabdab’,该模式串的next数组的值为( ),nextval数组的值为 ( )。

A.0 1 1 1 2 2 1 1 1 2 3 4 5 6 7 1 2 B.0 1 1 1 2 1 2 1 1 2 3 4 5 6 1 1 2 C.0 1 1 1 0 0 1 3 1 0 1 1 0 0 7 0 1 D.0 1 1 1 2 2 3 1 1 2 3 4 5 6 7 1 2 E.0 1 1 0 0 1 1 1 0 1 1 0 0 1 7 0 1 F.0 1 1 0 2 1 3 1 0 1 1 0 2 1 7 0 1 8.若串S=’software’,其子串的数目是( )。【西安电子科技大学 2001应用 一、2(2分)】

A.8 B.37 C.36 D.9

9.设S为一个长度为n的字符串,其中的字符各不相同,则S中的互异的非平凡子串(非空且不同于S本身)的个数为( )。【中科院计算所 1997 】

A.2n-1 B.n2 C.(n2/2)+(n/2) D.(n2/2)+(n/2)-1 E. (n2/2)-(n/2)-1 F.其他情况 10.串的长度是指( )【北京工商大学 2001 一、6 (3分)】

A.串中所含不同字母的个数 B.串中所含字符的个数

C.串中所含不同字符的个数 D.串中所含非空格字符的个数 二、判断题

1.KMP算法的特点是在模式匹配时指示主串的指针不会变小。( )【北京邮电大学 2002 一、4 (1分)】 2.设模式串的长度为m,目标串的长度为n,当n≈m且处理只匹配一次的模式时,朴素的匹配(即子串定位函数)算法所花的时间代价可能会更为节省。( )3.串是一种数据对象和操作都特殊的线性表。( ) 二、填空题

1.空格串是指__(1)__,其长度等于___(2)__。 【西安电子科技大学 2001软件 一、4(2分)】 2.组成串的数据元素只能是________。 【中山大学 1998 一、5 (1分)】

3.一个字符串中________称为该串的子串 。 【华中理工大学 2000 一、3(1分)】 4.INDEX(‘DATASTRUCTURE’, ‘STR’)=________。【福州大学 1998 二、4 (2分)】 5.设正文串长度为n,模式串长度为m,则串匹配的KMP算法的时间复杂度为________。 6.模式串P=‘abaabcac’的next函数值序列为________。【西安电子科技大学 2001软件 一、6(2分)】 7.字符串’ababaaab’的nextval函数值为________。 【北京邮电大学 2001 二、4 (2分)】 8.设T和P是两个给定的串,在T中寻找等于P的子串的过程称为__(1)__,又称P为__(2)__。

9.串是一种特殊的线性表,其特殊性表现在__(1)__;串的两种最基本的存储方式是__(2)__、__(3)__;两个串相等的充分必要条件是__(4)__。 【中国矿业大学 2000 一、3 (4分)】

10.两个字符串相等的充分必要条件是_______。 【西安电子科技大学 1999软件 一、1 (2分)】 11.知U=‘xyxyxyxxyxy’;t=‘xxy’;

ASSIGN(S,U);

ASSIGN(V,SUBSTR(S,INDEX(s,t),LEN(t)+1)); ASSIGN(m,‘ww’)

求REPLACE(S,V,m)= ________。 【东北大学 1997 一、1 (5分)】 12.实现字符串拷贝的函数 strcpy为:

void strcpy(char *s , char *t) /*copy t to s*/ { while (________)

} 【浙江大学 1999 一、5 (3分)】

13.下列程序判断字符串s 是否对称,对称则返回1,否则返回0;如 f(\返回1,f(\返回0;

int f((1)________) {int i=0,j=0;

while (s[j])(2)________;

for(j--; i

} 【浙江大学 1999 一、6 (3分)】 程序(b)

void maxcomstr(orderstring *s,*t; int index, length) {int i,j,k,length1,con; index=0;length=0;i=1; while (i<=s.len) {j=1;

while(j<=t.len)

{ if (s[i]= =t[j])

{ k=1;length1=1;con=1;

while(con)