栈和队列答案

合集下载

栈和队列习题答案

栈和队列习题答案

第三章栈和队列习题答案一、基础知识题设将整数1,2,3,4依次进栈,但只要出栈时栈非空,则可将出栈操作按任何次序夹入其中,请回答下述问题:(1)若入、出栈次序为Push(1), Pop(),Push(2),Push(3), Pop(), Pop( ),Push(4), Pop( ),则出栈的数字序列为何(这里Push(i)表示i进栈,Pop( )表示出栈)(2)能否得到出栈序列1423和1432并说明为什么不能得到或者如何得到。

(3)请分析1,2 ,3 ,4 的24种排列中,哪些序列是可以通过相应的入出栈操作得到的。

答:(1)出栈序列为:1324(2)不能得到1423序列。

因为要得到14的出栈序列,则应做Push(1),Pop(),Push(2),Push(3),Push(4),Pop()。

这样,3在栈顶,2在栈底,所以不能得到23的出栈序列。

能得到1432的出栈序列。

具体操作为:Push(1), Pop(),Push(2),Push(3),Push(4),Pop(),Pop(),Pop()。

(3)在1,2 ,3 ,4 的24种排列中,可通过相应入出栈操作得到的序列是:1234,1243,1324,1342,1432,2134,2143,2314,2341,2431,3214,3241,3421,4321不能得到的序列是:1423,2413,3124,3142,3412,4123,4132,4213,4231,4312链栈中为何不设置头结点答:链栈不需要在头部附加头结点,因为栈都是在头部进行操作的,如果加了头结点,等于要对头结点之后的结点进行操作,反而使算法更复杂,所以只要有链表的头指针就可以了。

循环队列的优点是什么如何判别它的空和满答:循环队列的优点是:它可以克服顺序队列的"假上溢"现象,能够使存储队列的向量空间得到充分的利用。

判别循环队列的"空"或"满"不能以头尾指针是否相等来确定,一般是通过以下几种方法:一是另设一布尔变量来区别队列的空和满。

数据结构:栈和队单元测验与答案

数据结构:栈和队单元测验与答案

一、单选题1、链栈与顺序栈相比有一个明显的优点,即_____。

A.插入操作更方便B.删除操作更加方便C.不会出现栈空的情况D.通常不会出现栈满的情况正确答案:D2、设进栈序列是1,2,3,…,n,输出序列为p1,p2,p3,…,pn。

若p1=3,则p2为_____。

A.可能是1B.不可能是2C.可能是2D.必是1正确答案:C3、已知hs为首指针的简单单向链表存储一个栈,使指针s所指结点进栈的操作是____。

A.s->next=hs;hs=s;B.hs->next=s;C.s->next=hs->next; hs->next=s;D.s->next=hs;hs=hs->next;正确答案:A4、数组q[M](M等于6)存储一个循环队,first和last分别是首尾指针。

已知first和last的当前值分别等于2和5,且q[5]存放的是队尾元素。

当从队列中删除两个元素,再插入一个元素后,first和last的值分别等于_____。

A.3和6B.5和1C.4和0D.1和3正确答案:C5、设进栈序列是1,2,3,…,n,输出序列为p1,p2,p3,…,pn。

若p3=1,则p1为_____。

A.必定是3B.必是2C.不可能是3D.可能是3正确答案:D6、数组q[M]存储一个循环队,first和last分别是首尾指针,如果使元素x进队操作的语句为“q[last]=x,last=(last+1)%m;”那么判断队满的条件是_____。

st= =M-1st= =firstC.(last+1)%m= =firstst+1= =first7、数组q[M]存储一个循环队,first和last分别是首尾指针。

如果使元素x出队操作的语句为“first=(first+1)%m, x=q[first];”。

那么元素x进队的语句是_____。

A.q[(last+1)%m]=x;B.q[last+1]=x;st=(last+1)%m,q[last]=x;D.x=q[last], last =(last+1)%m;正确答案:C8、首尾指针分别是f和r的单向加头链表存储一个队,元素x出队的语句为“f=f->next, x=f->data;”,那么判断队空否的条件是_____。

《数据结构及其应用》笔记含答案 第三章_栈和队列

《数据结构及其应用》笔记含答案 第三章_栈和队列

第3章栈和队列一、填空题1、栈是限定仅在表尾进行插入或删除操作的线性表。

2、栈的修改是按照后进先出的原则进行的。

3、队是一种先进先出的线性表。

4、把队列头尾相接的顺序存储结构称为循环队列。

5、队列也是一种操作受限的线性表,允许插入的一端叫做__队尾___,允许删除的一端叫做__队头__。

二、判断题1、栈和队列的存储,既可以采用顺序存储结构,又可以采用链式存储结构。

(√)2、任何一个递归过程都可以转换成非递归过程。

(√)3、若输入序列为1,2,3,4,5,6,则通过一个栈可以输出序列3,2,5,6,4,1。

(√)4、通常使用队列来处理函数的调用。

(╳)5、循环队列通常用指针来实现队列的头尾相接。

(╳)三、单项选择题1、若让元素1,2,3,4,5依次进栈,则出栈次序不可能出现在(C)种情况。

A.5,4,3,2,1 B.2,1,5,4,3 C.4,3,1,2,5 D.2,3,5,4,1解释:栈是后进先出的线性表,不难发现C选项中元素1比元素2先出栈,违背了栈的后进先出原则,所以不可能出现C选项所示的情况。

2、若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为(C)。

A.i B.n-i C.n-i+1 D.不确定解释:栈是后进先出的线性表,一个栈的入栈序列是1,2,3,…,n,而输出序列的第一个元素为n,说明1,2,3,…,n一次性全部进栈,再进行输出,所以p1=n,p2=n-1,…,pi=n-i+1。

3、数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素个数的公式为(D)。

A.r-f B.(n+f-r)%n C.n+r-f D.(n+r-f)%n解释:对于非循环队列,尾指针和头指针的差值便是队列的长度,而对于循环队列,差值可能为负数,所以需要将差值加上MAXSIZE(本题为n),然后与MAXSIZE(本题为n)求余,即(n+r-f)%n。

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

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

第三章栈、队列和数组一、名词解释: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.以下运算实现在顺序栈上的退栈,请在________________用适当句子予以填充。

数据结构-第三次作业(答案)

数据结构-第三次作业(答案)

第三次作业第三章栈和队列一、选择题1. 若一个栈的输入序列为1,2,3,…,n,输出序列的第一个元素是i,则第j个输出元素是( D )。

A. i-j-1B. i-jC. j-i+1D. 不确定的2. 若栈采用顺序存储方式存储,现两栈共享空间V[1..m],top[i]代表第i个栈( i =1,2)栈顶,栈1的底在v[1],栈2的底在V[m],则栈满的条件是( AD )。

A. |top[2]-top[1]|=0B. top[1]+1=top[2]C. top[1]+top[2]=mD.top[1]=top[2]3. 栈在( D )中应用。

A. 递归调用B. 子程序调用C. 表达式求值D. A,B,C4. 表达式3* 2^(4+2*2-6*3)-5求值过程中当扫描到6时,对象栈和算符栈为( D ),其中^为乘幂。

A. 3,2,4,1,1;(*^(+*-B. 3,2,8;(*^-C. 3,2,4,2,2;(*^(-D. 3,2,8;(*^(-5. 用链接方式存储的队列,在进行删除运算时( D )。

A. 仅修改头指针B. 仅修改尾指针C. 头、尾指针都要修改D. 头、尾指针可能都要修改6. 假设以数组A[m]存放循环队列的元素,其头尾指针分别为front和rear,则当前队列中的元素个数为( A )。

A.(rear-front+m)%m B.rear-front+1 C.(front-rear+m)%m D.(rear-front)%m7. 栈和队列的共同点是( C )。

A. 都是先进先出B. 都是先进后出C. 只允许在端点处插入和删除元素D. 没有共同点8. 设栈S和队列Q的初始状态为空,元素e1,e2,e3,e4,e5和e6依次通过栈S,一个元素出栈后即进队列Q,若6个元素出队的序列是e2,e4,e3,e6,e5,e1则栈S的容量至少应该是( C )。

A. 6 B. 4 C. 3 D. 2二、判断题1.消除递归不一定需要使用栈,此说法(√)2. 栈是实现过程和函数等子程序所必需的结构。

数据结构第三章栈和队列习题及答案

数据结构第三章栈和队列习题及答案

习题三栈和队列一单项选择题1. 在作进栈运算时,应先判别栈是否(① ),在作退栈运算时应先判别栈是否(② )。

当栈中元素为n个,作进栈运算时发生上溢,则说明该栈的最大容量为(③ )。

①, ②: A. 空 B. 满 C. 上溢 D. 下溢③: A. n-1 B. n C. n+1 D. n/22.若已知一个栈的进栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,...,pn,若p1=3,则p2为( )。

A 可能是2B 一定是2C 可能是1D 一定是13. 有六个元素6,5,4,3,2,1 的顺序进栈,问下列哪一个不是合法的出栈序列?()A. 5 4 3 6 1 2B. 4 5 3 1 2 6C. 3 4 6 5 2 1D. 2 3 4 1 5 64.设有一顺序栈S,元素s1,s2,s3,s4,s5,s6依次进栈,如果6个元素出栈的顺序是s2,s3,s4, s6, s5,s1,则栈的容量至少应该是()A.2B. 3C. 5D.65. 若栈采用顺序存储方式存储,现两栈共享空间V[1..m],top[i]代表第i个栈( i =1,2)栈顶,栈1的底在v[1],栈2的底在V[m],则栈满的条件是()。

A. |top[2]-top[1]|=0B. top[1]+1=top[2]C. top[1]+top[2]=mD. top[1]=top[2]6. 执行完下列语句段后,i值为:()int f(int x){ return ((x>0) ? x* f(x-1):2);}int i ;i =f(f(1));A.2 B. 4 C. 8 D. 无限递归7. 表达式3* 2^(4+2*2-6*3)-5求值过程中当扫描到6时,对象栈和算符栈为(),其中^为乘幂。

A. 3,2,4,1,1;(*^(+*-B. 3,2,8;(*^-C. 3,2,4,2,2;(*^(-D. 3,2,8;(*^(-8. 用链接方式存储的队列,在进行删除运算时()。

栈和队列答案

栈和队列答案

第3章栈和队列答案一、填空题1. 向量、栈和队列都是线性结构,可以在向量的任何位置插入和删除元素;对于栈只能在栈顶插入和删除元素;对于队列只能在队尾插入和队首删除元素。

2. 栈是一种特殊的线性表,允许插入和删除运算的一端称为栈顶。

不允许插入和删除运算的一端称为栈底。

3. 队列是被限定为只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表。

4. 在具有n个单元的循环队列中,队满时共有 n-1 个元素。

5. 带表头结点的空循环双向链表的长度等于0。

解:Array二、判断正误(×)1. 在表结构中最常用的是线性表,栈和队列不太常用。

错,不一定吧调用子程序或函数常用,CPU中也用队列。

(√)2. 栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。

(√)3. 对于不同的使用者,一个表结构既可以是栈,也可以是队列,也可以是线性表。

正确,都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。

(×)4. 栈和链表是两种不同的数据结构。

错,栈是逻辑结构的概念,是特殊殊线性表,而链表是存储结构概念,二者不是同类项。

(×)5. 栈和队列是一种非线性数据结构。

错,他们都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。

(√)6. 栈和队列的存储方式既可是顺序方式,也可是链接方式。

(√)7. 两个栈共享一片连续内存空间时,为提高内存利用率,减少溢出机会,应把两个栈的栈底分别设在这片内存空间的两端。

(×)8. 队是一种插入与删除操作分别在表的两端进行的线性表,是一种先进后出型结构。

错,后半句不对。

(×)9. 一个栈的输入序列是12345,则栈的输出序列不可能是12345。

错,有可能。

三、单项选择题( B)1. 栈中元素的进出原则是A.先进先出B.后进先出C.栈空则进D.栈满则出(C)2. 若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为A.i B.n=i C.n-i+1 D.不确定解释:当p1=n,即n是最先出栈的,根据栈的原理,n必定是最后入栈的(事实上题目已经表明了),那么输入顺序必定是1,2,3,…,n,则出栈的序列是n,…,3,2,1。

(完整版)第3章栈与队列习题参考答案

(完整版)第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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

若按教科书3.1.1节中图(b)所示铁道进行车厢调度(注意:两侧铁道均为单向行驶道),则请回答:(1) 如果进站的车厢序列为123,则可能得到的出站车厢序列是什么(2) 如果进站的车厢序列为123456,则能否得到435612和135426的出站序列,并请说明为什么不能得到或者如何得到(即写出以‘S’表示进栈和以‘X’表示出栈的栈操作序列)。

解:(1) 123 231 321 213 132(2) 可以得到135426的出站序列,但不能得到435612的出站序列。

因为4356出站说明12已经在栈中,1不可能先于2出栈。

简述栈和线性表的差别。

解:线性表是具有相同特性的数据元素的一个有限序列。

栈是限定仅在表尾进行插入或删除操作的线性表。

写出下列程序段的输出结果(栈的元素类型SElemType为char)。

void main(){Stack S;char x,y;InitStack(S);x= ‘c’; y= ‘k’;Push(S,x); Push(S, ‘a’); Push(S,y);Pop(S,x); Push(S, ‘t’); Push(S,x);Pop(S,x); Push(S, ‘s’);while(!StackEmpty(S)) { Pop(S,y); printf(y); }printf(x);}解:stack简述以下算法的功能(栈的元素类型SElemType为int)。

(1) status algo1(Stack S){int i,n,A[255];n=0;while(!StackEmpty(S)) { n++; Pop(S,A[n]); }for(i=1;i<=n;i++) Push(S,A[i]);}(2) status algo2(Stack S,int e){Stack T; int d;InitStack(T);while(!StackEmpty(S)){Pop(S,d);if(d!=e) Push(T,d);}while(!StackEmpty(T)){Pop(T,d);Push(S,d); } }解:(1) 栈中的数据元素逆置 (2) 如果栈中存在元素e ,将其从栈中清除假设以S 和X 分别表示入栈和出栈的操作,则初态和终态均为空栈的入栈和出栈的操作序列可以表示为仅由S 和X 组成的序列。

称可以操作的序列为合法序列(例如,SXSX 为合法序列,SXXS 为非法序列)。

试给出区分给定序列为合法序列或非法序列的一般准则,并证明:两个不同的合法(栈操作)序列(对同一输入序列)不可能得到相同的输出元素(注意:在此指的是元素实体,而不是值)序列。

解:任何前n 个序列中S 的个数一定大于X 的个数。

设两个合法序列为: T1=S ……X ……S …… T2=S ……X ……X ……假定前n 个操作都相同,从第n+1个操作开始,为序列不同的起始操作点。

由于前n 个操作相同,故此时两个栈(不妨为栈A 、B )的存储情况完全相同,假设此时栈顶元素均为a 。

第n+1个操作不同,不妨T1的第n+1个操作为S ,T2的第n+1个操作为X 。

T1为入栈操作,假设将b 压栈,则T1的输出顺序一定是先b 后a ;而T2将a 退栈,则其输出顺序一定是先a 后b 。

由于T1的输出为……ba ……,而T2的输出顺序为……ab ……,说明两个不同的合法栈操作序列的输出元素的序列一定不同。

试证明:若借助栈由输入序列12…n 得到的输出序列为n p p p 21(它是输入序列的一个排列),则在输出序列中不可能出现这样的情形:存在着i<j<k 使j p <k p <i p 。

解:这个问题和题比较相似。

因为输入序列是从小到大排列的,所以若j p <k p <i p ,则可以理解为通过输入序列j p k p i p 可以得到输出序列i p j p k p ,显然通过序列123是无法得到312的,参见题。

所以不可能存在着i<j<k 使j p <k p <i p 。

按照四则运算加、减、乘、除和幂运算(↑)优先关系的惯例,并仿照教科书节例3-2的格式,画出对下列算术表达式求值时操作数栈和运算符栈的变化过程: A-B ×C/D+E ↑F解:BC=G G/D=H A-H=I E^F=J I+J=K2n解:1试将下列递推过程改写为递归过程。

void ditui(int n){int i;i = n;while(i>1)cout<<i--;}解:void ditui(int j){if(j>1){cout<<j;ditui(j-1);}return;}试将下列递归过程改写为非递归过程。

void test(int &sum){int x;cin>>x;if(x==0) sum=0;else{test(sum);sum+=x;}cout<<sum;}解:void test(int &sum){Stack s;InitStack(s);int x;do{cin>>x;Push(s,x);}while(x>0);while(!StackEmpty(s)){Pop(s,x);sum+=x;cout<<sum<<endl;}DestoryStack(s);}简述队列和堆栈这两种数据类型的相同点和差异处。

解:栈是一种运算受限的线性表,其限制是仅允许在表的一端进行插入和删除运算。

队列也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入,而在表的另一端进行删除。

写出以下程序段的输出结果(队列中的元素类型QElemType为char)。

void main(){Queue Q;InitQueue(Q);char x= ‘e’, y= ‘c’;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);cout<<y;}cout<<x;}解:char简述以下算法的功能(栈和队列的元素类型均为int)。

void algo3(Queue &Q){Stack S;int d;InitStack(S);while(!QueueEmpty(Q)){DeQueue(Q, d);Push(S, d);}while(!StackEmpty(S)){Pop(S, d);EnQueue(Q, d);}}解:队列逆置若以1234作为双端队列的输入序列,试分别求出满足以下条件的输出序列:(1) 能由输入受限的双端队列得到,但不能由输出受限的双端队列得到的输出序列。

(2) 能由输出受限的双端队列得到,但不能由输入受限的双端队列得到的输出序列。

(3) 既不能由输入受限的双端队列得到,也不能由输出受限的双端队列得到的输出序列。

假设以顺序存储结构实现一个双向栈,即在一维数组的存储空间中存在着两个栈,它们的栈底分别设在数组的两个端点。

试编写实现这个双向栈tws的三个操作:初始化inistack(tws)、入栈push(tws,i,x)和出栈pop(tws,i)的算法,其中i为0或1,用以分别指示设在数组两端的两个栈,并讨论按过程(正/误状态变量可设为变参)或函数设计这些操作算法各有什么有缺点。

解:class DStack{ElemType *top[2];ElemType *p;int stacksize;int di;public:DStack(int m){p=new ElemType[m];if(!p) exit(OVERFLOW);top[0]=p+m/2;top[1]=top[0];stacksize=m;}~DStack(){delete p;}void Push(int i,ElemType x){di=i;if(di==0){if(top[0]>=p) *top[0]--=x;else cerr<<"Stack overflow!";}else{if(top[1]<p+stacksize-1) *++top[1]=x;else cerr<<"Stack overflow!";}}ElemType Pop(int i){di=i;if(di==0){if(top[0]<top[1]) return *++top[0];else cerr<<"Stack empty!";}else{if(top[1]>top[0]) return *top[1]--;else cerr<<"Stack empty!";}return OK;}};2’-1’olor;Push(s,g[][]);while(!StackEmpty(s)){Pop(s,e);CurPos=;g[][].Color=FillColor;g[][].Visited=1;if<M &&!g[+1][].Visited &&g[+1][].Color==OldColor)Push(s,g[+1][]);if>0 &&!g[][].Visited &&g[][].Color==OldColor)Push(s,g[][]);if<N &&!g[][+1].Visited &&g[][+1].Color==OldColor)Push(s,g[][+1]);if>0 &&!g[][].Visited &&g[][].Color==OldColor)Push(s,g[][]);}}void CreateGDS(ElemType g[M][N]){int i,j;for(i=0;i<M;i++)for(j=0;j<N;j++){g[i][j].=i;g[i][j].=j;g[i][j].Visited=0;g[i][j].Color=0;}for(i=2;i<5;i++)for(j=2;j<4;j++)g[i][j].Color=3;for(i=5;i<M-1;i++)for(j=3;j<6;j++)g[i][j].Color=3;}void ShowGraphArray(ElemType g[M][N]){int i,j;for(i=0;i<M;i++){for(j=0;j<N;j++)cout<<g[i][j].Color;cout<<endl;}}假设表达式有单字母变量和双目四则运算符构成。

相关文档
最新文档