ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:65.42KB ,
资源ID:8220593      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8220593.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第3课 栈队列和数组100927.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

第3课 栈队列和数组100927.docx

1、第3课 栈队列和数组100927第三课 栈、队列和数组一 选择题1对于栈操作数据的原则是( )。A先进先出 B后进先出 C后进后出 D不分顺序参考答案:B2一个栈的输入序列为123n,若输出序列的第一个元素是n,输出第i(1=i0) ? x* f(x-1):2);int i;i =f(f(1);A2 B4 C8 D无限递归参考答案:B9表达式a*(b+c)-d的后缀表达式是( )。Aabcd*+- Babc+*d- Cabc*+d- D-+*abcd参考答案:B10表达式3*2(4+2*2-6*3)-5求值过程中当扫描到6时,对象栈和算符栈为( ),其中为乘幂。A3,2,4,1,1;(*(+*

2、- B3,2,8;(*- C3,2,4,2,2;(*(- D3,2,8;(*(-参考答案:D11用不带头结点的单链表存储队列时,其队头指针指向队头结点,其队尾指针指向队尾结点,则在进行删除操作时( )。A仅修改队头指针 B仅修改队尾指针C队头、队尾指针都要修改 D队头、队尾指针都可能要修改参考答案:D12递归过程或函数调用时,处理参数及返回地址,要用一种称为( )的数据结构。A队列 B多维数组 C栈 D线性表参考答案:C13循环队列A0.m-1存放其元素值,用front和rear分别表示队头和队尾,则当前队列中的元素数是( )。A(rear-front+m)%m Brear-front+1 C

3、rear-front-1 Drear-front参考答案:A14循环队列存储在数组A0.m中,则入队时的操作为( )。Arear=rear+1 Brear=(rear+1) mod (m-1)Crear=(rear+1) mod m Drear=(rear+1) mod (m+1)参考答案:D15若用一个大小为6的数组来实现循环队列,且当前rear和front的值分别为0和3,当从队列中删除一个元素,再加入两个元素后,rear和front的值分别为多少?( )A1和5 B2和4 C4和2 D5和1参考答案:B16最大容量为n的循环队列,队尾指针是rear,队头是front,则队空的条件是( )

4、。A(rear+1) MOD n=front Brear=frontCrear+1=front D(rear-l) MOD n=front参考答案:B17设栈S和队列Q的初始状态为空,元素e1,e2,e3,e4,e5和e6依次通过栈S,一个元素出栈后即进队列Q,若6个元素出队的序列是e2,e4,e3,e6,e5,e1则栈S的容量至少应该是( )。A6 B4 C3 D2参考答案:C18数组A0.4,-1.-3,5.7中含有元素的个数( )。A55 B45 C36 D16参考答案:B19设二维数组A1.m,1.n(即m行n列)按行存储在数组B1.m*n中,则二维数组元素Ai,j在一维数组B中的下标

5、为( )。A(i-1)*n+j B(i-1)*n+j-1 Ci*(j-1) Dj*m+i-1参考答案:A20设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,a11为第一元素,其存储地址为1,每个元素占一个地址空间,则a85的地址为( )。A13 B33 C18 D40参考答案:B21设有数组Ai,j,数组的每个元素长度为3字节,i的值为1 到8 ,j的值为1 到10,数组从内存首地址BA开始顺序存放,当用以列为主存放时,元素A5,8的存储首地址为( )。ABA+141 BBA+180 CBA+222 DBA+225参考答案:B22数组A0.5,0.6的每个元素占五个字节,将其按列

6、优先次序存储在起始地址为1000的内存单元中,则元素A5,5的地址是( )。A1175 B1180 C1205 D1210参考答案:A23将一个A1.100,1.100的三对角矩阵,按行优先存入一维数组B1298中,A中元素A66,65(即该元素下标i=66,j=65),在B数组中的位置K为( )。A198 B195 C197 D196参考答案:B24对稀疏矩阵进行压缩存储目的是( )。A便于进行矩阵运算 B便于输入和输出 C节省存储空间 D降低运算的时间复杂度参考答案:C25有一个100*90的稀疏矩阵,非0元素有10个,设每个整型数占2字节,则用三元组表示该矩阵时,所需的字节数是( )。A

7、60 B66 C18000 D33参考答案:B26算术表达式a+b*(c+d/e)转为后缀表达式后为( )。Aab+cde/* Babcde/+*+ Cabcde/*+ Dabcde*/+参考答案:B二、应用题1有5个元素,其入栈次序为A、B、C、D、E,在各种可能的出栈次序中,以元素C,D最先出栈(即C第一个且D第二个出栈)的次序有哪几个?参考答案:CDEBA,CDBEA,CDBAE2如果输入序列为1 2 3 4 5 6,试问能否通过栈结构得到以下两个序列:4 3 5 6 1 2和1 3 5 4 2 6,请说明为什么不能或如何才能得到。参考答案:输入序列为123456,不能得出435612,

8、其理由是,输出序列最后两元素是12,前面4个元素(4356)得到后,栈中元素剩12,且2在栈顶,不可能栈底元素1在栈顶元素2之前出栈。得到135426的过程如下:1入栈并出栈,得到部分输出序列1;然后2和3入栈,3出栈,部分输出序列变为:13;接着4和5入栈,5,4和2依次出栈,部分输出序列变为13542;最后6入栈并退栈,得最终结果135426。3试证明:若借助栈由输入序列1,2,n得到输出序列为P1,P2,Pn(它是输入序列的一个排列),则在输出序列中不可能出现这样的情形:存在着ijk,使PjPkPi。参考答案:如果ij,则对于pipj的情况,则说明要将pj压到pi之上,也就是在pj出栈之

9、后pi才能出栈。这就说明,对于ijk,不可能出现pjpkpi的输出序列。换句话说,对于输入序列1,2,3,不可能出现3,1,2的输出序列。4用栈实现将中缀表达式8-(3+5)*(5-6/2)转换成后缀表达式,画出栈的变化过程图。参考答案:中缀表达式8-(3+5)*(5-6/2)的后缀表达式是: 8 3 5 + 5 6 2 / - * -表达式生成过程为:中缀表达式exp1转为后缀表达式exp2的规则如下:设操作符栈s,初始为空栈后,压入优先级最低的操作符#。对中缀表达式从左向右扫描,遇操作数,直接写入exp2;若是操作符(记为w),分如下情况处理,直至表达式exp1扫描完毕。(1)w为一般操作

10、符(+,-,*,/等),要与栈顶操作符比较优先级,若w优先级高于栈顶操作符,则入栈;否则,栈顶运算符退栈到exp2,w再与新栈顶操作符作上述比较处理,直至w入栈。(2)w为左括号(),w入栈。(3)w为右括号(),操作符栈退栈并进入exp2,直到碰到左括号为止,左括号退栈(不能进入exp2),右括号也丢掉,达到exp2中消除括号的目的。(4)w为#,表示中缀表达式exp1结束,操作符栈退栈到exp2,直至碰到#,退栈,整个操作结束。这里,再介绍一种简单方法。中缀表达式转为后缀表达式有三步:首先,将中缀表达式中所有的子表达式按计算规则用嵌套括号括起来;接着,顺序将每对括号中的运算符移到相应括号的

11、后面;最后,删除所有括号。例如,将中缀表达式8-(3+5)*(5-6/2)转为后缀表达式。按如上步骤:执行完上面第一步后为:(8-(3+5)*(5-(6/2);执行完上面第二步后为:(8(35)+(5(62)/)-)*)- ;执行完上面第三步后为:8 3 5 + 5 6 2 / - * - 。可用类似方法将中缀表达式转为前缀表达式。5设输入元素为1、2、3、P和A,输入次序为123PA。元素经过栈后达输出序列,当所有元素均到达输出序列后,有哪些序列可以作为高级语言的变量名。参考答案:一般高级语言的变量名是以字母开头的字母数字序列。故本题答案是AP321,PA321,P3A21,P32A1,P3

12、21A。6简述如下算法功能。Status ex1(Stack S,int e) InitStack(T); while(!StackEmpty(S) Pop(S,d); if(d!=e) Push(T,d); while(!StackEmpty(T) Pop(T,d); Push(S,d); /ex1参考答案:删除栈S中所有值为e的数据元素。分析:Status ex1(Stack S,int e) InitStack(T); /初始化辅助栈T while(!StackEmpty(S)/若栈S非空则执行循环体 Pop(S,d); /栈S中栈顶元素出栈 if(d!=e) Push(T,d); /若

13、刚才出栈的元素的值不等于e,则入辅助栈T while(!StackEmpty(T)/若栈T非空则执行循环体 Pop(T,d);/栈T中元素出栈 Push(S,d);/刚才出栈的元素入栈S /ex17写出如下程序段输出结果。void ex3() char x=e,y=c; InitQueue(Q); EnQueue(Q,h); EnQueue(Q,r); EnQueue(Q,y); DeQueue(Q,x); EnQueue(Q,x); DeQueue(Q,x); EnQueue(Q,a); while(!QueueEmpty(Q) DeQueue(Q,y); printf(y); /while

14、 printf(x);/ex3参考答案:char8将如下递归过程改写为非递归过程。void test(int &sum) int x; scanf(x); if (x=0) sum=0; else test(sum); sum+=x; printf(sum);参考答案:void test(int &sum) Stack S; int x; scanf(x); InitStack(S); while(x) Push(S,x); scanf(x); sum=0; printf(sum); while(Pop(S,x) sum+=x; printf(sum); int ack(int m,int n

15、) if (!m) return n+1; else if(!n) return ack(m-1,1); else return ack(m-1,ack(m,n-1);/ack参考答案:int ack(int m,int n) InitStack(SM); InitStack(SN); Push(SM,m); Push(SN,n); While(!StackEmpty(SM) Pop(SM,mp); Pop(SN,np); If(!mp) Push(SN,np+1); Else If (!np) Push(SM,m-1); Push(SN,1); Else Push(SM,m-1); Push

16、(SM,m); Push(SN,n-1); Pop(SN,np); return np;9三维数组A1.10,-2.6,2.8的每个元素的长度为4个字节,试问该数组要占多少个字节的存储空间?如果数组元素以行优先的顺序存贮,设第一个元素的首地址是100,试求元素A5,0,7 的存贮首地址。参考答案:数组占的存储字节数=10*9*7*4=2520;A5,0,7的存储地址=100+4*9*7+2*7+5*4=118410若按照压缩存储的思想将nn阶的对称矩阵A的下三角部分(包括主对角线元素)以行序为主序方式存放于一维数组B1.n(n+1)/2中,那么,A中任一个下三角元素aij(ij),在数组B中的

17、下标位置k是什么?A中任一个下三角元素aij(ij),在数组B中的下标位置k是什么?参考答案:k=i(i-1)/2+jk=j(j-1)/2+i11设有三对角矩阵(ai,j)mn,将其三条对角线上的元素逐行的存于数组B(1:3n-2)中,使得Bk=ai,j,求:用i,j表示k的下标变换公式;若n=103,每个元素占用L个单元,则用BK方式比常规存储节省多少单元。参考答案:k = 3(i-1) (主对角线左下角,即i=j+1)k = 3(i-1)+1 (主对角线上,即i=j)k = 3(i-1)+2 (主对角线上,即i=j-1)由以上三式,得 k=2(i-1)+j (1i,jn; 1k3n-2)1

18、03*103-(3*103-2)12设有矩阵且a=,执行下列语句后,矩阵和的结果分别是什么?for( i=1 ;i=3 ; i+ )for( j=1 ;j=3 ; j+ ) cij=aaij,aji; for( i=1 ;i=3 ; i+ )for( j=1 ;j=3 ; j+ ) aij=aaij,aji;参考答案:c=a=三、算法设计题1设有两个栈S1,S2都采用顺序栈方式,并且共享一个存储区0.maxsize-1,为了尽量利用空间,减少溢出的可能,可采用栈顶相向,迎面增长的存储方式。试设计S1,S2有关入栈和出栈的操作算法。参考答案:两栈共享向量空间,将两栈栈底设在向量两端,初始时,s1

19、栈顶指针为-1,s2栈顶为maxsize。两栈顶指针相邻时为栈满。两栈顶相向,迎面增长,栈顶指针指向栈顶元素。#define maxsize 两栈共享顺序存储空间所能达到的最多元素数#define Elemtype int /假设元素类型为整型typedef structElemtype stackmaxsize; /栈空间int top2; /top为两个栈顶指针stk;stk s; /s是如上定义的结构类型变量,为全局变量入栈操作int push(int i,int x)/入栈操作。i=0表示左边的栈s1,i=1表示右边的栈s2,x是入栈元素。入栈成功返回1,否则返回0。if(i1)pri

20、ntf(“栈号输入不对”);exit(0);if(s.top1-s.top0=1) printf(“栈已满n”);return(0);switch(i)case 0: s.stack+s.top0=x; return(1); break;case 1: s.stack-s.top1=x; return(1); /push出栈操作Elemtype pop(int i)/退栈算法。i代表栈号,i=0时为s1栈,i=1时为s2栈。退栈成功返回退栈元素,否则返回-1。if(i1)printf(“栈号输入错误n”);exit(0);switch(i)case 0:if(s.top0=-1) printf

21、(“栈空n”); return -1;else return(s.stacks.top0-);case 1:if(s.top1=maxsize) printf(“栈空n”); return -1;else return(s.stacks.top1+);/算法结束2设从键盘输入一列整数:a1, a2, a3,an,试编写算法实现:用栈结构存储输入的整数,当ai-1时,将ai进栈;当ai=-1时,输出栈顶整数并出栈。算法应对异常情况(入栈满等)给出相应的信息。参考答案:#define maxsize 栈空间容量void InOutS(int smaxsize)/s是元素为整数的栈,本算法进行入栈和

22、出栈操作。int top=0; /top为栈顶指针,定义top=0时为栈空。for(i=1; ij)printf(“序列非法n”); exit(0);i+; /不论Ai是I或O,指针i均后移if(j!=k) printf(“序列非法n”); return(false);else printf(“序列合法n”);return(true);/在入栈出栈序列(即由I和O组成的字符串)的任一位置,入栈次数(I的个数)都必须大于等于出栈次数(即O的个数),否则视作非法序列,立即给出信息,退出算法。整个序列(即读到字符数组中字符串的结束标记0),入栈次数必须等于出栈次数(题目中要求栈的初态和终态都为空),

23、否则视为非法序列。4设计一个算法,判断一个算术表达式中的括号是否配对。算术表达式保存在带头结点的单循环链表中,每个结点有两个域:ch和link,其中ch域为字符类型。参考答案:表达式中的括号有以下三对:(、)、,使用栈,当为左括号时入栈,右括号时,若栈顶是其对应的左括号,则退栈,若不是其对应的左括号,则结论为括号不配对。当表达式结束,若栈为空,则结论表达式括号配对,否则,结论表达式括号不配对。int Match(LinkedList la)/算术表达式存储在以la为头结点的单循环链表中,本算法判断括号是否正确配对char s; /s为字符栈,容量足够大p=la-next; /p为工作指针,指向

24、待处理结点StackInit(s); /初始化栈swhile (p!=la) /循环到头结点为止 switch (p-ch)case (: push(s,p-ch); break;case ): if(StackEmpty(s)|StackGetTop(s)!=() printf(“括号不配对n”); return(0);else pop(s);break;case : push(s,p-ch); break;case : if(StackEmpty(s)|StackGetTop(s)!=) printf(“括号不配对n”); return(0);else pop(s);break;case : push(s,p-ch); break;case : if(StackEmpty(s)|StackGetTop(s)!=)printf(“括号不配对n”); retu

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1