1、栈和队列 习 题41 判断题(在你认为正确的题后的括号中打 ,否则打 X)。(1)堆栈和队列都是特殊的线性表。 ( )(2)堆栈和队列都将插入和删除操作限制在表的端点处进行。 ( )(3)只允许在表的一端进行插入和删除操作的线性表称为堆栈。 ( )(4)没有元素的堆栈称为空栈,空栈用不着栈顶指针。 (X )(5)只要堆栈不空,就能任意删除堆栈的元素。 (X )(6)堆栈允许删除的一端称为栈顶,而栈底元素是不能删除的 。 ( X )(7)n 个元素进栈的顺序一定与它们出栈的顺序相反。 ( X )(8)对采用链式存储结构的堆栈进行操作不必判断溢出。 (X )(9)给出顺序堆栈的栈顶元素位置的指针是
2、一个指针类型的变量。 ( X )(10)判断顺序堆栈是否为空的标志是 top 是否等于 0(top 为栈顶指针)。 ( )(11)插入和删除操作比较简单是链接堆栈和链接队列的优点之一。 ( )(12)n 个元素进队的顺序与它们出队的顺序一定是相同的。 ( )(13)没有任何元素的队列称为空队。空队用不着队头指针与队尾指针。 ( X )(14)元素进出队列一定满足“先进先出”的规律。 ( )(15)链接队列不存在溢出问题。 ( X )(16)在链接队列中删除一个元素是在链表的最前端进行的。 ( )(17)采用循环链表作为存储结构的队列称为循环队列。 ( )(18)堆栈和队列都可以用来解决递归问题
3、。 (X )(19)堆栈和队列都不适合采用散列存储方法。 ( )(20)无论是顺序队列还是链接队列,插入、删除操作的时间复杂度都是 O(1)。 ( )42 单项选择题。A(1)堆栈和队列的共同之处在于它们具有相同的。A逻辑特性 B物理特性 C运算方法 D元素类型C(2)堆栈和队列都是特殊的线性表,其特殊性在于_。A它们具有一般线性表所没有的逻辑特性B它们的存储结构比较特殊C对它们的使用方法做了限制D它们比一般线性表更简单D(3)若 5 个元素的出栈序列为 1,2,3,4,5,则进栈序列可能是。A2,4,3,1,5 B2,3,1,5,4 C3,1,4,2,5 D3,1,2,5,4A(4)某队列初
4、始为空,若它的输入序列为 a,b,c,d,它的输出序列应为。Aa,b,c,d Bd,c ,b,a Ca,c ,b,d Dd,a,c,b找公式(5)当 4 个元素的进栈序列给定以后,由这 4 个元素组成的可能的出栈序列应该有 。A24 种 B17 种 C16 种 D14 种*(6)设 n 个元素的进栈序列为 1,2,3,n,出栈序列为 p1,p2,p3,pn,若Pi=n,则 B(1ilink=top Dtop-link=pB(13)若非空堆栈采用链式存储结构,栈顶指针为 top,删除堆栈的一个元素的过程是依次执行:p=top ,free(p)。Atop=p Btop=p-link Cp=top-
5、link Dp=p-linkC(14)若队列采用链式存储结构,队头元素指针与队尾元素指针分别为 front 和 rear,向队列中插入一个由 p 所指的新结点的过程是依次执行:,rear=p。Arear=p Bfront=p Crear-link=p Dfront-link=pD(15)若非空队列采用链式存储结构,队头元素指针与队尾元素指针分别为 front 和rear,删除队列的一个元素的过程是依次执行:p=front,free(p)。Arear=p Brear=p-link Crear=p-link Dfront=p-linkC(16)在循环队列中,若 front 与 rear 分别表示队
6、头元素和队尾元素的位置,则判断循环队列队空的条件是。Afront=rear+1 B。 rear=front+1 Cfront-rear Db 叭 t:0A (17)若描述某循环队列的数组为 ClUELIEM,当循环队列满时,队列中有个元素。AM BM-1 CM 十 1 DM+2D (18)在解决计算机主机与打印机之间速度不匹配问题时通常设置一个打印数据缓冲区,主机将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中取出数据打印,该缓 冲区应该是一个结构。A线性表 B数组 C堆栈 D队列C(19)设计一个递归问题的非递归算法通常需要设置结构。A线性表 B数组 C堆栈 D队列*(20)中缀表
7、达式 A-(B+CD)*E 的后缀形式是。AABC+D*E BABCD +E* CAB-C 十 DE* DABC-+DE*43 填空题。(1)堆栈和队列的逻辑结构都是 线性 结构。(2)堆栈的插入和删除操作都是在栈顶位置进行,而队列的插入操作在 队尾进行,删除操作在队头进行。(3)对某堆栈执行删除操作时,只有在栈顶情况下,才会将栈底元素删除。(4)在具体的程序设计过程中,堆栈的顺序存储结构一般是利用一个数组描述的,同时还要定义一个整型变量来栈顶。(5)若堆栈采用顺序存储结构,在不产生溢出的情况下往堆栈中插人一个新元素,首先移动,然后写入。(6)若队列采用顺序存储结构,未溢出时插入一个元素首先插
8、入一个元素,然后再写入。(7)当堆栈的最大长度难以估计时,堆栈最好采用链式 存储结构。(8)递归算法都可以通过设置堆栈机制改写成等价的非递归算法。*(9)中缀形式的算术表达式 A+(B-C)D*E 的后缀形式为。*(10)后缀形式的算术表达式 ABCD/-E*+的中缀形式为 。44 已知堆栈采用链式存储结构,初始时为空,请画出 a,b,c,d 四个元素依次进栈以后该堆栈的状态,然后再画出此时的那个栈顶元素出栈后堆栈的状态。 45 若按从左到右的顺序依次读人已知序列a,b,c,d,e,f,g1 中的元素,然后结合堆栈操作,能得到下列序列中的哪些序列(每个元素进栈一次,下列序列表示出栈的次序)?d
9、,e,c,f,b,g,a f,e,g,d,a ,c,be,f,d,g,b,c ,a c,d,b,e,f,a,g 46 设有编号 1,2,3,4 的四辆列车,顺序进入一个栈式结构的站台,请写出这四辆列车开出车站的所有可能的顺序。 47 设 STACKM为 n(n2)个堆栈共享。各栈栈顶指针为 topn,分别指出各栈栈顶元素的位置;栈底指针为 botn+1,分别指出各栈栈底元素的位置。初始时,bopi=boti=i*ROUND(Mn05) (i=1,2,n)其中,ROUND()为四舍五人取整函数。请写一算法,该算法向任意指定的第 i 个堆栈插入一个新的元素 x。仅当 M 个空间全部占用时才产生溢出
10、,并报告相应信息(1in)。48 设中缀表达式 E 存放于字符数组中,并以 作为结束标志。请写出判断一个中缀表达式 E 中左、右圆括号是否配对的算法。 49 写出将中缀表达#(a+b)c-d#变换为后缀表达式的过程中,每读到一个单词时堆栈的状态(#为中缀表达式的左、右分界符) 。410 已知 n 为大于等于零的整数,请写出利用堆栈计算下列递归函数 f(n)的非递归算法。411 已知 Ackerman 函数定义如下:(1)写出递归算法;(2)利用堆栈写出非递归算法;(3)根据非递归算法,求出 A(:K(2,1)的值。412 已知求两个正整数 m 和 n 的最大公约数的过程可以表达为如下递归函数:
11、请写出求解该递归函数的非递归算法。m MOD n 表示 m 对 n 取模。413 假设以数组 QM存放循环队列的元素,同时设置变量 rear 与 qlen 分别指示循环队列中队尾元素的位置和队列中元素的个数。请给出此循环队列的队满条件,并写出相应的进队与出队算法(在出队算法中要求返回队头元素 )。414 编写一非递归算法,对于给定的十进制整数 n,打印出对应的 r 进制整数(2r16,r datasq - top=x;6链队列实际上是一个同时带有头指针和尾指针的单链表,尾指针指向该单链表的_。7如图所示,设输入元素的顺序是 A,B,C,D,通过栈的变换,在输出端可得到各种排列。若输出序列的第一
12、个元素为 D,则输出序列为_。8队列中允许进行删除的一端为_。9.假设以 S 和 X 分别表示进栈和退栈操作,则对输入序列 a,b,c,d,e 进行一系列栈操作SSXSXSSXXX 之后,得到的输出序列为_。10、设有一个顺序栈 S,元素 s1, s2, s3, s4, s5, s6 依次进栈,如果 6 个元素的出栈顺序为s2, s3, s4, s6, s5, s1,则顺序栈的容量至少应为多少? 11如图所示,输入元素为 A,B,C,在栈的输出端得到一个输出序列 ABC,求出在栈的输入端所有可能的输入序列。 (5 分)第五章 广义表 字符串 数组习 题51 单项选择题。(1)空的广义表是指广义
13、表。A深度为 0 B。尚未赋值C不含任何原子元素 D不含任何元素(2)广义表中元素分为。A原子元素 B表元素C原子元素和表元素 D任意元素(3)广义表的长度是指。A广义表中元素的个数 B广义表中原子元素的个数C广义表中表元素的个数 Di 广义表中括号嵌套的层数(4)广义表的深度是指。久广义表中元素的个数 B广义表中原子元素的个数C广义表中表元素的个数 D广义表中括号嵌套的层数(5)在一个长度为 n,包含 m 个原子元素的广义表中,。Am 和 n 相等 B m 不大于 n Cm 不小于 n Dm 与 n 无关(6)广义表 A=( ),(a),(b ,(c,d) 的长度为。A2 B3 C4 D5(
14、7)广义表 A:( ),(a),(b,(c,d)的深度为。A2 B3 C4 D552 有人说,m*n 阶矩阵是一种广义表结构,你认为如何?请说明你的理由。53 请分别写出下列各广义表的长度与深度:(1)A=(a)(2)B=(a,(b,c ,d) ,e ,()(3)C=(x,(y),B,A)(4)D=(A,D)56 试写出判断两个广义表是否相等的递归算法。57 根据本章介绍的 m 元多项式的表示方法,试写出一个 m 元多项式相加的算法。61 请回答空串与空格串有何区别。 62 两个字符串相等的充分必要条件是什么? 63 已知字符串 S 采用链式存储结构,链结点大小为 1。试写出求该串长度的算法。
15、 64 已知字符串 S1 与 S2 都采用链式存储结构,链结点大小为 1。试写出判断 S1 与S2 是否相等的算法。若 S1 与 S2 相等,算法返回 1 否则返回 0。 65 设串 S,S1 ,S2分别采用顺序存储结构,长度分别为 len,lenl,len2。试写一算法,用串 S2 替换串 S 中的子串 S1。 66 设串采用链式存储结构,链结点大小为 1。试写出删除 S 中从第 i 个字符开始连续 k 个字符的算法。 67 在字节编址的机器中,字符串 S1 与 S2 分别存放在字符数组 S 饥 M1与 S2M2中(LEN(S1)M1 ,LEN(S2)M2) ,并以,为串的结束标志。试写一算
16、法,求在 S1 中第一次出现而在 S2 中不出现的字符的位置。 68 已知字符串的存储结构同67 题,并且有 LEN(S1)=m,LEN(S2)=N0 试写一算法,从 S1 中位置 k 开始插入字符串 S2,并且取代 S1 中从第 k 个字符开始的连续 t 个字符。设 k+110;p+) if (p=a0 _(1)_;ap+1+=ap/10; ap=_(2)_;if (pa0) _(3)_;【函数2.2说明】函数combine(a,b,c)是计算两个整数的组合数。由于计算结果超出long int 的表示范围,故用本题【函数2.1说明】的方法存储计算结果。设整数a和b (a=b) ,它们的组合c
17、(a,b)=a!/(a-b)!*b!)。计算a和b的组合可采用以下方法:a!/(a-b)!/b!=a * (a-1) * (a-2) * * (a-b+1)/b!=u1 * u2 * * ub/(d1*d2*db)其中u 1=a,u 2=a-1,u b=a-b+1;d 1=1,d 2=2,d b=b。从而计算a和b的组合c(a,b),可变成计算上述分式。为计算上述分式,先从u 1,u 2,u b中去掉所有d 1*d2*db的因子,得到新的u 1,u 2,u b。然后再将它们相乘。以下函数中调用的外部函数gcd(a,b)是求两整数a和b最大公因子的函数;函数formal()就是本题中的函数2.1
18、。【函数2.2】void combine(int a,int b,int *c) int i,j,x,k;int dMAXN,uMAXN;for (k=0,i=a;i=a-b+1;i-) u+k=i;_(4)_;for (i=1;i t,函数返回正数。函数1.1int strcmp(char *s,char *t) while ( *s t+ ;return _(2)_;程序1.2说明在 n 行 n 列的矩阵中,每行都有最大的数,本程序求这 n 个最大数中的最小一个程序1.2#includestdio.h#define N 100int aNN;void main() int row ,col
19、 ,max ,min ,n;/*输入合法 n (100 ),和输入 m n 个整数到数组 a 的代码略*/for ( row = 0;row va1 = v;_(1)_; *p = _(2)_;NODE *reverse_copy(NODE *p) NODE *u;for( u = NULL ; p ; p = p -next ) first_insert(_(3)_);return u;void print_link( NODE *p ) for( ;_(4)_) printf (“%dt“ , p - val);printf(“n“);void free_link(NODE*p) NODE
20、 *u;while( p != NULL) u=p-next;free( p );_(5)_;void main() NODE *link1 , *link2;int i ;linkl = NULL ;for( i = 1;i #define MAXLINE 1000int maxindex(int a,int *index) int i,n;do printf(“Please input nn“);scanf(“d“, iS一1; int commstr(char *strl,char *str2, int *sublen) char*sl,*s2; int count=0, len1, l
21、en2 , k, j, i, p; len1=strlen(str1); len2=strlen(str2); if(len1len2) s1=str1;s2=str2; else len2=len1;s1=str2;s2=str1; for(j=len2;j0;j-) /* 从可能最长子串开始寻找 */ for(k=0;_(1)_ printf(“%c”, s2k+p); printf(“n”); count+; /* 计数增1 */ if (count 0 ) break; *sublen = (count0) ? _(5)_ ; 0 ; return count; 21、阅读下列函数说明
22、和代码,将应填入其中_(n)_处的字句写在答卷的对应栏内。【函数1.1说明】函数strcpy(char*to,char *from)将字符串from复制到字符串to。【函数1.1】void strcpy(char *to,char *from) while (_(1)_);函数merge(int a ,int n,int b ,int m, int *c)是将两个从小到大有序数组a和b复制合并出一个有序整数序列c,其中形参n和m分别是数组a和b的元素个数。【函数1.2】void merge(int a ,,int n,int b ,int m,,int *c) int i,j;for (i=j=0;i0) return _(4)_;else _(5)_;