数据结构练习题第三章栈队列和数组习题及答案文档格式.docx
《数据结构练习题第三章栈队列和数组习题及答案文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构练习题第三章栈队列和数组习题及答案文档格式.docx(29页珍藏版)》请在冰豆网上搜索。
IntPop(LstackTp*ls,DataType*x){LstackTp*p;
if(ls!
=NULL)
{p=ls;
ls=ls->
next;
return
(1);
}elsereturn(0);
}
15.以下运算实现在链栈上读栈顶元素,请在处用请适当句子予以填
IntGetTop(LstackTp*ls,DataType*x)
{if(ls!
=NULL){;
16.必须注意,递归定义不能是“循环定义”。
为此要求任何递归定义必须同时满足如下条件:
1被定义项在定义中的应用(即作为定义项的出现)具有;
2被定义项在最小“尺度”上的定义不是的。
17.队列简称。
在队列中,新插入的结点只能添加到
被删除的只能是排在的结点。
18.队列以线性表为逻辑结构,至少包括、、
、、五种基本运算。
19.顺序队的出、入队操作会产生“”。
20.以下运算实现在循环队上的初始化,请在处用适当句子予以填充。
VoidInitCycQueue(CycqueueTp*sq)
{;
sq->
rear=0;
21.以下运算实现在循环队上的入队列,请在处用请适当句子予以填
IntEnCycQueue(CycquereTp*sq,DataTypex)
{if((sq->
rear+1)%maxsize==)
{error(“队满”);
else{;
22.以下运算实现在循环队上的出队列,请在处用适当句子予以填充。
IntOutCycQueue(CycquereTp*sq,DataType*x)
{if(sq->
front==){error(
23.以下运算实现在循环队上判队空,请在
IntEmptyCycQueue(CycqueueTpsq)
24.以下运算实现在循环队上取队头,请在
IntGetHead(CycqueueTpsq,DataType*x)
{if(sq.rear==return(0);
else{*x=sq.data[];
25.链队在一定范围内不会出现
中无元素,此时。
26.以下运算实现在链队上的初始化,请在voidInitQueue(QueptrTp*lp)
{LqueueTp*p;
p=(LqueueTp*)malloc(sizeof(LqueueTp))
;
lq->
rear=p;
(lq->
front)->
next=;
27.以下运算实现在链队上的入队列,请在
VoidEnQueue(QueptrTp*lq,DataTypex)
p=(LqueueTp*)malloc(sizeof(LqueueTp));
=x;
next=NULL;
rear)->
队空”);
return(0);
处用适当句子予以填充。
的情况。
当lq.front==lq.rear试,队
28.以下运算实现在链队上的出队列,请在处用适当句子予以填充。
intOutQueue(QuetrTp*lq,DataType*x)
{LqueueTp*s;
if(lq->
front==lq->
rear){erroe(“队空”);
else{s=(lq->
front)->
next;
=s->
data;
next=;
if(s->
next==NULL)lq->
rear=lq->
front;
free(s);
29.以下运算实现在链队上判队空,请在处用适当句子予以填充
intEmptyQueue(QueptrTp*lq)
{if()return⑴;
elsereturn(O);
30.以下运算实现在链队上读队头元素,请在处用适当句子予以填充。
IntGetHead(QueptrTplq,DataType*x)
if(lq.rear==lq.front)return(O);
else{;
=p->
31.一般地,一个n维数组可视为其数据元素为维数组的线性表。
数组通常只有
和两种基本运算。
32,通常采用存储结构来存放数组。
对二维数组可有两种存储方法:
一种是以
为主序的存储方式,另一种是以为主序的存储方式。
C语言数组用的是以序为主序的存储方法;
FORTRAN语言用的是以序为主序的存
储方法
33•需要压缩存储的矩阵可分为矩阵和矩阵两种。
34.对称方阵中有近半的元素重复,若为每一对元素只分配一个存储空间,则可将n2个元
素压缩存储到个元素的存储空间中。
35.假设以一维数组M(1:
n(n+1)/2)作为n阶对称矩阵A的存储结构,以行序为主序存储其下三角(包括对角线)中的元素,数组M和矩阵A间对应的关系为。
36.上三角矩阵中,主对角线上的第t行(1<
=t<
=n)有个元素,按行优先顺序存
放上三角矩阵中的元素aj时,aj之前的前i-1行共有个元素,在第i行上,a°
是该行的第个元素,M[k]和aj的对应关系是。
当i>
j时,aj=c,c存放在M]中。
37.下三角矩阵的存储和对称矩阵类似。
M[K]和aj的对应关系是。
38.基于三元组的稀疏矩阵转置的处理方法有两种,以下运算按照矩阵A的列序来进行转置,
请在处用适当的句子用以填充。
Trans_Sparmat(SpMatrixTpa,SpMatrixTp*b)
{(*b).mu=a.nu;
(*b).nu=a.mu;
(*b).tu=a.tu;
if(a.tu)
{q=1;
for(col=1;
;
col++)
for(p=1;
p<
=a.tu;
p++)
if(==col)
{(*b).data[q].i=a.data[p].j;
(*b).data[q].j=a.data[p].i;
(*b).data[q].v=a.data[p].v;
39.基于三元组的稀疏矩阵转置的处理方法有两种,以下计算按照矩阵A的三元组
a.data的次序进行转置,请在处用适当的句子用以填充。
Fast_Trans_Sparmat(SpMatrixTpa,SpMatrixTp*b)
(*b).tu=a.tu=a.tu;
if(a.tu)
{for(col=1;
;
col++)num[col]=0;
for(t=1;
t<
=a,tu;
t++)num[a.data[t].j]++;
cpot[1]=1;
for(col=2;
col<
=a.nu;
col++)cpot[col]=;
{col=a.data[p].j;
q=cpot[col];
(*b).data[q].i=a.data[p].j;
40.栈称为线性表。
41.队称为线性表。
42设一个链栈的栈顶指针为ls,栈中结点的格式为infonext,栈空的条件是;
如果栈不为空,则退栈操作为p=ls;
free(p)。
43.设有二为数组intM[10][20](注:
m为O...1O,n为0...20),每个元素(整数)
栈两个存储单元,数组的起始地址为2000,元素M[5][10]的存储位置为,M[8][19]
的存储值为。
44.在具有n个单元的循环队列中,队满时共有个元素。
45.可以作为实现递归函数调用的一种数据结构。
46.数组M中每个元素的长度是3个字节,行下标i从1到8,列下标j从1到0,从
首的址EA开始连续存放在存储其中。
若按行方式存放,元素M[8][5]的起始地址为
若按列优先方式存放,元素M[8][5]的地址为。
47.对带有头结点的列队列lq,判定队列中只有一个数据元素的条件是。
48•二维数组M的成员是6个字符(每个字符栈一个存储单元)组成的串,行下标i的范围从0到8,列下标j的范围从1到10,则存放M至少需要个字节;
M的第
8列和第5行共占个字节;
若M按行方式存储,元素M[8][5]的起始地址与当M
按列优先方式存储时的元素的起始地址一致。
三、单项选择题
1•在以下栈的基本运算中,不是加工型运算的是()
1InitStack(S)②Push(S,X)③Pop(S)④empty(S)
2.以下说法正确的是()
1因链栈本身没有容量限制,故在用户内存空间的范围内不会出现栈满情况
2因顺序栈本身没有容量限制,故在用户内存空间的范围内不会出现栈满情况
3对于链栈而言,在栈满状态下,如果此时再作进栈运算,则会发生“上溢”
4对于顺序栈而言在栈满状态下如果此时再作迸栈运算,则会发生“下溢”
3•在以下队列的基本运算中,不是加工型运算的是()
1InitQueue(Q)②EnQueue(Q,X)③OutQueu(Q,X)④GetHead(Q,x)
4.顺序队列的人队操作应为
1
sq.data[sq.rear]=x
sq.rear=sq.rear+1
sq.rear=(sq.rear+1)%maxsize
2sq.data[sq.rear]=x
3sq.rear=(sq.rear+1)%maxsize;
4sq.data[sqrear]=x
5.循环队列的人队操作应为
3sq.rear=(sq.rear+1)%maxsize
4sq.data[sq.rear]=x
6.顺序队列的出队操作为()
1sq.front=(sq.front+1)%maxsize
2sq.front=sq.front+1
4sq.rear=sq.rear+1
7.循环队列的出队操作为()
1sq.front=(sq.ftont+1)%maxsize
3sq.rear=(sq.rear+)%maxsize
8.循环队列的队满条件为()
1(sq.rear+1)%mazsize==(sq.front+1)%maxsize;
2(sq.rear+1%maxsize==sq.front+1
3sq.(rear+1)%maxsize==sq.front
4sq.rear==sq.front
9.循环队列的队空条件为()
1(sq.rear+1)%maxsize==(sq.front+1)%maxsize
2(sq.rear+)%maxsize==sq.front+1
3(sp.rear+1)%maxsize==sq.front
4sq.rear==sq.front
10.数组的数据元素类型DataType可根据实际需要而定义。
以下说法完全正确的是()①数组的读运算可以读取一个数据元素整体,写运算只能修改一个数据元素的一部分
2数组的读、写运算可以读取或修改一个数据元素的一部分或一个整体
3数组的读、写运算只能读取或修改一个数据元素的一部分
4数组的读、写运算只能读取或修改一个数据元素整体
11.对于以行序为主序的存储结构来说,在数组A[ci•…di,C2•…d2]中,cl和di分别为数组A的第一个下标的上、下界,C2,d2分别为第二各下标的上、下界,每个数据元素占K
个存储单元,二维数组中任一元素a[i,j]的存储位置可由()式确定.
1Loc[i,j]=[(d2-c2+i)(i-ci)+(j-c2)]*k
2Loc[i,j]=loc[ci,c2]+[(d2-c2+i)(i-ci)+(j-c2)]*k
3Loc{i,j}=A[ci,c2]+[(d2-c2+i)(i-ci)+(j-c2)]*k
4Loc[i,j]=loc[0,0]+[(d2-c2+i)(i-ci)=(j-c2)]*k
i2对于C语言的二维数组DataTypeA[m][n],每个数据元素占K个存储单元,二维数组中任
意元素a[i,j]的存储位置可由
1Loc[i,j]=A[m,n]+[(n+i)*i+j]*k
2Loc[i,j]=loc[0,0]+[(m+n)*i+j]*k
3Loc[i,j]=loc[0,0]+[(n+i)*i+j]*k
4Loc[i,j]=[(n+i)*i+j]*k
i3.线性表的顺序存储结构是一种储结构。
①随机存取
式确定.
)的存储结构,线性表的链式存储结构是一种
)的存
②顺序存储14•如果以链表作为栈的存储结构,则退栈操作是①必须判别栈是否满②必须判别栈是否空
③判别栈元素的类型④对栈不做任何操作
i5对于基于三元组的稀疏矩阵转置的处埋方法以下说法正确的是
1按照矩阵A的列序来进行转置,算法的时间复杂度为0(nu+tu)
2按照A的三元组a.data的次序进行转置,算法的时间复杂度为
3按照矩阵A的列序来进行转置的方法称快速转置
4按照矩阵A的列序进行转置,对于tu<
<
muxnu才有意义。
16.稀疏矩阵的压缩存储方法是只存储
①非零元素②三元祖(i,j,a
17.基于三元组的稀疏矩阵,对每个非零元素
①非零元素②三元组(i,j,aij)
()
ij)③aij
aij,可以用一个(
③aij
i8如果以链表作为栈的存储结构,则退栈操作时①必须判别栈是否满②判别栈元素的类型
③必须判别栈是否空④队栈不做任何判别
19.设C语言数组Data[m+1]作为循环队列SQ的存储空间,为指针,则执行出队操作的语句为
①front=front+i
③rear=(rear+i)%m
20.三角矩阵可压缩存储到数组(
O(nu*tu)
④i,j
)唯一确定。
front为队头指针,
rear为队
)
②front=(front+i)%m
④front=(front+i)%(m+i))中。
①M[1:
n(n+1)/2+1]②M[1:
n(n+1)/2]
③M[n(n+1)/2+1]④M[n(n+1)/2]
21.设有一顺序栈S,元素S1,S2,s3,s4,s5,s6依次进栈,如果6个元素出线的顺序是
S5,S1,则栈的容量至少应该是()
①2②3③5④6
22.设有一顺序栈已含3个元素,如下图所示,元素a4正等待进栈。
那么下列中不可能出现的出栈序列是
01
S2,S3,S4,S6,
4个序列
sq
①a3,a1,a4,a2
23.向一个栈顶指针为
①Top->
next=s
③s->
next=Top;
Top=s
a1
a2
a3
maxsize-1
23
Ttop
②a3,a2,a4,a1③a3,a4,a2,a1
Top的链中插入一个s所指结点时,其操作步骤为
②s->
next=Top->
Top->
④s->
Top=Top->
next
并将被删节点的值保存到
④a4,a3,a2,a1
(
24.从栈顶指针为Top的链栈中删除一个结点,
①x=Top->
next②Top=Top->
x=Top->
data
③x=Top;
next④x=Top->
25.在一个链队中,若f,r分别为队首、队尾指针,则插入s所指结点的操作为
①f->
next=c;
f=s②r->
next=s;
r=s
next=r;
r=s④s->
next=f;
f=s
26常对数组进行的两种基本操作是
①建立与删除②索引与修改③查找与修改
27.链栈与顺序栈相比,有一个比较明显的优点即
①插入操作更方便②通常不会出现栈满的情况
③不会出现栈空的情况④删除操作更方便
28•若采用三元组压缩技术存储稀疏矩阵,只要把每个元素的行下标和列下标互换,就完成了对该矩阵的转置运算,这种观点(
①正确②错误
29.二为数组M[i,j]的元素是4个字符(每个字符占一个存储单元)组成的串,行下标范围从0到4,列下标j的范围从0到5。
M按行存储时元素M[3,5]的起始地址与储时元素()
①M[2,4]
x中,
其操作步骤为
④查找与索引
i的
M按列存
30.一个栈的入栈序列是
①edcba
31.一个队列的人列序是
①4,3,2,1
的起始地址相同。
②M[3,4]③M[3,5]
a,b,c,d,e,贝U栈的不可能的输出序列是
②decba③dceab
1,2,3,4,则队列的输出系列是
②1,2,3,4,③1,4,3,
④M[4,4]
④abcde
④3,2,4,
32.设计一个判别表达式中左、右括号是否配对出线的算法,采用(
①线性标的顺序存储结构
③队列
33.若已知一个栈的输入序列为
P1为
①i
②栈
④线性表的链式存储结构
1,2,3,…,n,其输出序列为R、
②n=i
③n-i+1
④不确定
)数据结构最佳。
F2、...Pn。
若p1=n,则
34.以下说法正确的是
①顺序队和循环队的队满和队空判断条件是一样的②栈可以作为实现过程调用的一种数据结构
3插人和删除操作是数据结构中最基本的两种操作,所以这两种操作在数组中也经常使用
4在循环队列中,front指向队列中第一个元素的前一位置,rear指向实际的队尾元素,队列为满的条件front=rear
35.以下说法正确的是
1数组是同类型值的集合
2数组是一组相继的内存单元
3数组是一种复杂的数据结构,数组元素之间的关系,既不是线性的,也不是树形的
4使用三元组表表示稀疏矩阵的元素,有时并不能节省存储空间
四、简答及应用
1.简述顺序栈的类型定义。
2.简述链栈的类型定义。
3.简述顺序队列、循环队列的类型定义。
4.简述链队的类型定义。
5,写出基于三元组的稀疏矩阵的类型说明。
6.对于循环队列,试写出求队列长度的算法。
7.设有编号为t,2,3,4的四辆列车。
顺序进入一个占世界共的展台,试写出这四两列车开出车站的所有可能的顺序。
8设有上三角矩阵(aj)n*n,将其上三角元素逐行存于数组B(1:
m)中(m充分大),使得B[k]=a耳
且k=fl(i)+f2(j)+C。
是推导出函数fl,f2和常数C(要求f1和f2中不含常数项)。
9.设有三对角矩阵(aij)n*n,将其三条对角线上的元素逐行存于数组B(1:
3n-2)中,使得
B[k]=aij,求:
(1)用i、j表示k的下标变换公式;
(2)用k表示i、j的下标变换公式.