栈与队列习题参考答案
栈和队列习题答案
第三章栈和队列习题答案一、基础知识题设将整数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、尾递归的消除就不需用栈2、这个数是前序序列为1,2,3,…,n,所能得到的不相似的二叉树的数目。
三、填空题1、操作受限(或限定仅在表尾进行插入和删除操作)后进先出2、栈3、3 1 24、23 100CH5、0 n+1 top[1]+1=top[2]6、两栈顶指针值相减的绝对值为1(或两栈顶指针相邻)。
7、(1)满 (2)空 (3)n (4)栈底 (5)两栈顶指针相邻(即值之差的绝对值为1)8、链式存储结构 9、S×SS×S×× 10、data[++top]=x;11、23.12.3*2-4/34.5*7/++108.9/+(注:表达式中的点(.)表示将数隔开,如23.12.3是三个数)12、假溢出时大量移动数据元素。
13、(M+1) MOD N (M+1)% N; 14、队列 15、先进先出 16、先进先出 17、s=(LinkedList)malloc(sizeof(LNode)); s->data=x;s->next=r->next;r->next=s;r=s;18、牺牲一个存储单元设标记19、(TAIL+1)MOD M=FRONT (数组下标0到M-1,若一定使用1到M,则取模为0者,值改取M20、sq.front=(sq.front+1)%(M+1);return(sq.data(sq.front));(sq.rear+1)%(M+1)==sq.front;21、栈 22、(rear-front+m)% m; 23、(R-P+N)% N;24、(1)a[i]或a[1] (2)a[i] (3)pop(s)或s[1];25、(1)PUSH(OPTR,w)(2)POP(OPTR)(3)PUSH(OPND,operate(a,theta,b))26、(1)T>0(2)i<n(3)T>0(4)top<n(5)top+1(6)true(7)i-1(8)top-1(9)T+w[i](10)false四、应用题1、栈是只准在一端进行插入和删除操作的线性表,允许插入和删除的一端叫栈顶,另一端叫栈底。
数据结构栈和队列习题及答案
习题三栈和队列一单项选择题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. 用链接方式存储的队列,在进行删除运算时()。
数据结构习题参考答案
数据结构习题参考答案一、栈和队列1. 栈是一种具有后进先出(Last In First Out)特性的线性数据结构。
常用方法:- push(x): 将元素x压入栈顶;- pop(): 弹出栈顶元素;- top(): 返回栈顶元素;- isEmpty(): 判断栈是否为空;例题解答:(1)题目描述:使用栈实现队列的功能。
解答:使用两个栈,一个用于入队操作,一个用于出队操作。
入队操作:直接将元素压入入队栈中;出队操作:如果出队栈为空,则将入队栈的元素逐个弹出并压入出队栈,此时出队栈的栈顶元素即为要弹出的元素。
复杂度分析:入队操作的时间复杂度为O(1),出队操作的平均时间复杂度为O(1)。
(2)题目描述:判断括号序列是否合法,即括号是否完全匹配。
解答:使用栈来处理括号序列,遇到左括号则入栈,遇到右括号则与栈顶元素进行匹配,如果匹配成功则继续处理剩余字符,如果不匹配则判定为非法序列。
算法步骤:- 初始化一个空栈;- 从左到右遍历括号序列,对于每个字符执行以下操作:- 如果是左括号,则将其入栈;- 如果是右括号,则将其与栈顶元素进行匹配:- 如果栈为空,则判定为非法序列;- 如果栈顶元素与当前字符匹配,则将栈顶元素出栈,继续处理剩余字符;- 如果栈顶元素与当前字符不匹配,则判定为非法序列。
- 遍历结束后,如果栈为空,则括号序列合法;否则,括号序列非法。
复杂度分析:时间复杂度为O(n),其中n为括号序列的长度。
2. 队列是一种具有先进先出(First In First Out)特性的线性数据结构。
常用方法:- enqueue(x): 将元素x入队;- dequeue(): 出队并返回队首元素;- getFront(): 返回队首元素;- isEmpty(): 判断队列是否为空;例题解答:(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. 一个栈的入栈序列a,b,c,d,e,则栈的不可能的输出序列是__ C __。
A. edcbaB. decbaC. dceabD. abcde2. 若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为__ C __。
A. iB. n=iC. n-i+1D. 不确定3. 栈结构通常采用的两种存储结构是__ A __。
A. 顺序存储结构和链式存储结构散列方式和索引方式链表存储结构和数组线性存储结构和非线性存储结构4. 判定一个顺序栈ST(最多元素为m0)为空的条件是_ B ___。
A. top !=0B. top= =0C. top !=m0D. top= =m0-15. 判定一个顺序栈ST(最多元素为m0)为栈满的条件是__ D __。
A. top!=0B. top= =0C. top!=m0D. top= =m0-16. PUSH 和POP 命令常用于(C)操作。
A 队列B 数组C 栈D 记录7. 向一个栈顶指针为HS的链栈中插入一个s所指结点时,则执行__ C __。
(不带空的头结点)A. HS—>next=s;B. s—>next= HS—>next; HS—>next=s;C. s—>next= HS; HS=s;D. s—>next= HS; HS= HS—>next;8. 从一个栈顶指针为HS的链栈中删除一个结点时,用x 保存被删结点的值,则执行_ B _ __。
(不带空的头结点)A. x=HS; HS= HS—>next;B. x=HS—>data;C. HS= HS—>next; x=HS—>data;D. x=HS—>data; HS= HS—>next;9. 一个队列的数据入队序列是1,2,3,4,则队列出队时的输出序列是__ B __ 。
栈和队列习题及答案
栈和队列习题及答案第三章栈和队列⼀、选择题1、⼀个栈的输⼊序列为:a,b,c,d,e,则栈的不可能输出的序列是()。
A. a,b,c,d,eB. d,e,c,b,aC. d,c,e,a,bD. e,d,c,b,a2、判断⼀个循环队列Q(最多n个元素)为满的条件是()。
A. Q->rear==Q->frontB. Q->rear==Q->front+1C. Q->front==(Q->rear+1)%nD. Q->front==(Q->rear-1)%n3、设计⼀个判别表达式中括号是否配对的算法,采⽤()数据结构最佳。
A. 顺序表B. 链表C. 队列D. 栈4、带头结点的单链表head为空的判定条件是()。
A. head==NULLB. head->next==NULLC. head->next!=NULLD. head!=NULL5、⼀个栈的输⼊序列为:1,2,3,4,则栈的不可能输出的序列是()。
A. 1243B. 2134C. 1432D. 4312E. 32146、若⽤⼀个⼤⼩为6的数组来实现循环队列,且当rear和front的值分别为0,3。
当从队列中删除⼀个元素,再加⼊两个元素后,rear和front 的值分别为()。
A. 1和5B. 2和4C. 4和2D. 5和17、队列的插⼊操作是在()。
A. 队尾B. 队头C. 队列任意位置D. 队头元素后8、循环队列的队头和队尾指针分别为front和rear,则判断循环队列为空的条件是()。
A. front==rearB. front==0C. rear==0D. front=rear+19、⼀个顺序栈S,其栈顶指针为top,则将元素e⼊栈的操作是()。
A. *S->top=e;S->top++;B. S->top++;*S->top=e;C. *S->top=eD. S->top=e;10、表达式a*(b+c)-d的后缀表达式是()。
数据结构第三章栈和队列练习及答案
一、选择题一、选择题1、栈中存取数据的原则()、栈中存取数据的原则()A 、先进先出B 、先进后出C 、后进后出D 、随意进出、随意进出2、队列中存取数据的原则()、队列中存取数据的原则() A 、先进先出 B 、后进先出 C 、先进后出 D 、随意进出、随意进出3、插入和删除只能在一端进行的线性表,称为()、插入和删除只能在一端进行的线性表,称为()A 、队列B 、循环队列C 、栈D 、循环栈、循环栈4、在栈中,出栈操作的时间复杂度为()、在栈中,出栈操作的时间复杂度为()A 、O (1)B 、O (log 2n )C 、O (n )D 、O (n 2)5、设长度为n 的链队列用单循环链表表示,若只设头指针,则入队操作的时间复杂度为的链队列用单循环链表表示,若只设头指针,则入队操作的时间复杂度为()() A 、O (1) B 、O (log 2n ) C 、O (n ) D 、O (n 2)6、设长度为n 的链队列用单循环链表表示,若只设头指针,则出队操作的时间复杂度为的链队列用单循环链表表示,若只设头指针,则出队操作的时间复杂度为()() A 、O (1) B 、O (log 2n ) C 、O (n ) D 、O (n 2)7、一个线性表的第一个元素的存储地址是100,每个元素的长度是2,则第5个元素的地址是()是() A 、110 B 、108 C 、100 D 、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==m0 11、判断一个栈ST (最多元素m0)为满的条件是())为满的条件是()A 、ST->top!=0B 、ST->top==0C 、ST->top!=m0D 、ST->top==m0 12、判断一个循环队列QU (最多元素为m0)为空的条件是())为空的条件是() A 、QU.front==QU.rear B 、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)%m0 14、循环队列用数组存放其元素值A[0,m-1],已知其头尾指针分别是rear 和front ,则当前队列的元素个数是()队列的元素个数是()A 、(rear-front+m)%mB 、rear-front+1C 、rear-front-1D 、rear-front 15、栈和队列的共同特点是()、栈和队列的共同特点是()A 、都是先进后出B 、都是先进先出、都是先进先出C 、只允许在端点处插入和删除D 、没有共同点、没有共同点二、填空题二、填空题1、设长度为n 的链队列用单循环链表表示,若只设头指针,则入队和出队操作的时间复杂度分别为(O(N))和(O(1));若又设尾指针,则入队和出队操作的时间复杂度分别为(O(1))和(O(1))。
第3章栈和队列习题参考答案
第3章栈和队列习题参考答案第3章栈和队列一、基础知识题3.1有五个数依次进栈:1,2,3,4,5。
在各种出栈的序列中,以3,4先出的序列有哪几个。
(3在4之前出栈)。
【解答】34215 ,34251,345213.2铁路进行列车调度时,常把站台设计成栈式结构,若进站的六辆列车顺序为:1,2,3,4,5,6,那么是否能够得到435612,325641,154623和135426的出站序列,如果不能,说明为什么不能;如果能,说明如何得到(即写出"进栈"或"出栈"的序列)。
【解答】输入序列为123456,不能得出435612和154623。
不能得到435612的理由是,输出序列最后两元素是12,前面4个元素(4356)得到后,栈中元素剩12,且2在栈顶,不可能让栈底元素1在栈顶元素2之前出栈。
不能得到154623的理由类似,当栈中元素只剩23,且3在栈顶,2不可能先于3出栈。
得到325641的过程如下:1 2 3顺序入栈,32出栈,得到部分输出序列32;然后45入栈,5出栈,部分输出序列变为325;接着6入栈并退栈,部分输出序列变为3256;最后41退栈,得最终结果325641。
得到135426的过程如下:1入栈并出栈,得到部分输出序列1;然后2和3入栈,3出栈,部分输出序列变为13;接着4和5入栈,5,4和2依次出栈,部分输出序列变为13542;最后6入栈并退栈,得最终结果135426。
3.3若用一个大小为6的数组来实现循环队列,且当前rear和front的值分别为0和3,当从队列中删除一个元素,再加入两个元素后,rear和front的值分别为多少?【解答】2和43.4设栈S和队列Q的初始状态为空,元素e1,e2,e3,e4,e5和e6依次通过栈S,一个元素出栈后即进队列Q,若6个元素出队的序列是e3,e5,e4,e6,e2,e1,则栈S的容量至少应该是多少?【解答】43.5循环队列的优点是什么,如何判断“空”和“满”。
数据结构(栈和队列)习题与答案
一、单选题1、元素A、B、C、D依次进栈后,栈顶元素是 _______。
A.BB.DC.CD.A正确答案:B2、经过以下运算后, x的值是 _______。
InitStack (s); Push(s, a); Push(s, b); Pop(s, x); GetTop(s,x)A.0B.bC.aD.1正确答案:C3、经过以下栈运算后,StackEmpty(s)的值是 _______。
InitStack (s); Push(s, a); Push(s, b); Pop(s, x); Pop(s,y)A.0B.bC.aD.1正确答案:D4、已知一个栈的进栈序列是ABC,出栈序列为CBA,经过栈的操作是 _______。
A.push, push, push, pop, pop, popB.push,pop,push, push,pop, popC.push, push,pop, pop,push,popD.push,pop,push,pop,push,pop正确答案:A5、若元素a、b、c、d、e、f依次进栈,允许进栈、退栈的操作交替进行,但不允许连续3次退栈工作,则不可能得到的出栈序列是 _______。
A. bcaefdB.afedcbC.cbdaefD.dcebfa正确答案:B6、设一个栈的输入序列为A、B、C、D,则借助一个栈所得的输出序列不可能是_______。
A.DCBAB.DABCC.ACDBD.ABCD正确答案:B7、一个栈的进栈序列是abcde,则栈的不可能的输出序列是 _______。
A.decbaB.abcdeC.dceabD.edcba正确答案:C8、已知一个栈的进栈序列是1,2,3,…n,其输出序列的第一个元素是i(1≤i≤n),则第j(1≤j≤n)个出栈元素是_______。
A.n-iB.j-i+1C.iD.不确定正确答案:D9、已知一个栈的进栈序列是1,2,3,…n,其输出序列是p1,p2,…pn,若p1=n,则pi的值是_______。
栈和队列课后习题答案
第三章栈和队列课后习题答案1、单项选择题(1) B(2) B(3) D(4) D(5) C(6) C(7) B(8) C(9) B(10)C2、填空题(1)后进先出先进先出(2)front = rear (rear+1)% Max = front(3)top = 0 top =N-1(4)空空只含有一个结点(5)p->next=top; top=p;(6)rear->next=p; rear=p;(7) 4(8)假上溢3、问答题(1)参考答案:栈的操作特点是后进先出,因此输出序列有:A入,A出,B入,B出,C入C出,输出序列为ABC。
A入,A出,B入,C入,C出,B出,输出序列为ACB。
A入,B入,B出,A出,C入,C出,输出序列为BAC。
A入,B入,B出,C入,C出,A出,输出序列为BCA。
A入,B入,C入,C出,B出,A出,输出序列为CBA。
(2)参考答案:8 3 5 + 5 6 2 / - * -(3)参考答案:一个过程(或函数)直接或间接调用自己,这种过程(或函数)叫递归过程(或函数)。
递归算法一般用于解决三类问题:1)数据的定义是按递归定义的。
(Fibonacci函数)2)问题解法按递归算法实现。
(回溯)3)数据的结构形式是按递归定义的。
(树的遍历,图的搜索)设计递归算法的方法:①寻找递归通式,分解问题;②设置递归出口,确定递归终止条件。
(4)参考答案:向一个顺序栈插入一个元素时,首先使栈顶指针后移一个位置,然后把待插入元素写入到这个位置上。
(5)参考答案:向一个链栈插入一个新结点时,首先把栈顶指针的值赋给新结点的指针域,然后把新结点的存储位置赋给栈顶指针。
(6)参考答案:①一种是在定义结构体时,附设一个存储循环队列中元素个数的变量如n,当n=0时,队空。
当n=MaxSize时为队满。
②另一种方法是少用一个元素控件,约定当尾指针加1等于头指针时,认为是队满,可用于求模运算来实现,即front=rear,称为队空。
第三章栈和队列习题答案
第三章栈和队列习题答案一、基础知识题3.1 设将整数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,43123.2 链栈中为何不设置头结点? 答:链栈不需要在头部附加头结点,因为栈都是在头部进行操作的,如果加了头结点,等于要对头结点之后的结点进行操作,反而使算法更复杂,所以只要有链表的头指针就可以了。
3.3 循环队列的优点是什么? 如何判别它的空和满? 答:循环队列的优点是:它可以克服顺序队列的" 假上溢" 现象,能够使存储队列的向量空间得到充分的利用。
栈与队列习题参考答案
习题三参考答案备注: 红色字体标明的是与书本内容有改动的内容。
一、选择题1.在栈中存取数据的原则是( B )。
A.先进先出 B. 先进后出C. 后进后出D. 没有限制2.若将整数1、2、3、4依次进栈,则不可能得到的出栈序列是( D )。
A.1234 B. 1324 C. 4321 D. 14233.在链栈中,进行出栈操作时(B )。
A.需要判断栈是否满 B. 需要判断栈是否为空C. 需要判断栈元素的类型D. 无需对栈作任何差别4.在顺序栈中,若栈顶指针top指向栈顶元素的下一个存储单元,且顺序栈的最大容量是maxSize,则顺序栈的判空条件是( A )。
A.top==0 B.top==-1 C. top==maxSize D.top==maxSize-15.在顺序栈中,若栈顶指针top指向栈顶元素的下一个存储单元,且顺序栈的最大容量是maxSize。
则顺序栈的判满的条件是( C )。
A.top==0 B.top==-1 C. top==maxSize D.top==maxSize-16.在队列中存取数据元素的原则是( A )。
A.先进先出 B. 先进后出C. 后进后出D. 没有限制7.在循环顺序队列中,假设以少用一个存储单元的方法来区分队列判满和判空的条件,front和rear分别为队首和队尾指针,它们分别指向队首元素和队尾元素的下一个存储单元,队列的最大存储容量为maxSize,则队列的判空条件是(A )。
A.front==rear B. front!=rearC. front==rear+1D. front==(rear+1)% maxSize8.在循环顺序队列中,假设以少用一个存储单元的方法来区分队列判满和判空的条件,front和rear分别为队首和队尾指针,它们分别指向队首元素和队尾元素的下一个存储单元,队列的最大存储容量为maxSize,则队列的判满条件是(D )。
A.front==rear B. front!=rearC. front==rear+1D. front==(rear+1)% maxSize9.在循环顺序队列中,假设以少用一个存储单元的方法来区分队列判满和判空的条件,front和rear分别为队首和队尾指针,它们分别指向队首元素和队尾元素的下一个存储单元,队列的最大存储容量为maxSize,则队列的长度是(C )。
栈、队列练习题(答案)
栈、队列练习题一、选择题1.栈和队列的共同特点是( )。
A.只允许在端点处插入和删除元素B.都是先进后出C.都是先进先出D.没有共同点2.若让元素1、2、3、4依次入栈,则出栈次序不可能出现()A.3 2 1 4 B.2 1 4 3 C.1 4 2 3 D.4 3 2 13.栈的插入和删除操作在( )进行。
A. 栈顶B. 栈底C. 任意位置D. 指定位置4.用单链表表示的链式队列的队头在链表的()位置。
A. 链头B. 链尾C. 链中D. 以上都不是5.在双向循环链表中,在p所指的结点之后插入s指针所指的结点,其操作是()。
A. p->next=s; s->prior=p;p->next->prior=s; s->next=p->next;B. s->prior=p; s->next=p->next;p->next=s; p->next->prior=s;C. p->next=s; p->next->prior=s;s->prior=p; s->next=p->next;D. s->prior=p; s->next=p->next;p->next->prior=s; p->next=s;6.设有一个栈,元素的进栈次序为A, B, C, D, E,下列是不可能的出栈序列( )。
A.A, B, C, D, E B.B, C, D, E, AC.E, A, B, C, D D.E, D, C, B, A7.在一个具有n个单元的顺序栈中,假定以地址低端(即0单元)作为栈底,以top作为栈顶指针,当做出栈处理时,top变化为( )。
A.top不变B.top=0 C.top-- D.top++8.向一个栈顶指针为hs的链栈中插入一个s结点时,应执行( )。
A.hs->next=s;B.s->next=hs; hs=s;C.s->next=hs->next;hs->next=s;D.s->next=hs; hs=hs->next;9.在具有n个单元的顺序存储的循环队列中,假定front和rear分别为队头指针和队尾指针,则判断队满的条件为( )。
栈和队列习题及答案
栈和队列习题及答案【篇一:栈和队列练习题答案】xt>一、填空题1. 线性表、栈和队列都是结构,可以在线性表的在栈顶插入和删除元素;对于队列只能在队尾插入和队首删除元素。
2. 栈是一种特殊的线性表,允许插入和删除运算的一端称为。
不允许插入和删除运算的一端称为栈底。
3. 是被限定为只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表。
二、判断正误(√)1. 栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。
(√)2. 对于不同的使用者,一个表结构既可以是栈,也可以是队列,也可以是线性表。
正确,都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。
错,他们都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。
(√)4. 栈和队列的存储方式既可是顺序方式,也可是链接方式。
(√)5. 两个栈共享一片连续内存空间时,为提高内存利用率,减少溢出机会,应把两个栈的栈底分别设在这片内存空间的两端。
错,有可能。
三、单项选择题(b)1.栈中元素的进出原则是A.先进先出B.后进先出C.栈空则进D.栈满则出(c)2.若已知一个栈的入栈序列是1,2,3,?,n,其输出序列为p1,p2,p3,?,pn,若p1=n,则pi为A.i B.n-iC.n-i+1 D.不确定解释:当p1=n,即n是最先出栈的,根据栈的原理,n必定是最后入栈的(事实上题目已经表明了),那么输入顺序必定是1,2,3,?,n,则出栈的序列是n,?,3,2,1。
(若不要求顺序出栈,则输出序列不确定)(d)3.数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素的公式为(A)r-f; (B)(n+f-r)% n; (C)n+r-f;(D)(n+r -f)% n e:①1 ②2 ③ 3 ④ 0四、阅读理解1. 【严题集3.3②】写出下列程序段的输出结果(栈的元素类型selem type为char)。
数据结构(栈、队列、字符串)习题与答案
1、栈的特点是()。
A.后进后出B.没有顺序C.先进先出D.先进后出正确答案:D2、队列的特点是()。
A.先进后出B.没有顺序C.先进先出D.后进先出正确答案:C3、当利用大小为n的数组(下标从1到n)顺序存储一个栈时,假定用top==n表示栈空,则每次向这个栈插入一个元素时,首先应执行()语句修改top指针。
A.top--;B.top=0;C.top++;D.top=n;正确答案:A4、设栈S和队列Q的初始状态均为空,元素a,b,c,d,e,f,g依次进入栈S。
如果每个元素出栈后立即进入队列Q,且7个元素出队的顺序为b,d,e,f,c,a,g,则栈S的容量至少是( )。
A.1B.4C.3D.2解析:模拟一遍出栈结果,发现栈中最多时候存储的是3个元素5、若栈采用顺序存储方式存储,现两栈共享空间S[1~N],top[i]代表第i个栈( i =1,2)栈顶。
栈1的底在S[1],栈2的底在S[N],则栈满的条件是()。
A.top[1]+top[2]==N-1B.top[1]+1==top[2]C.top[2]-top[1]==0D.top[1]+top[2]==N正确答案:B6、串是一种特殊的线性表,其特殊性体现在()。
A.可以链式存储B.数据元素是一个字符C.数据元素可以是多个字符D.可以顺序存储正确答案:B7、SubStr('DataStructure',5,3)的返回值是()。
A. 'aSt'B. 'taStr'C.'Str'D.'aStrc'正确答案:C8、两个串相等的充分必要条件是()。
A.两个字符串的长度相等B.两个字符串存储形式相同C.两个字符串中对应位置上的字符相等D.两个字符串的长度相等且对应位置上的字符也相等9、StrIndex(‘Index of String’,1,‘Str’)的值是()。
A.12B.10C.11D.9正确答案:B10、下列说法正确的是()。
栈和队列练习题答案
第3章栈和队列练习题答案一、填空题1. 线性表、栈和队列都是线性结构,可以在线性表的任何位置插入和删除元素;对于栈只能在栈顶插入和删除元素;对于队列只能在队尾插入和队首删除元素。
2. 栈是一种特殊的线性表,允许插入和删除运算的一端称为栈顶。
不允许插入和删除运算的一端称为栈底。
3. 队列是被限定为只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表。
二、判断正误(√)1. 栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。
(√)2. 对于不同的使用者,一个表结构既可以是栈,也可以是队列,也可以是线性表。
正确,都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。
(×)3. 栈和队列是一种非线性数据结构。
错,他们都是线性逻辑结构,栈和队列其实是特殊的线性表,对运算的定义略有不同而已。
(√)4. 栈和队列的存储方式既可是顺序方式,也可是链接方式。
(√)5. 两个栈共享一片连续内存空间时,为提高内存利用率,减少溢出机会,应把两个栈的栈底分别设在这片内存空间的两端。
(×)6. 队是一种插入与删除操作分别在表的两端进行的线性表,是一种先进后出型结构。
错,后半句不对。
(×)7. 一个栈的输入序列是12345,则栈的输出序列不可能是12345。
错,有可能。
三、单项选择题(B)1.栈中元素的进出原则是A.先进先出B.后进先出C.栈空则进D.栈满则出(C)2.若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为A.iB.n-iC.n-i+1D.不确定解释:当p1=n,即n是最先出栈的,根据栈的原理,n必定是最后入栈的(事实上题目已经表明了),那么输入顺序必定是1,2,3,…,n,则出栈的序列是n,…,3,2,1。
(若不要求顺序出栈,则输出序列不确定)(D)3.数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素的公式为(A)r-f; (B)(n+f-r)% n; (C)n+r-f; (D)(n+r-f)% nE:①1 ②2 ③3 ④0四、阅读理解1.【严题集3.3②】写出下列程序段的输出结果(栈的元素类型SElem Type为char)。
第三章 栈与队列习题答案
第三章栈与队列习题答案一、基础知识题3、1 设将整数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,43123、2 链栈中为何不设置头结点?答:链栈不需要在头部附加头结点,因为栈都就是在头部进行操作得,如果加了头结点,等于要对头结点之后得结点进行操作,反而使算法更复杂,所以只要有链表得头指针就可以了。
3、3 循环队列得优点就是什么? 如何判别它得空与满?答:循环队列得优点就是:它可以克服顺序队列得"假上溢"现象,能够使存储队列得向量空间得到充分得利用。
栈和队列练习题答案
E: ①1 ②2 四、阅读理解
③3
④0
1. 【严题集 3.3②】 写出下列程序段的输出结果(栈的元素类型 void main( ){ Stack S; Char x,y; InitStack(S); x=’ c’ ;y= ’ k’;
.
SElem Type 为 char)。
Push(S,x); Push(S, ’ a’Pu);sh(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”。
2. 【严题集 3.12②】 写出下列程序段的输出结果(队列中的元素类型 void main( ){ Queue Q; Init Queue (Q); Char x= ’ e’ ; y= ’ c’; EnQueue (Q, ’ h’Q);uEeune (Q, ’ r ’En);Queue (Q, y); DeQueue (Q,x); EnQueue (Q,x); DeQueue (Q,x); EnQ ueue (Q, ’ a’ ); while(!QueueEmpty(Q)){ DeQueue (Q,y);printf(y); }; Printf(x); } 答:输出为“ char”。
第 3 章栈和队列练习题答案
精品文档
一、填空题
1. 线性表、栈和队列都是 线性 结构,可以在线性表的
在 栈顶 插入和删除元素;对于队列只能在
队尾
任何 插入和
位置插入和删除元素;对于栈只能 队首 删除元素。
2. 栈是一种特殊的线性表,允许插入和删除运算的一端称为
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
习题三参考答案备注: 红色字体标明的是与书本内容有改动的内容。
一、选择题1.在栈中存取数据的原则是( B )。
A.先进先出 B. 先进后出C. 后进后出D. 没有限制2.若将整数1、2、3、4依次进栈,则不可能得到的出栈序列是( D )。
A.1234 B. 1324 C. 4321 D. 14233.在链栈中,进行出栈操作时(B )。
A.需要判断栈是否满 B. 需要判断栈是否为空C. 需要判断栈元素的类型D. 无需对栈作任何差别4.在顺序栈中,若栈顶指针top指向栈顶元素的下一个存储单元,且顺序栈的最大容量是maxSize,则顺序栈的判空条件是( A )。
A.top==0 B.top==-1 C. top==maxSize D.top==maxSize-15.在顺序栈中,若栈顶指针top指向栈顶元素的下一个存储单元,且顺序栈的最大容量是maxSize。
则顺序栈的判满的条件是( C )。
A.top==0 B.top==-1 C. top==maxSize D.top==maxSize-16.在队列中存取数据元素的原则是( A )。
A.先进先出 B. 先进后出C. 后进后出D. 没有限制7.在循环顺序队列中,假设以少用一个存储单元的方法来区分队列判满和判空的条件,front和rear分别为队首和队尾指针,它们分别指向队首元素和队尾元素的下一个存储单元,队列的最大存储容量为maxSize,则队列的判空条件是(A )。
A.front==rear B. front!=rearC. front==rear+1D. front==(rear+1)% maxSize8.在循环顺序队列中,假设以少用一个存储单元的方法来区分队列判满和判空的条件,front和rear分别为队首和队尾指针,它们分别指向队首元素和队尾元素的下一个存储单元,队列的最大存储容量为maxSize,则队列的判满条件是(D )。
A.front==rear B. front!=rearC. front==rear+1D. front==(rear+1)% maxSize9.在循环顺序队列中,假设以少用一个存储单元的方法来区分队列判满和判空的条件,front和rear分别为队首和队尾指针,它们分别指向队首元素和队尾元素的下一个存储单元,队列的最大存储容量为maxSize,则队列的长度是(C )。
A.rear-front B. rear-front+1C. (rear-front+maxSize)%maxSizeD. (rear-front+1)%maxSize10.设长度为n的链队列采用单循环链表加以表示,若只设一个头指针指向队首元素,则入队操作的时间复杂度为( B )。
A.O(1) B.O(n) C.O(log2n) D.O(n2)二、填空题1.栈是一种操作受限的特殊线性表,其特殊性体现在其插入和删除操作都限制在表尾进行。
允许插入和删除操作的一端称为栈顶,而另一端称为栈底。
栈具有后进先出的特点。
2.栈也有两种存储结构,一种是顺序存储,另一种是链式存储;以这两种存储结构存储的栈分别称为顺序栈和链栈。
3.在顺序栈中,假设栈顶指针top是指向栈顶元素的下一个存储单元,则顺序栈判空的条件是 top==0 ; 栈顶元素的访问形式是 stackElem[top-1] ;4.在不带表头结点的链栈中,若栈顶指针top直接指向栈顶元素,则将一个新结点p入栈时修改链的两个对应语句为 p.setNext(top) ; top=p; 。
5.在不带表头结点的链栈中,若栈顶指针top直接指向栈顶元素,则栈顶元素出栈时的修改链的对应语句为top=top.getNext(); 。
6.队列也是一种操作受限的线性表,它与栈不同的是,队列中所有的插入操作均限制在表的一端进行,而所有的删除操作都限制在表的另一端进行,允许插入的一端称为队尾,允许删除的一端称为队首。
队列具有先进先出的特点。
7.由于队列的删除和插入操作分别在队首和队尾进行,因此,在链式存储结构描述中分别需要设置两个指针分别指向队首结点和队尾结点,这两个指针又分别称为队首指针和队尾指针。
8.循环顺序队列是将顺序队列的存储区域看成是一个首尾相连的环,首尾相连的状态是通过数学上的求模(或取余)运算来实现的。
9.在循环顺序队列中,若规定当front==rear时,循环队列为空;当front==(rear+1)%maxSize时,循环队列为满,则入队操作时的队尾指针变化的相应语句是 rear=(rear+1)% maxSize ;出队操作时的队首指针变化的相应语句是 front=(front+1)%maxSize 。
10.无论是顺序栈还是顺序队列,插入元素时必须先进行栈或队列是否为满的判断,删除元素时必须先进行栈或队列是否为空的判断;而链栈或链队列中,插入元素无需进行栈或队列是否为满的判断,只要在删除元素时先进行栈或队列是否为空的判断。
三、算法设计题1.编写一个函数,要求借助一个栈把一个数组中的数据元素逆置。
参考答案://借助一个顺序栈将已知一个数组中的数据元素逆置public reverse(Object [] a) throws Exception {SqStack S=new SqStack(a.length); //构造一个容量为a.length的顺序栈for(int i=0;i<a.length;i++)S.push(a[i]);for( int i=0;i<a.length;i++)a[i]=S.pop();}2.编写一个函数判断一个字符序列是否为回文序列,所谓回文序列就是正读与反读都相同的字符序列,例如:abba和abdba均是回文序列。
要求只使用栈来实现。
参考答案://判断字符序列是否为回文序列,若是则返回true值,否则返回false。
public boolean isPalindSeq(String str) {LinkStack S = new LinkStack();int i = 0;for (; i < str.length(); i++)S.push(str.charAt(i));for (i = 0; i < str.length(); i++) {char c = ((Character) S.pop()).charValue();if (c != str.charAt(i))return false;}return true;}3.假设以一个数组实现两个栈:一个栈以数组的第一个存储单元作为栈底,另一个栈以数组的最后一个存储单元作为栈底,这种栈称为顺序双向栈。
试编写一个顺序双向栈类DuSqStack,类中要求编写3个方法。
一个是构造方法DuDuSqStack(int maxSize),此方法实现构造一个容量为maxSize的顺序双向空栈;一个是实现入栈操作的方法push(Object X,int i),此方法完成将数据元素X压入到第i(i=0或1)号栈中的操作;一个是实现出栈操作的方法pop(int i),此方法完成将第i号栈的栈顶元素出栈的操作。
参考答案:class DuSqStack{private Object[] stackElem; // 栈存储空间private int top0; //栈顶指针,指示第0号的栈顶元素的下一个位置private int top1; //栈顶指针,指示第1号的栈顶元素的下一个位置private int base0;//栈尾指针,指示第0号的栈底元素private int base1;//栈尾指针,指示第1号的栈底元素//构造方法public DuSqStack(int maxSize) {// 初始化栈,即构造一个双向空栈stackElem = new Object[maxSize];// 为栈分配maxSize个存储单元top0=base0=0;top1=base1=maxSize-1;}//入栈操作方法public void push(Object X, int i) throws Exception {// 将数据元素X压入到第i(i的值为0或1)号栈中if (top0 > top1) //栈满throw new Exception("栈已满");// 抛出异常else if (i==0)stackElem[top0++]=X;else if (i==1)stackElem[top1--]=X;}//出栈操作方法public Object pop(int i) throws Exception {// 将S中第i号栈的栈顶元素出栈,并返回栈顶元素值Object x=null;if(i==0)if (top0==base0)throw new Exception("第0号栈为空");elsex=stackElem[--top0];else if (i==1)if (top1==base1)throw new Exception("第0号栈为空");elsex=stackElem[++top1];return x;}} // DuSqStack类结束4.循环顺序队列类采用设置一个计数器的方法来区分循环队列的判空和判满。
试分别编写顺序循环队列中入队和出队操作的函数。
参考答案://循环顺序队列存储结构类描述如下:class CircleSqQueue_num {private Object[] queueElem; // 队列存储空间private int front;// 队首的引用,若队列不空,指向队首元素,初值为0private int rear;// 队尾的引用,若队列不空,指向队尾元素的下一个位置,初值为0private int num; // 计数器用来记录队列中的数据元素个数……} // CircleSqQueue_num类结束为类CircleSqQueue_num所编写的入队和出队操作方法如下:// 入队操作方法public void offer(Object x) throws Exception {//把指定的元素x插入队列if (num==queueElem.length)// 队列满throw new Exception("队列已满");// 输出异常else {// 队列未满queueElem[rear] = x;// x加入队尾rear=(rear + 1) % queueElem.length; //更改队尾的位置++num; //计数器加1}}// 出队操作方法public Object poll() {//移除队首元素并作为此函数的值返回该对象,如果此队列为空,则返回 nullif (num==0)// 队列为空return null;else {Object t = queueElem[front];// 取出队首元素front = (front + 1) % queueElem.length;// 更改队首的位置--num; //计数器减1return t;// 返回队首元素}}5.假设采用带头结点的循环链表来表示队列,并且只设一个指向队尾元素的指针(不设队首指针),试编写相应的队列置空、队列判空、入队和出队操作的函数。