第3课-栈、队列和数组_第1页
第3课-栈、队列和数组_第2页
第3课-栈、队列和数组_第3页
第3课-栈、队列和数组_第4页
第3课-栈、队列和数组_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1 / 7 第三课 栈、队列和数组一选择题1对于栈操作数据的原则是() 。a先进先出b后进先出c后进后出d不分顺序2一个栈的输入序列为123n,若输出序列的第一个元素是n,输出第i(1=i0) ? x* f(x-1):2); int i; i =f(f(1); a2 b4 c8 d无限递归9表达式a*(b+c)-d 的后缀表达式是() 。a abcd*+- babc+*d- cabc*+d- d -+*abcd 10表达式 3*2(4+2*2-6*3)-5求值过程中当扫描到6 时,对象栈和算符栈为() ,其中为乘幂。a3,2,4,1,1;(*(+*- b3,2,8;(*- c3,2,4,2,2

2、;(*(- d3,2,8;(*(- 2 / 7 11用不带头结点的单链表存储队列时,其队头指针指向队头结点,其队尾指针指向队尾结点,则在进行删除操作时() 。a仅修改队头指针b仅修改队尾指针c队头、队尾指针都要修改d队头、队尾指针都可能要修改12递归过程或函数调用时,处理参数及返回地址,要用一种称为()的数据结构。a队列b多维数组c栈d线性表13循环队列a0.m-1 存放其元素值,用front 和 rear 分别表示队头和队尾,则当前队列中的元素数是() 。a (rear-front+m)%m brear-front+1 crear-front-1 d rear-front 14循环队列存储在

3、数组a0.m 中,则入队时的操作为() 。a rear=rear+1 brear=(rear+1) mod (m-1) c rear=(rear+1) mod m d rear=(rear+1) mod (m+1) 15若用一个大小为6 的数组来实现循环队列,且当前rear 和 front 的值分别为0 和 3,当从队列中删除一个元素,再加入两个元素后,rear 和 front 的值分别为多少?()a1 和 5 b 2和 4 c4 和 2 d5 和 1 16最大容量为n 的循环队列,队尾指针是rear,队头是front,则队空的条件是() 。a (rear+1) mod n=front bre

4、ar=front crear+1=front d(rear-l) mod n=front 17设栈 s 和队列 q 的初始状态为空,元素e1,e2,e3,e4,e5和 e6 依次通过栈s,一个元素出栈后即进队列q,若 6 个元素出队的序列是e2,e4,e3, e6,e5,e1 则栈 s 的容量至少应该是() 。a6 b4 c3 d2 18数组 a0.4,-1.-3,5.7 中含有元素的个数() 。a55 b45 c36 d 16 19设二维数组a1.m ,1.n(即 m 行 n 列)按行存储在数组b1.m*n 中,则二维数组元素 ai ,j在一维数组b 中的下标为() 。a (i-1)*n+j

5、 b(i-1)*n+j-1 ci*(j-1) dj*m+i-1 20设有一个10 阶的对称矩阵a,采用压缩存储方式,以行序为主存储,a11为第一元素,其存储地址为1,每个元素占一个地址空间,则a85的地址为() 。a13 b 33 c18 d40 21设有数组ai,j ,数组的每个元素长度为3 字节, i 的值为 1 到 8 ,j 的值为 1 到 10,数组从内存首地址ba 开始顺序存放,当用以列为主存放时,元素a5 ,8的存储首地址为() 。aba+141 bba+180 cba+222 dba+225 3 / 7 22数组 a0.5,0.6 的每个元素占五个字节,将其按列优先次序存储在起始

6、地址为1000 的内存单元中,则元素a5 ,5的地址是() 。a1175 b1180 c 1205 d1210 23将一个a1.100 ,1.100的三对角矩阵,按行优先存入一维数组b1 298中, a 中元素 a66,65(即该元素下标i=66,j=65) ,在 b 数组中的位置k 为() 。a198 b195 c197 d196 24对稀疏矩阵进行压缩存储目的是() 。a便于进行矩阵运算b便于输入和输出c节省存储空间d降低运算的时间复杂度25有一个 100*90 的稀疏矩阵,非0 元素有 10 个,设每个整型数占2 字节,则用三元组表示该矩阵时,所需的字节数是() 。a60 b 66 c1

7、8000 d33 二、应用题1有 5 个元素,其入栈次序为a、b、c、d、e,在各种可能的出栈次序中,以元素c,d最先出栈(即c 第一个且d 第二个出栈)的次序有哪几个?2如果输入序列为1 2 3 4 5 6,试问能否通过栈结构得到以下两个序列:4 3 5 6 1 2 和 1 3 5 4 2 6,请说明为什么不能或如何才能得到。3试证明:若借助栈由输入序列1,2,n 得到输出序列为p1,p2,pn(它是输入序列的一个排列) ,则在输出序列中不可能出现这样的情形:存在着ijk, 使 pjpkpi。参考答案:如果 ij,则对于pipj的情况,则说明要将pj压到 pi之上,也就是在pj出栈之后pi才

8、能出栈。 这就说明, 对于 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,初始为空栈后,压入优先级最低的操作符# 。对中缀表达式从左向右(2)8 3 5 + 5 6 2#*#( 3)8 3 5 + 5 6 2 / -( 4)8 3 5 + 5

9、 6 2 / - * -#*(/)-)(1)8 3 5#(+-4 / 7 扫描,遇操作数, 直接写入exp2;若是操作符 (记为 w) ,分如下情况处理, 直至表达式exp1扫描完毕。(1)w 为一般操作符(+, - ,*,/ 等) ,要与栈顶操作符比较优先级,若w 优先级高于栈顶操作符,则入栈;否则,栈顶运算符退栈到exp2,w 再与新栈顶操作符作上述比较处理,直至w 入栈。(2)w 为左括号( ( ) ,w 入栈。(3)w 为右括号( ) ) ,操作符栈退栈并进入exp2,直到碰到左括号为止,左括号退栈(不能进入exp2) ,右括号也丢掉,达到exp2 中消除括号的目的。(4)w 为 #

10、,表示中缀表达式exp1 结束,操作符栈退栈到exp2,直至碰到 # ,退栈,整个操作结束。这里,再介绍一种简单方法。中缀表达式转为后缀表达式有三步:首先,将中缀表达式中所有的子表达式按计算规则用嵌套括号括起来;接着, 顺序将每对括号中的运算符移到相应括号的后面;最后,删除所有括号。例如,将中缀表达式8-(3+5)*(5-6/2 )转为后缀表达式。按如上步骤:执行完上面第一步后为:(8-(3+5)*(5-(6/2);执行完上面第二步后为:(8(35)+(5(62)/)-)*)- ;执行完上面第三步后为:8 3 5 + 5 6 2 / - * - 。可用类似方法将中缀表达式转为前缀表达式。5设输

11、入元素为1、2、3、p 和 a,输入次序为123pa。元素经过栈后达输出序列,当所有元素均到达输出序列后,有哪些序列可以作为高级语言的变量名。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 7写出如下程序段输出结果。void ex3() char x=e,y=c; initqueue(q); enqueue(q,h); enqueue(q,r); e

12、nqueue(q,y); dequeue(q,x); enqueue(q,x); 5 / 7 dequeue(q,x); enqueue(q,a); while(!queueempty(q) dequeue(q,y); printf(y); /while printf(x); /ex3 8将如下递归过程改写为非递归过程。void test(int &sum) int x; scanf(x); if (x=0) sum=0; else test(sum); sum+=x; printf(sum); int ack(int m,int n) if (!m) return n+1; else

13、 if(!n) return ack(m-1,1); else return ack(m-1,ack(m,n-1); /ack 9三维数组a1.10,-2.6,2.8 的每个元素的长度为4 个字节, 试问该数组要占多少个字节的存储空间?如果数组元素以行优先的顺序存贮,设第一个元素的首地址是100,试求元素a5,0,7 的存贮首地址。10若按照压缩存储的思想将nn 阶的对称矩阵a 的下三角部分(包括主对角线元素)以行序为主序方式存放于一维数组b1.n(n+1)/2 中,那么, a 中任一个下三角元素aij(ij),在数组 b 中的下标位置k 是什么? a 中任一个下三角元素aij(ij),在数组

14、 b 中的下标位置k 是什么?11设有三对角矩阵(ai,j)mn,将其三条对角线上的元素逐行的存于数组b(1:3n-2) 中,使得bk=ai,j,求:用i,j 表示 k 的下标变换公式;若n=103,每个元素占用l 个单元,则用bk 方式比常规存储节省多少单元。6 / 7 12设有矩阵且a=121133312,执行下列语句后,矩阵和的结果分别是什么?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; 三、算法设计题1设有两个

15、栈s1,s2都采用顺序栈方式,并且共享一个存储区0.maxsize-1 ,为了尽量利用空间,减少溢出的可能,可采用栈顶相向,迎面增长的存储方式。试设计s1,s2有关入栈和出栈的操作算法。2设从键盘输入一列整数:a1, a2, a3, an,试编写算法实现:用栈结构存储输入的整数,当 ai -1 时,将 ai进栈;当 ai=-1 时,输出栈顶整数并出栈。算法应对异常情况(入栈满等)给出相应的信息。3假设以i 和 o 分别表示入栈和出栈操作。栈的初态和终态均为空,入栈和出栈的操作序列可表示为仅由i 和 o 组成的序列, 称可以操作的序列为合法序列,否则称为非法序列。下面所示的序列中哪些是合法的?a

16、 ioiioioo b iooioiio c iiioioio diiiooioo 。通过对的分析,写出一个算法, 判定所给的操作序列是否合法。若合法,返回 true,否则返回false(假定被判定的操作序列已存入一维数组中)。4设计一个算法,判断一个算术表达式中的括号是否配对。算术表达式保存在带头结点的单循环链表中,每个结点有两个域:ch 和 link ,其中 ch 域为字符类型。5如果允许在循环队列的两端都可以进行插入和删除操作。要求:写出循环队列的类型定义;写出“从队尾删除”和“从队头插入”的算法。用一维数组v0.m-1 实现循环队列,其中m 是队列长度。设队头指针front 和队尾指针

17、 rear,约定 front 指向队头元素的前一位置,rear 指向队尾元素。 定义 front=rear 时为队空,(rear+1)%m=front 为队满。 约定队头端入队向下标小的方向发展,队尾端入队向下标大的方向发展。6已知 ackermann 函数定义如下,写出ack(2,1) 的计算过程;写出计算ack(m,n) 的非递归算法。7利用两个栈s1 和 s2模拟一个队列,写出入队和出队的算法(可用栈的基本操作)。8假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),试编写相应的队列初始化、入队和出队的算法。7 / 7 9设有大小不等的n 个数据组( n 个数据组中数据的总数为m) ,顺序存放在空间区d 内,每个数据占一个存储单元,数据组的首地址由数组s 给出, (如下图所示) ,试编写将新数据x 插

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论