1、计算机专业基础综合数据结构(栈和队列)历年真题试卷汇编 1 及答案解析(总分:56.00,做题时间:90 分钟)一、综合题(总题数:24,分数:56.00)1.将两个栈 S1 和 S2 存入数组 V1m应如何安排最好?请写出栈顶指针 top 的初始值和判断栈空、栈满的条件是什么?【东南大学 1998 一、5(6 分)】【烟台大学 2007 四、1(5 分)】(分数:2.00)_2.若有一个一维数组 A,它的元素下标从 1 开始到 MAX。要在数组 A 中建立两个栈共享同一空间,栈 S1 的栈顶指针为 top1,栈 S2 的栈顶指针为 top2,为了最大限度地利用数组 A 的空间,则应该如何共享
2、?栈满和栈空的条件是什么?【北京理工大学 2006 十一、3(5 分)】(分数:2.00)_3.设输入序列为 a,b,c,d,试写出借助一个栈可得到的两个输出序列和两个不能得到的输出序列。【北京科技大学 2001 一、4(2 分)】(分数:2.00)_4.试证明:若借助栈由输入序列 1,2,n 得到输出序列为 P 1 ,P 2 ,P n (它是输入序列的一个排列),则在输出序列中不可能出现这样的情形:存在着 P f ki。【上海交通大学 1998 二(15 分)】(分数:2.00)_5.什么是递归程序?(分数:2.00)_6.递归程序的优、缺点是什么?(分数:2.00)_7.递归程序在执行时,
3、应借助于什么来完成?(分数:2.00)_8.递归程序的入口语句、出口语句一般用什么语句实现?【大连海事大学 1996 二、4(4 分)】(分数:2.00)_9.试推导出总盘数为 n 的 Hanoi 塔的移动次数。【北京邮电大学 2001 四、3(5 分)】(分数:2.00)_10.用一个数组 S(设大小为 MAX)作为两个堆栈的共享空间。请说明共享方法,栈满栈空的判断条件,并用 C 或 Pascal 设计公用的入栈操作 push(i,x),其中 i 为 0 或 1,用于表示栈号,x 为入栈值。【浙江大学 1998 五、2(7 分)】(分数:2.00)_在一个算法中需要建立多个堆栈时可以选用下列
4、三种方案之一,试问:这三种方案之间相比较各有什么优缺点?(分数:6.00)(1).分别用多个顺序存储空间建立多个独立的堆栈;(分数:2.00)_(2).多个堆栈共享一个顺序存储空间;(分数:2.00)_(3).分别建立多个独立的链接堆栈。【北京航空航天大学 1998 一、6(4 分)】(分数:2.00)_在某程序中,有两个栈共享一个一维数组空间 SPACEN、SPACE0、SPACN-1分别是两个栈的栈底。(分数:4.00)(1).对栈 1、栈 2,试分别写出(元素 x)入栈的主要语句和出栈的主要语句。(分数:2.00)_(2).对栈 1、栈 2,试分别写出栈满、栈空的条件。【北京理工大学 1
5、999 二、2(8 分)】(分数:2.00)_11.用栈实现将中缀表达式 8 一(3+5)*(562)转换成后缀表达式,画出栈的变化过程图。【南京航空航天大学 2001 五(10 分)】(分数:2.00)_12.将表达式 a+b)*c+d-(e+g)*h 改写成后缀表达式。 【吉林大学 2007 二、4(3 分)】(分数:2.00)_13.在表达式中,有的运算符要求从右到左计算,如 A*B*C 的计算次序应为(A*(B*C),这在由中缀生成后缀的算法中是怎样实现的?(以*为例说明)【东南大学 1993 一、2(6 分)1997 一、1(8 分)】(分数:2.00)_14.有字符串次序为 3*-
6、y-a/y2,利用栈,给出将次序改为 3y-*ay2的操作步骤。(可用 X 代表扫描该字符串过程中顺序取一个字符进栈的操作,用 S 代表从栈中取出一个字符加入到新字符串尾的出栈操作。例如,ABC 变为 BCA 的操作步骤为 XXSXSS。)【东北大学 2001 一、4(4 分)】(分数:2.00)_15.用栈作工具,将十进制数 9027 转换为八进制数,试列出运算过程和栈中元素的变化过程。【华中科技大学 2006 四、1(10 分)】(分数:2.00)_16.画出对算术表达式 A-B*CD-EF 求值时,操作数栈和运算符栈的变化过程。【东南大学 2000 一、3(6 分)】(分数:2.00)_
7、17.设输入元素为 1、2、3、P 和 A,输入次序为 123PA,如图(编者略)。元素经过栈后到达输出序列,当所有元素均到达输出序列后,有哪些序列可以作为高级语言的变量名?【中山大学 1997】(分数:2.00)_18.简述顺序存储队列的假溢出的避免方法及队列满和空的条件。【山东大学 2000 一、2(4 分)】(分数:2.00)_19.简要叙述循环队列的数据结构,并写出其初始状态、队列空、队列满时的队首指针与队尾指针的值。【南京航空航天大学 1995 七(5 分)】(分数:2.00)_20.队列可以用循环单链表来实现,故可以只设置一个头指针或者只设置一个尾指针。请你分析对于循环单链表实现的
8、队列,用哪种方案更合适。【北京大学 2003 五、1(5 分)】(分数:2.00)_21.利用两个栈 s1、s2 模拟一个队列时,如何用栈的运算实现队列的插入、删除以及判队空运算。请简述这些运算的算法思想。【北京邮电大学 1992 一、1】【东南大学 1999 一、1(7 分)】(分数:2.00)_如果用一个循环数组 q0 一 m 一 1表示队列时,该队列只有一个队列头指针 front,不设队列尾指针rear,而改置计数器 count 用以记录队列中结点的个数。(分数:4.00)(1).编写实现队列的三个基本运算:判空、入队、出队。(3 分)(分数:2.00)_(2).队列中能容纳元素的最多个
9、数是多少? (1 分)【东北大学 2002 一、1】(分数:2.00)_计算机专业基础综合数据结构(栈和队列)历年真题试卷汇编 1 答案解析(总分:56.00,做题时间:90 分钟)一、综合题(总题数:24,分数:56.00)1.将两个栈 S1 和 S2 存入数组 V1m应如何安排最好?请写出栈顶指针 top 的初始值和判断栈空、栈满的条件是什么?【东南大学 1998 一、5(6 分)】【烟台大学 2007 四、1(5 分)】(分数:2.00)_正确答案:(正确答案:设栈 S1 和栈 S2 共享向量 V1 一 m,初始时,栈 S1 的栈顶指针 top0=0,栈 S2的栈顶指针 top1=m+1
10、,当 top0=0 时为左栈空,top1=m+1 时为右栈空;当 top0=0 并且 top1=m+1 时为全栈空。当 top1-top0=1 时为栈满。)解析:2.若有一个一维数组 A,它的元素下标从 1 开始到 MAX。要在数组 A 中建立两个栈共享同一空间,栈 S1 的栈顶指针为 top1,栈 S2 的栈顶指针为 top2,为了最大限度地利用数组 A 的空间,则应该如何共享?栈满和栈空的条件是什么?【北京理工大学 2006 十一、3(5 分)】(分数:2.00)_正确答案:(正确答案:两栈共享数组 A,top1=0 时 S1 栈空,top2=MAX+1 时,S2 栈空;top2 一 to
11、p1=1时栈满。)解析:3.设输入序列为 a,b,c,d,试写出借助一个栈可得到的两个输出序列和两个不能得到的输出序列。【北京科技大学 2001 一、4(2 分)】(分数:2.00)_正确答案:(正确答案:n 个元素的排列有 n!种,但借助栈结构,n 个入栈元素只可得到 1(n+1)(2n)!(n!*n!)种出栈序列,这个数小于,l!。本题 4 个元素,可有 14 种出栈序列,abcd 和 dcba 就是其中两种;有 10(4114=10)种排列得不到,其中,dabc 和 adbc 是不可能得到的两种。)解析:4.试证明:若借助栈由输入序列 1,2,n 得到输出序列为 P 1 ,P 2 ,P
12、n (它是输入序列的一个排列),则在输出序列中不可能出现这样的情形:存在着 P f ki。【上海交通大学 1998 二(15 分)】(分数:2.00)_正确答案:(正确答案:如果 i i 在 pj入栈前先出栈。而对于 pip j的情况,则说明要将 pi压到 pj之上,也就是在 pj出栈之后 pi才能出栈。这就说明,对于 ijk,不可能出现 Pjki 的输出序列。换句话说,对于输入序列 1,2,3,不可能出现 3,1,2 的输出序列。)解析:5.什么是递归程序?(分数:2.00)_正确答案:(正确答案:(1)一个函数在结束本函数运行之前,直接或间接调用函数自身,称为递归。例如,函数 f 在执行中
13、,又调用函数 f 自身,称为直接递归;若函数 f 执行中,调用函数 g,而 g 执行中,又调用函数 f,这称为间接递归。在实际应用中,多为直接递归,也常简称为递归。)解析:6.递归程序的优、缺点是什么?(分数:2.00)_正确答案:(正确答案:递归程序的优点是程序结构简单、易读、清晰,易证明其正确性。缺点是执行中占内存空间较多,运行效率低,不易优化。)解析:7.递归程序在执行时,应借助于什么来完成?(分数:2.00)_正确答案:(正确答案:递归程序执行中需借助栈这种数据结构来实现。)解析:8.递归程序的入口语句、出口语句一般用什么语句实现?【大连海事大学 1996 二、4(4 分)】(分数:2
14、.00)_正确答案:(正确答案:递归程序的入口语句和出口语句一般用条件判断语句来实现。)解析:9.试推导出总盘数为 n 的 Hanoi 塔的移动次数。【北京邮电大学 2001 四、3(5 分)】(分数:2.00)_正确答案:(正确答案:设 H n 为 n 个盘子的 Hanoi 塔的移动次数(假定 n 个盘子从钢针 X 移到钢针 z,可借助钢针 Y),则 H n =2H n-1 +1先将 n 一 1 个盘子从 X 移到 Y,第 n 个盘子移到 z,再将那 n 一 1 个移到 Z=2(2H n-2 +1)+1=2 2 H n-2 +2+1=2 2 (2 n-3 +1)+2+1=2 3 H n-3
15、+2 2 +2+1=2H n-k +2 k-1 +2 k-2 +2 1 +2 0 =2 n-1 H 1 +2 n-2 +2 n-3 +2 1 +2 0 因为 H 1 =1,所以 H 1 =2 n-1 +2 n-2 +2 1 +2 0 =2 n 一 1。故总盘数为 n 的 Hanoi 塔的移动次数是 2 n 1。)解析:10.用一个数组 S(设大小为 MAX)作为两个堆栈的共享空间。请说明共享方法,栈满栈空的判断条件,并用 C 或 Pascal 设计公用的入栈操作 push(i,x),其中 i 为 0 或 1,用于表示栈号,x 为入栈值。【浙江大学 1998 五、2(7 分)】(分数:2.00)
16、_正确答案:(正确答案:设栈 S1 和栈 S2 共享向量 V1 一 m,初始时,栈 S1 的栈顶指针 top0=0,栈 S2的栈顶指针 top1=m+1,当 top0=0 时为左栈空,top1=m+1 时为右栈空;当 top0=0 并且 top1=m+1 时为全栈空。当 top1一 top0=1 时为栈满。入栈核心语句段如下: if(dstop1一 dstop0=1)cout解析:在一个算法中需要建立多个堆栈时可以选用下列三种方案之一,试问:这三种方案之间相比较各有什么优缺点?(分数:6.00)(1).分别用多个顺序存储空间建立多个独立的堆栈;(分数:2.00)_正确答案:(正确答案:每个栈用
17、一个顺序存储空间时,操作简便,但分配存储空间小了,容易产生溢出,分配空间大了,容易造成浪费,各栈不能共享空间。)解析:(2).多个堆栈共享一个顺序存储空间;(分数:2.00)_正确答案:(正确答案:多个栈共享一个顺序存储空间,充分利用了存储空间,只有在整个存储空间都用完时才能产生溢出,其缺点是当一个栈满时要向左、右栈查询有无空闲单元。如果有,则要移动元素和修改相关的栈底和栈顶指针。当接近栈满时,查询空闲单元、移动元素和修改栈底栈顶指针的操作频繁,计算复杂并且耗费时间。)解析:(3).分别建立多个独立的链接堆栈。【北京航空航天大学 1998 一、6(4 分)】(分数:2.00)_正确答案:(正确
18、答案:多个链栈一般不考虑栈的溢出(仅受用户内存空间限制),缺点是栈中元素要以指针相链接,比顺序存储多占用了指针所用的存储空间。)解析:在某程序中,有两个栈共享一个一维数组空间 SPACEN、SPACE0、SPACN-1分别是两个栈的栈底。(分数:4.00)(1).对栈 1、栈 2,试分别写出(元素 x)入栈的主要语句和出栈的主要语句。(分数:2.00)_正确答案:(正确答案:设 topl 和 top2 分别为栈 1 和栈 2 的栈顶指针 (1)入栈主要语句: if(top2 一topl=1)(cout解析:(2).对栈 1、栈 2,试分别写出栈满、栈空的条件。【北京理工大学 1999 二、2(
19、8 分)】(分数:2.00)_正确答案:(正确答案:栈满条件:top2 一 top1=1 栈空条件:topl=一 1top2=N topl=一 1为左栈空,top2=N 为右栈空)解析:11.用栈实现将中缀表达式 8 一(3+5)*(562)转换成后缀表达式,画出栈的变化过程图。【南京航空航天大学 2001 五(10 分)】(分数:2.00)_正确答案:(正确答案:中缀表达式 8-(3+5)*(562)的后缀表达式是:8 3 5+5 6 2一*一表达式生成过程为: )解析:12.将表达式 a+b)*c+d-(e+g)*h 改写成后缀表达式。 【吉林大学 2007 二、4(3 分)】(分数:2.
20、00)_正确答案:(正确答案:ab+c*d+eg+h*一)解析:13.在表达式中,有的运算符要求从右到左计算,如 A*B*C 的计算次序应为(A*(B*C),这在由中缀生成后缀的算法中是怎样实现的?(以*为例说明)【东南大学 1993 一、2(6 分)1997 一、1(8 分)】(分数:2.00)_正确答案:(正确答案:中缀表达式转为后缀表达式的规则基本上与上面 21 题相同,不同之处是对运算符料优先级的规定。在算术运算中,先乘除后加减,先括号内后括号外,相同级别的运算符按从左到右的规则运算。而对料运算符,其优先级同常规理解,即高于加减乘除而小于左括号。为了适应本题中“从右到左计算”的要求,规
21、定栈顶运算符料的级别小于正从表达式中读出的运算符料,即刚读出的运算符料级别高于栈顶运算符料,因此也入栈。下面以 A*B*C 为例说明实现过程。读入 A,不是操作符,直接写入结果表达式。再读入*,这里规定在读入*后,不能立即当乘号处理,要看下一个符号,若下个符号不是*,则前个*是乘号。这里因为下一个待读的符号也是*,故认为*是一个运算符,与运算符栈顶比较(运算符栈顶初始化后,首先压入#作为开始标志),其级别高于#,入栈。再读入 B,直接进入结果表达式。接着读入料,与栈顶比较,均为料,我们规定,后读入的料级别高于栈顶的料,因此料入栈。接着读入 C,直接到结果表达式。现在部分结果(后缀)表达式是 A
22、BC。最后读入“#“,表示输入表达式结束,这时运算符栈中从栈顶到栈底有两个料和一个“#“。两个运算符料退栈至结果表达式,结果表达式变为ABC*。运算符栈中只剩#,退栈,运算结束。)解析:14.有字符串次序为 3*-y-a/y2,利用栈,给出将次序改为 3y-*ay2的操作步骤。(可用 X 代表扫描该字符串过程中顺序取一个字符进栈的操作,用 S 代表从栈中取出一个字符加入到新字符串尾的出栈操作。例如,ABC 变为 BCA 的操作步骤为 XXSXSS。)【东北大学 2001 一、4(4 分)】(分数:2.00)_正确答案:(正确答案:XSXXXSSSXXSXXSXXSSSS)解析:15.用栈作工具
23、,将十进制数 9027 转换为八进制数,试列出运算过程和栈中元素的变化过程。【华中科技大学 2006 四、1(10 分)】(分数:2.00)_正确答案:(正确答案:十进制数转换为八进制数的核心语句段如下: while(N)Push(s,N8);N=N8; while(!stackEmpty(s) (Pop(s,e; cout 10=(21503) 8,运算中八进制数入栈的顺序是30512。)解析:16.画出对算术表达式 A-B*CD-EF 求值时,操作数栈和运算符栈的变化过程。【东南大学 2000 一、3(6 分)】(分数:2.00)_正确答案:(正确答案:设操作数栈是 opnd,操作符栈是
24、optr,对算术表达式 A 一 B*CDEF 求值,过程如下: )解析:17.设输入元素为 1、2、3、P 和 A,输入次序为 123PA,如图(编者略)。元素经过栈后到达输出序列,当所有元素均到达输出序列后,有哪些序列可以作为高级语言的变量名?【中山大学 1997】(分数:2.00)_正确答案:(正确答案:一般来说,高级语言的变量名是以字母开头的字母数字序列。故本题答案是:AP321,PA32 1,P3A21,P32A1,P321A。)解析:18.简述顺序存储队列的假溢出的避免方法及队列满和空的条件。【山东大学 2000 一、2(4 分)】(分数:2.00)_正确答案:(正确答案:设顺序存储
25、队列用一维数组 gm表示,其中 m 为队列中元素个数,队列中元素在向量中的下标从 0 到 m 一 1。设队头指针为舶 nt,队尾指针是 rear,约定 front 指向队头元素的前一位置,rear 指向队尾元素。当 front 等于一 1 时队空,rear 等于 m 一 1 时为队满。由于队列的性质(“删除”在队头而“插入”在队尾),所以当队尾指针 rear 等于 m 一 1 时,再无法入队。若经过几次退队,队列中会有空闲单元,所以队列并不是真满,这称为“假溢出”。其解决办法有二,一是将队列元素向前“平移”(占用 0 至 rear 一 front1);二是将队列看成首尾相连,即看做循环队列(0
26、 一 m 一 1)。在循环队列下,仍定义 front=rear 时为队空,而判断队满则常用两种方法:一种是用“牺牲一个单元”,即rear+1=front(准确记是(rear+1)时 m=front,m 是队列容量)时为队满;另一种方法是“设标记”,如设标记 tag,tag=0 时为队空;tag=1 时,若因插入导致舶 nt=rear 则为队满。)解析:19.简要叙述循环队列的数据结构,并写出其初始状态、队列空、队列满时的队首指针与队尾指针的值。【南京航空航天大学 1995 七(5 分)】(分数:2.00)_正确答案:(正确答案:typedef struct node elemtype elem
27、cqm; m 为队列最大可能的容量 int front,rear; front 和 rear 分别为队头和队尾指针 cqnode ; cqnode cq; (1)初始状态 cqfront=cqrear=0; (2)队列空 cqfront=cqrear; (3)队列满 (cqrear+1)m=cqfront;)解析:20.队列可以用循环单链表来实现,故可以只设置一个头指针或者只设置一个尾指针。请你分析对于循环单链表实现的队列,用哪种方案更合适。【北京大学 2003 五、1(5 分)】(分数:2.00)_正确答案:(正确答案:循环单链表若只设头指针,则出队操作时间复杂度是 O(1),而入队操作时间
28、复杂度是 O(n);若只设尾指针,则出队和入队操作时间复杂度都是 O(1)。显然,后者更好。)解析:21.利用两个栈 s1、s2 模拟一个队列时,如何用栈的运算实现队列的插入、删除以及判队空运算。请简述这些运算的算法思想。【北京邮电大学 1992 一、1】【东南大学 1999 一、1(7 分)】(分数:2.00)_正确答案:(正确答案:栈的特点是后进先出,队列的特点是先进先出。初始时设栈 s1 和栈 s2 均为空。(1)用栈 s1 和 s2 模拟一个队列的输入:设 s1 和 s2 容量相等。分以下三种情况讨论:若 s1 未满,则元素入 s1 栈;若 s1 满,s2 空,则将 s1 退栈到空,退
29、栈元素依次压栈入 s2,之后元素入 s1 栈;若 s1 满,s2不空(已有出队列元素),则不能入队。(2)用栈 s1 和 s2 模拟队列出队(删除):若栈 s2 不空,退栈,即是队列的出队;若 s2 为空且 s1 不空,则将 s1 栈中全部元素退栈,并依次压入 s2 中,s2 栈顶元素退栈,这就是相当于队列的出队。若栈 s1 为空并且 s2 也为空,队列空,不能出队。(3)判队空:若栈 s1 为空并且 s2 也为空,才是队列空。讨论:s1 和 s2 容量之和是队列的最大容量。其操作是,s1 栈满后,全部退栈并压栈入 s2(设 s1 和 s2 容量相等)。再入栈 s1 直至 s1 满。这相当于队
30、列元素“入队”完毕。出队时,s2 退栈完毕后,s1 栈中元素依次退栈到 s2,s2 退栈完毕,相当于队列中全部元素出队。在栈 s2 不空情况下,若要求入队操作,只要 s1 不满,就可压入 s1 中。若 s1 满和 s2 不空状态下要求队列的入队时,按出错处理。)解析:如果用一个循环数组 q0 一 m 一 1表示队列时,该队列只有一个队列头指针 front,不设队列尾指针rear,而改置计数器 count 用以记录队列中结点的个数。(分数:4.00)(1).编写实现队列的三个基本运算:判空、入队、出队。(3 分)(分数:2.00)_正确答案:(正确答案:typedef struct ElemTy
31、pe q cm;int front,count;front 是队首指针,count 是队列中元素个数 cqnode; 定义类型标识符 (1)判空:int Empty(cqnode cq) cq 是cqnode 类型的变量 if(cqcount=o)return(1);else return(0); 空队列 入队:int EnQueue(cqnode cq,E1emType x) if(count=m)cout“出队元素”cqqcqfront解析:(2).队列中能容纳元素的最多个数是多少? (1 分)【东北大学 2002 一、1】(分数:2.00)_正确答案:(正确答案:队列中能容纳元素的最多个数为 m。队头指针 front 指向队头元素。)解析: