最新数据结构练习题 第三章 栈、队列和数组 习题及答案
数据结构第三章栈和队列练习及答案

数据结构第三章栈和队列练习及答案⼀、选择题1、栈中存取数据的原则()A、先进先出B、先进后出C、后进后出D、随意进出2、队列中存取数据的原则()A、先进先出B、后进先出C、先进后出D、随意进出3、插⼊和删除只能在⼀端进⾏的线性表,称为()A、队列B、循环队列C、栈D、循环栈4、在栈中,出栈操作的时间复杂度为()A、O(1)B、O(log2n)C、O(n)D、O(n2)5、设长度为n的链队列⽤单循环链表表⽰,若只设头指针,则⼊队操作的时间复杂度为()A、O(1)B、O(log2n)C、O(n)D、O(n2)6、设长度为n的链队列⽤单循环链表表⽰,若只设头指针,则出队操作的时间复杂度为()A、O(1)B、O(log2n)C、O(n)D、O(n2)7、⼀个线性表的第⼀个元素的存储地址是100,每个元素的长度是2,则第5个元素的地址是()A、110B、108C、100D、1208、⼀个栈的⼊栈序列是a,b,c,d,e,则栈的不可能的输出序列是()A、edcbaB、decbaC、dceabD、abcde9、若已知⼀个栈的⼊栈序列是1,2,3,……,n,其输出序列是p1,p2,p3,……,pn,若p1=n,则pi为()A、iB、n=iC、n-i+1D、不确定10、判断⼀个栈ST(最多元素m0)为空的条件是()A、ST->top==0B、ST->top==-1C、ST->top!=m0D、ST->top==m011、判断⼀个栈ST(最多元素m0)为满的条件是()A、ST->top!=0B、ST->top==0C、ST->top!=m0D、ST->top==m012、判断⼀个循环队列QU(最多元素为m0)为空的条件是()A、QU.front==QU.rearB、QU.front!=QU.rearC、QU.front==(QU.rear+1)%m0D、QU.front!=(QU.rear+1)%m013、判断⼀个循环队列QU(最多元素为m0)为满的条件是()A、QU.front==QU.rearB、QU.front!=QU.rearC、QU.front==(QU.rear+1)%m0D、QU.front!=(QU.rear+1)%m014、循环队列⽤数组存放其元素值A[0,m-1],已知其头尾指针分别是rear和front,则当前队列的元素个数是()A、(rear-front+m)%mB、rear-front+1C、rear-front-1D、rear-front15、栈和队列的共同特点是()A、都是先进后出B、都是先进先出C、只允许在端点处插⼊和删除D、没有共同点⼆、填空题1、设长度为n的链队列⽤单循环链表表⽰,若只设头指针,则⼊队和出队操作的时间复杂度分别为(O(N))和(O(1));若⼜设尾指针,则⼊队和出队操作的时间复杂度分别为(O(1))和(O(1))。
数据结构练习题第三章栈、队列和数组习题含答案

return(1);} } 12. 以下运算实现在链栈上的初始化,请在________________处用请适当句子予以填充。 Void InitStacl(LstackTp *ls){ ________________;} 13.` 以下运算实现在链栈上的进栈,请在处用请适当句子予以填充。 Void Push(LStackTp *ls,DataType x) { LstackTp *p;p=malloc(sizeof(LstackTp));
else return(0); } 16.必须注意,递归定义不能是“循环定义”。为此要求任何递归定义必须同时满足如下 条件: ①被定义项在定义中的应用(即作为定义项的出现)具有________________; ②被定义项在最小“尺度”上的定义不是________________的。 17. 队 列 简 称 ________________。 在 队 列 中 , 新 插 入 的 结 点 只 能 添 加 到 ________________,被删除的只能是排在________________的结点。 18. 队 列 以 线 性 表 为 逻 辑 结 构 , 至 少 包 括 ________________、 ________________、 ________________、________________ ________________、五种基本运算。 19.顺序队的出、入队操作会产生“________________”。 20.以下运算实现在循环队上的初始化,请在________________处用适当句子予以填充。 Void InitCycQueue(CycqueueTp *sq) { ________________;sq->rear=0;} 21. 以下运算实现在循环队上的入队列,请在________________处用请适当句子予以填 充。 Int EnCycQueue(CycquereTp *sq,DataType x) { if((sq->rear+1)%maxsize== ________________)
数据结构习题集:第3章栈和队列

一、选择题
1.栈结构通常采用的两种存储结构是(A)。
A、顺序存储结构和链表存储结构B、散列和索引方式
C、链表存储结构和数组D、线性链表结构和非线性存储结构
2.设栈ST用顺序存储结构表示,则栈ST为空的条件是(B)
A、ST.top-ST.base<>0B、ST.top-ST.base==0
5.在对链队列(带素个数为rear-front。
7.一个栈的输入序列是1,2,3,4,则在栈的输出序列中可以得到4,3,1,2。
8.一个栈的输入序列是1,2,3,4,则在栈的输出序列中可以得到1,2,3,4。
9.若以链表作为栈的存储结构,则进栈需要判断栈是否满。
图3.1
21.链栈和顺序栈相比,有一个比较明显的优势是()
A、通常不会出现栈满的情况B、通常不会出现栈空的情况
C、插入操作更容易实现D、删除操作更加容易实现
22.若一个栈的输入序列是1,2,3,4,…,n,输出序列的第一个元素是n,则第i个输出元素是(C)
A、不确定B、n-iC、n-i+1D、n-i-1
A、Q.rear=Q.front->next;B、Q.rear->next=Q.rear->next->next;
C、Q.front->next=Q.front->next->next;D、Q.front=Q.rear->next;
15.用不带头结点的单链表存储队列,其队头指针指向队头结点,队尾指针指向队尾结点,则在进行出队操作时()
A、仅修改队头指针B、仅修改队尾指针
C、队头尾指针都要修改D、队头尾指针都可能要修改。
16.栈和队列的共同点是()
数据结构练习题第三章栈、队列和数组习题及答案

第三章栈、队列和数组一、名词解释:1.栈、栈顶、栈底、栈顶元素、空栈2.顺序栈3.链栈4.递归5.队列、队尾、队头6.顺序队7.循环队8.队满9.链队10.随机存储结构11.特殊矩阵12.稀疏矩阵13.对称方阵14.上(下)三角矩阵二、填空题:1.栈修改的原则是_________或称________,因此,栈又称为________线性表。
在栈顶进行插入运算,被称为________或________,在栈顶进行删除运算,被称为________或________。
2.栈的基本运算至少应包括________、________、________、________、________五种。
3.对于顺序栈,若栈顶下标值top=0,此时,如果作退栈运算,则产生“________”。
4.对于顺序栈而言,在栈满状态下,如果此时在作进栈运算,则会发生“________”。
5.一般地,栈和线性表类似有两种实现方法,即________实现和________实现。
6.top=0表示________,此时作退栈运算,则产生“________”;top=sqstack_maxsize-1表示________,此时作进栈运算,则产生“________”。
7.以下运算实现在顺序栈上的初始化,请在________处用适当的句子予以填充。
int InitStack(SqStackTp *sq){ ________;return(1);}8.以下运算实现在顺序栈上的进栈,请在________处用适当的语句予以填充。
Int Push(SqStackTp *sq,DataType x){ if(sp->top==sqstack_maxsize-1}{error(“栈满”);return(0);}else{________________:________________=x;return(1);}}9.以下运算实现在顺序栈上的退栈,请在________________用适当句子予以填充。
数据结构第3章 栈与队列习题

数据结构第3章栈与队列习题第3章栈与队列一、单项选择题1.元素A、B、C、D依次进顺序栈后,栈顶元素是,栈底元素是。
A.A B.B C.CD.D2.经过以下栈运算后,x的值是。
InitStack(s);Push(s,a);Push(s,b);Pop(s,x);GetTop(s,x); A.a C.1B.b D.03.已知一个栈的进栈序列是ABC,出栈序列为CBA,经过的栈操作是。
A.push,pop,push,pop,push,pop C.push,push,pop,pop,push,popB.push,push,push,pop,pop,pop D.push,pop,push,push,pop,pop4.设一个栈的输入序列为A、B、C、D,则借助一个栈所得到的序列是。
A.A,B,C,DB.D,C,B,AC.A,C,D,B D.D,A,B,C5.一个栈的进栈序列是a,b,c,d,e,则栈的不可能的输出序列是。
A.edcba C.dceabB.decba D.abcde6.已知一个栈的进栈序列是1,2,3,……,n,其输出序列的第一个元素是i,则第j个出栈元素是。
A.i C.j-i+1B.n-i D.不确定7.已知一个栈的进栈序列是1,2,3,……,n,其输出序列是p1,p2,…,Pn,若p1=n,则pi的值。
A.i C.n-i+1B.n-i D.不确定8.设n个元素进栈序列是1,2,3,……,n,其输出序列是p1,p2,…,pn,若p1=3,则p2的值。
A.一定是2B.一定是1C.不可能是1 D.以上都不对9.设n个元素进栈序列是p1,p2,…,pn,其输出序列是1,2,3,……,n,若p3=1,则p1的值。
A.可能是2 C.不可能是2B.一定是1 D.不可能是310.设n个元素进栈序列是p1,p2,…,pn,其输出序列是1,2,3,……,n,若p3=3,则p1的值。
A.可能是2 C.不可能是1B.一定是2 D.一定是111.设n个元素进栈序列是p1,p2,…,pn,其输出序列是1,2,3,……,n,若pn=1,则pi(1≤i≤n-1)的值。
(完整版)第3章栈与队列习题参考答案

A.1234
B. 1324
C. 4321
D. 1423
3.在链栈中,进行出栈操作时( B )。
A.需要判断栈是否满
B. 需要判断栈是否为空
C. 需要判断栈元素的类型
D. 无需对栈作任何差别
4.在顺序栈中,若栈顶指针 top 指向栈顶元素的下一个存储单元,且顺序栈的最大容量是 maxSize,则顺序栈 的判空条件是( A )。
The shortest way to do many things is
习题三参考答案 备注: 红色字体标明的是与书本内容有改动的内容。
一、选择题
1. 在栈中存取数据的原则是( B )。
A. 先进先出
B. 先进后出
C. 后进后出
D. 没有限制
2.若将整数 1、2、3、4 依次进栈,则不可能得到的出栈序列是( D )。
else if (i==1) if (top1==base1) throw new Exception("第 0 号栈为空"); else x=stackElem[++top1];
The shortest way to do many things is
return x; } } // DuSqStack 类结束 4. 循环顺序队列类采用设置一个计数器的方法来区分循环队列的判空和判满。试分别编写顺序循环队列中入 队和出队操作的函数。 参考答案: //循环顺序队列存储结构类描述如下: class CircleSqQueue_num { private Object[] queueElem; // 队列存储空间 private int front;// 队首的引用,若队列不空,指向队首元素,初值为 0 private int rear;// 队尾的引用,若队列不空,指向队尾元素的下一个位置,初值为 0 private int num; // 计数器用来记录队列中的数据元素个数
数据结构练习题 第三章 栈、队列和数组 习题及答案

第三章栈、队列和数组一、名词解释:1.栈、栈顶、栈底、栈顶元素、空栈2.顺序栈3.链栈4.递归5.队列、队尾、队头6.顺序队7.循环队8.队满9.链队10.随机存储结构11.特殊矩阵12.稀疏矩阵13.对称方阵14.上(下)三角矩阵二、填空题:1.栈修改的原则是_________或称________,因此,栈又称为________线性表。
在栈顶进行插入运算,被称为________或________,在栈顶进行删除运算,被称为________或________。
2.栈的基本运算至少应包括________、________、________、________、________五种。
3.对于顺序栈,若栈顶下标值top=0,此时,如果作退栈运算,则产生“________”。
4.对于顺序栈而言,在栈满状态下,如果此时在作进栈运算,则会发生“________”。
5.一般地,栈和线性表类似有两种实现方法,即________实现和________实现。
6.top=0表示________,此时作退栈运算,则产生“________”;top=sqstack_maxsize-1表示________,此时作进栈运算,则产生“________”。
7.以下运算实现在顺序栈上的初始化,请在________处用适当的句子予以填充。
int InitStack(SqStackTp *sq){ ________;return(1);}8.以下运算实现在顺序栈上的进栈,请在________处用适当的语句予以填充。
Int Push(SqStackTp *sq,DataType x){ if(sp->top==sqstack_maxsize-1}{error(“栈满”);return(0);}else{________________:________________=x;return(1);}}9.以下运算实现在顺序栈上的退栈,请在________________用适当句子予以填充。
数据结构课后习题答案第三章

第三章栈和队列(参考答案)// 从数据结构角度看,栈和队列是操作受限的线性结构,其顺序存储结构// 和链式存储结构的定义与线性表相同,请参考教材,这里不再重复。
3.1 1 2 3 4 2 1 3 4 3 2 1 4 4 3 2 11 2 4 3 2 1 4 3 3 2 4 11 32 4 23 14 3 4 2 11 3 42 234 11 4 32 2 43 1设入栈序列元素数为n,则可能的出栈序列数为C2n n=(1/n+1)*(2n!/(n!)2)3.2 证明:由j<k和p j<p k说明p j在p k之前出栈,即在k未进栈之前p j已出栈,之后k进栈,然后p k出栈;由j<k和p j>p k说明p j在p k之后出栈,即p j被p k压在下面,后进先出。
由以上两条,不可能存在i<j<k使p j<p k<p i。
也就是说,若有1,2,3顺序入栈,不可能有3,1,2的出栈序列。
3.3 void sympthy(linklist *head, stack *s)//判断长为n的字符串是否中心对称{ int i=1; linklist *p=head->next;while (i<=n/2) // 前一半字符进栈{ push(s,p->data); p=p->next; }if (n % 2 !==0) p=p->next;// 奇数个结点时跳过中心结点while (p && p->data==pop(s)) p=p->next;if (p==null) printf(“链表中心对称”);else printf(“链表不是中心对称”);} // 算法结束3.4int match()//从键盘读入算术表达式,本算法判断圆括号是否正确配对(init s;//初始化栈sscanf(“%c”,&ch);while (ch!=’#’) //’#’是表达式输入结束符号switch (ch){ case ’(’: push(s,ch); break;case ’)’: if (empty(s)) {printf(“括号不配对”); exit(0);}pop(s);}if (!empty(s)) printf(“括号不配对”);else printf(“括号配对”);} // 算法结束3.5typedef struct // 两栈共享一向量空间{ ElemType v[m]; // 栈可用空间0—m-1int top[2] // 栈顶指针}twostack;int push(twostack *s,int i, ElemType x)// 两栈共享向量空间,i是0或1,表示两个栈,x是进栈元素,// 本算法是入栈操作{ if (abs(s->top[0] - s->top[1])==1) return(0);// 栈满else {switch (i){case 0: s->v[++(s->top)]=x; break;case 1: s->v[--(s->top)]=x; break;default: printf(“栈编号输入错误”); return(0);}return(1); // 入栈成功}} // 算法结束ElemType pop(twostack *s,int i)// 两栈共享向量空间,i是0或1,表示两个栈,本算法是退栈操作{ ElemType x;if (i!=0 && i!=1) return(0);// 栈编号错误else {switch (i){case 0: if(s->top[0]==-1) return(0);//栈空else x=s->v[s->top--];break;case 1: if(s->top[1]==m) return(0);//栈空else x=s->v[s->top++]; break;default: printf(“栈编号输入错误”);return(0);}return(x); // 退栈成功}} // 算法结束ElemType top (twostack *s,int i)// 两栈共享向量空间,i是0或1,表示两个栈,本算法是取栈顶元素操作{ ElemType x;switch (i){case 0: if(s->top[0]==-1) return(0);//栈空else x=s->v[s->top]; break;case 1: if(s->top[1]==m) return(0);//栈空else x=s->v[s->top]; break;default: printf(“栈编号输入错误”);return(0);}return(x); // 取栈顶元素成功} // 算法结束3.6void Ackerman(int m,int n)// Ackerman 函数的递归算法{ if (m==0) return(n+1);else if (m!=0 && n==0) return(Ackerman(m-1,1);else return(Ackerman(m-1,Ackerman(m,n-1))} // 算法结束3.7(1) linklist *init(linklist *q)// q是以带头结点的循环链表表示的队列的尾指针,本算法将队列置空{ q=(linklist *)malloc(sizeof(linklist));//申请空间,不判断空间溢出q->next=q;return (q);} // 算法结束(2) linklist *enqueue(linklist *q,ElemType x)// q是以带头结点的循环链表表示的队列的尾指针,本算法将元素x入队{ s=(linklist *)malloc(sizeof(linklist));//申请空间,不判断空间溢出s->next=q->next; // 将元素结点s入队列q->next=s;q=s; // 修改队尾指针return (q);} // 算法结束(3) linklist *delqueue(linklist *q)//q是以带头结点的循环链表表示的队列的尾指针,这是出队算法{ if (q==q->next) return (null); // 判断队列是否为空else {linklist *s=q->next->next; // s指向出队元素if (s==q) q=q->next; // 若队列中只一个元素,置空队列else q->next->next=s->next;// 修改队头元素指针free (s); // 释放出队结点}return (q);} // 算法结束。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1第三章栈、队列和数组2一、名词解释:31.栈、栈顶、栈底、栈顶元素、空栈2.顺序栈3.链栈4.递归5.队列、队尾、4队头6.顺序队7.循环队8.队满9.链队10.随机存储结构11.特殊矩阵12.稀疏矩5阵13.对称方阵14.上(下)三角矩阵6二、填空题:71.栈修改的原则是_________或称________,因此,栈又称为8________线性表。
在栈顶进行插入运算,被称为________或________,在栈顶进行删除运算,被称为________或________。
9102.栈的基本运算至少应包括________、________、________、11________、________五种。
123.对于顺序栈,若栈顶下标值top=0,此时,如果作退栈运算,则产13生“________”。
144.对于顺序栈而言,在栈满状态下,如果此时在作进栈运算,则会发生“________”。
15165.一般地,栈和线性表类似有两种实现方法,即________实现和17________实现。
6.top=0表示________,此时作退栈运算,则产生“________”;1819top=sqstack_maxsize-1表示________,此时作进栈运算,则产生20“________”。
7.以下运算实现在顺序栈上的初始化,请在________处用适当的句2122子予以填充。
23int InitStack(SqStackTp *sq)24{ ________;25return(1);}268.以下运算实现在顺序栈上的进栈,请在________处用适当的语句27予以填充。
28Int Push(SqStackTp *sq,DataType x)29{ if(sp->top==sqstack_maxsize-1}{error(“栈满”);return(0);} 30else{________________:31________________=x;32return(1);}3334}359.以下运算实现在顺序栈上的退栈,请在________________用适当36句子予以填充。
37Int Pop(SqStackTp *sq,DataType *x)38{if(sp->top==0){error(“下溢”);return(0);}39else{*x=________________;40________________;41return(1);}42}4310. 以下运算实现在顺序栈上判栈空,请在________________处用适当句子予44以填充。
45Int EmptyStack(SqStackTp *sq)46{if(________________) return(1);47else return(0);48}4911.以下运算实现在顺序栈上取栈顶元素,请在________________处用适当句50子予以填充。
51Int GetTop(SqStackTp *sq,DataType *x){if(________________) return(0);5253else{*x=________________;54return(1);}}555612. 以下运算实现在链栈上的初始化,请在________________处用请适当句子57予以填充。
58Void InitStacl(LstackTp *ls){ ________________;}5913.` 以下运算实现在链栈上的进栈,请在处用请适当句子予以填充。
60Void Push(LStackTp *ls,DataType x)61{ LstackTp *p;p=malloc(sizeof(LstackTp));62________________;63p->next=ls;64________________;65}6614.以下运算实现在链栈上的退栈,请在________________处用请适当句子予67以填充。
68Int Pop(LstackTp *ls,DataType *x)69{LstackTp *p;70if(ls!=NULL){ p=ls;7172*x=________________;73ls=ls->next;________________;7475return(1);76}else return(0);77}7815. 以下运算实现在链栈上读栈顶元素,请在________________处用请适当句79子予以填充。
Int Get Top(LstackTp *ls,DataType *x)8081{ if(ls!=NULL){ ________________;return(1);}82else return(0);}838416.必须注意,递归定义不能是“循环定义”。
为此要求任何递归定义必须同时85满足如下条件:86①被定义项在定义中的应用(即作为定义项的出现)具有________________;87②被定义项在最小“尺度”上的定义不是________________的。
8817.队列简称________________。
在队列中,新插入的结点只能添加到89________________,被删除的只能是排在________________的结点。
9018.队列以线性表为逻辑结构,至少包括________________、91________________、________________、________________ ________________、92五种基本运算。
9319.顺序队的出、入队操作会产生“________________”。
9420.以下运算实现在循环队上的初始化,请在________________处用适当句子95予以填充。
96Void InitCycQueue(CycqueueTp *sq)97{ ________________;sq->rear=0;}21. 以下运算实现在循环队上的入队列,请在________________处用请适当句9899子予以填充。
100Int EnCycQueue(CycquereTp *sq,DataType x)101{ if((sq->rear+1)%maxsize== ________________)102{error(“队满”);return(0);103else{ ________________;104________________ ________________;105return(1);106}10722. 以下运算实现在循环队上的出队列,请在________________处用适当句子108予以填充。
109Int OutCycQueue(CycquereTp *sq,DataType *x){if(sq->front== ________________){error(“队空”);return(0);} 110111else{ ________________;112________________;return(1);113114}115}11623. 以下运算实现在循环队上判队空,请在________________处用适当句子予117以填充。
118Int EmptyCycQueue(CycqueueTp sq)119{if(________________) return(1);120else return(0);121}12224. 以下运算实现在循环队上取队头,请在________________处用适当句子予123以填充。
124Int GetHead(CycqueueTp sq,DataType *x)125{ if(sq.rear== ________________return(0);126else{ *x=sq.data[________________ ];127return(1);128}25.链队在一定范围内不会出现________________的情况。
当129130lq.front==lq.rear试,队中无元素,此时________________。
13126.以下运算实现在链队上的初始化,请在________________处用适当句子予以填充。
132133void InitQueue(QueptrTp *lp)134{ LqueueTp *p;135p=(LqueueTp *)malloc(sizeof(LqueueTp));136________________;137lq->rear=p;138(lq->front)->next=________________;139}14027. 以下运算实现在链队上的入队列,请在________________处用适当句子予141以填充。
142Void EnQueue(QueptrTp *lq,DataType x)143{ LqueueTp *p;144p=(LqueueTp *)malloc(sizeof(LqueueTp));145________________=x;146p->next=NULL;147(lq->rear)->next=________________;________________;148149}15028. 以下运算实现在链队上的出队列,请在________________处用适当句子予以填充。
151152int OutQueue(QuetrTp *lq,DataType *x)153{ LqueueTp *s;154if(lq->front==lq->rear){erroe(“队空”);return(0);}155else { s=(lq->front)->next;156________________=s->data;157(lq->front)->next=________________;158if(s->next==NULL) lq->rear=lq->front;159free(s);160return(1);161}162}16329. 以下运算实现在链队上判队空,请在________________处用适当句子予以164填充165int EmptyQueue(QueptrTp *lq)166{ if(________________) return(1);else return(0);167168}16930. 以下运算实现在链队上读队头元素,请在________________处用适当句子予以填充。