完整第三章 栈与队列 考研真题精选
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第三部分考研真题精选
一选择题
1.关于栈操纵数据的原那么是〔〕。
A.进步先出
B.落后先出
C.落后后出
D.不分次序
2.在作进栈运算时,应先判不栈是否(①),在作退栈运算时应先判不栈是否(②)。
当栈中元素为n个,作进栈运算时发作上溢,那么阐明该栈的最年夜容量为(③)。
为了添加内存空间的应用率跟增加溢出的能够性,由两个栈共享一片延续的内存空间时,应将两栈的(④)分不设在这片内存空间的两头,如斯,当(⑤)时,才发生上溢。
①,②:A.空B.满C.上溢D.下溢
③:A.n-1B.nC.n+1D.n/2
④:A.长度B.深度C.栈顶D.栈底
⑤:A.两个栈的栈顶同时抵达栈空间的核心点.
B.此中一个栈的栈顶抵达栈空间的核心点.
C.两个栈的栈顶在栈空间的某一地位相遇.
D.两个栈均不空,且一个栈的栈顶抵达另一个栈的栈底.
3.一个栈的输入序列为123…n,假设输入序列的第一个元素是n,输入第i〔1<=i<=n〕个元素是〔〕。
A.不断定
B.n-i+1
C.i
D.n-i
4.假设一个栈的输入序列为1,2,3,…,n,输入序列的第一个元素是i,那么第j个输入元素是〔〕。
A.i-j-1
B.i-j
C.j-i+1
D.不断定的
5.假设曾经明白一个栈的入栈序列是1,2,3,…,n,其输入序列为p1,p2,p3,…,p N,假设p N是n,那么p i是()。
A.i
B.n-i
C.n-i+1
D.不断定
6.有六个元素6,5,4,3,2,1的次序进栈,咨询以下哪一个不是正当的出栈序列?〔〕
A.543612
B.453126
C.346521
D.234156
7.设栈的输入序列是1,2,3,4,那么〔〕不克不及够是其出栈序列。
A.1,2,4,3,
B.2,1,3,4,
C.1,4,3,2,
D.4,3,1,2,
E.3,2,1,4,
8.一个栈的输入序列为12345,那么以下序列中不克不及够是栈的输入序列的是〔〕。
A.23415
B.54132
C.23145
D.15432
9.设一个栈的输入序列是1,2,3,4,5,那么以下序列中,是栈的正当输入序列的是〔〕。
A.51234
B.45132
C.43125
D.32154
10.某客栈的输入序列为a,b,c,d,下面的四个序列中,不克不及够是它的输入序列的是〔〕。
A.a,c,b,d
B.b,c,d,a
C.c,d,b,a
D.d,c,a,b
11.设abcdef以所给的次第进栈,假设在进栈操纵时,同意退栈操纵,那么下面得不到的序列为〔〕。
A.fedcbaB.bcafedC.dcefbaD.cabdef
12.设有三个元素X,Y,Z次序进栈〔进的进程中同意出栈〕,以下得不到的出栈陈列是()。
A.XYZB.YZXC.ZXYD.ZYX
13.输入序列为ABC,能够变为CBA时,经过的栈操纵为〔〕
A.push,pop,push,pop,push,pop
B.push,push,push,pop,pop,pop
C.push,push,pop,pop,push,pop
D.push,pop,push,push,pop,pop
14.假设一个栈以向量V[1..n]存储,初始栈顶指针top为n+1,那么下面x进栈的准确操纵是()。
A.top:=top+1;V[top]:=xB.V[top]:=x;top:=top+1
C.top:=top-1;V[top]:=x
D.V[top]:=x;top:=top-1
15.假设栈采纳次序存储方法存储,现两栈共享空间V[1..m],top[i]代表第i个栈(i=1,2)栈顶,栈1的底在v[1],栈2的底在V[m],那么栈满的前提是〔〕。
A.|top[2]-top[1]|=0
B.top[1]+1=top[2]
C.top[1]+top[2]=m
D.top[1]=top[2]
16.栈在〔〕中应用。
A.递归挪用
B.子次序挪用
C.表白式求值
D.A,B,C
17.一个递归算法必须包含〔〕。
A.递归部分
B.停止前提跟递归部分
C.迭代部分
D.停止前提跟迭代部分
18.履行完以下语句段后,i值为:〔〕
intf(intx)
{return((x>0)?x*f(x-1):2);}
inti;
i=f(f(1));
A.2B.4 C.8D.有限递归
19.表白式a*(b+c)-d的后缀表白式是()。
A.abcd*+-B.abc+*d-C.abc*+d-D.-+*abcd
20.表白式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;(*^(-
21.计划一个判不表白式中左,右括号是否配对呈现的算法,采纳〔〕数据构造最准确。
A.线性表的次序存储构造B.行列C.线性表的链式存储构造D.栈
22.用链接方法存储的行列,在进展删除运算时〔〕。
A.仅修正头指针
B.仅修正尾指针
C.头、尾指针都要修正
D.头、尾指针能够都要修正
23.用不带头结点的单链表存储行列时,其队头指针指向队头结点,其队尾指针指向队尾结点,那么在进展删除操纵时()。
A.仅修正队头指针B.仅修正队尾指针
C.队头、队尾指针都要修正
D.队头,队尾指针都能够要修正
24.递归进程或函数挪用时,处置参数及前往地点,要用一种称为〔〕的数据构造。
A.行列B.多维数组C.栈D.线性表
25.假设以数组A[m]寄存轮回行列的元素,其头尾指针分不为front跟rear,那么以后行列中的元素个数为〔〕。
A.(rear-front+m)%mB.rear-front+1
C.(front-rear+m)%mD.(rear-front)%m
26.轮回行列A[0..m-1]寄存其元素值,用front跟rear分不表现队头跟队尾,那么以后行列中的元素数是()。
A.(rear-front+m)%m
B.rear-front+1
C.rear-front-1
D.rear-front
27.轮回行列存储在数组A[0..m]中,那么入队时的操纵为〔〕。
A.rear=rear+1
B.rear=(rear+1)mod(m-1)
C.rear=(rear+1)modm
D.rear=(rear+1)mod(m+1)
28.假设用一个巨细为6的数组来实现轮回行列,且以后rear跟front的值分不为0跟3,当从行列中删除一个元素,再参加两个元素后,rear跟front的值分不为几多?()
A.1跟5
B.2跟4
C.4跟2
D.5跟1
29.曾经明白输入序列为abcd经过输入受限的双向行列后能失失落的输入序列有〔〕。
A.dacb
B.cadb
C.dbca
D.bdac
E.以上谜底都错误
30.假设以1234作为双端行列的输入序列,那么既不克不及由输入受限的双端行列失失落,也不克不及由输入受限的双端行列失失落的输入序列是()。
A.1234
B.4132
C.4231
D.4213
31.最年夜容量为n的轮回行列,队尾指针是rear,队头是front,那么队空的前提是〔〕。
A.(rear+1)MODn=front
B.rear=front
C.rear+1=frontD.(rear-l)MODn=front
32.栈跟行列的独特色是〔〕。
A.基本上进步先出
B.基本上进步后出
C.只同意在端点处拔出跟删除元素
D.不独特色
33.栈的特色是〔①〕,行列的特色是〔②〕,栈跟行列基本上〔③〕。
假设进栈序列为1,2,3,4那么〔④〕不克不及够是一个出栈序列〔不必定全体进栈后再出栈〕;假设进行列的序列为1,2,3,4那么〔⑤〕是一个出行列序列。
①,②:A.进步先出B.落后先出C.进优于出D.出优于进
③:A.次序存储的线性构造B.链式存储的线性构造
C.限度存取点的线性构造
D.限度存取点的非线性构造
④,⑤:A.3,2,1,4B.3,2,4,1 C.4,2,3,1D.4,3,2,1 F.1,2,3,4 G.1,3,2,4
34.栈跟队基本上〔〕
A.次序存储的线性构造B.链式存储的非线性构造
C.限度存取点的线性构造
D.限度存取点的非线性构造
35.设栈S跟行列Q的初始形态为空,元素e1,e2,e3,e4,e5跟e6顺次经过栈S,一个元素出栈后即进行列Q,假设6个元素出队的序列是e2,e4,e3,e6,e5,e1那么栈S的容量至多应当是()。
A.6B.4 C.3D.2
36.用单链表表现的链式行列的队头在链表的〔〕地位。
A.链头B.链尾C.链中
37.顺次读入数据元素序列{a,b,c,d,e,f,g}进栈,每进一个元素,呆板可请求下一个元素进栈或弹栈,如斯进展,那么栈空时弹出的元素形成的序列是以下哪些序列?
A.{d,e,c,f,b,g,a}B.{f,e,g,d,a,c,b}
C.{e,f,d,g,b,c,a}
D.{c,d,b,e,f,a,g}
二推断题
1.消弭递归不必定需求应用栈,此说法〔〕
2.栈是实现进程跟函数等子次序所必须的构造。
〔〕
3.两个栈共用静态存储空间,仇家应用也存在空间溢出咨询题。
〔〕】
4.两个栈共享一片延续内存空间时,为进步内存应用率,增加溢出时机,应把两个栈的栈底分不设在这片内存空间的两头。
〔〕
5.即便对不含一样元素的统一输入序列进展两组差其余正当的入栈跟出栈组合操纵,所得的输入序列也必定一样。
〔〕
6.有n个数次序〔顺次〕进栈,出栈序列有Cn种,Cn=[1/〔n+1〕]*〔2n〕!/[(n!)*(n!)]。
〔〕
7.栈与行列是一种特别操纵的线性表。
〔〕
8.假设输入序列为1,2,3,4,5,6,那么经过一个栈能够输入序列3,2,5,6,4,1.〔〕
9.栈跟行列基本上限度存取点的线性构造。
〔〕
10.假设输入序列为1,2,3,4,5,6,那么经过一个栈能够输入序列1,5,4,6,2,3。
〔〕
11.任何一个递归进程都能够转换成非递归进程。
〔〕【上海交通年夜学1998一、3〔1分〕】
12.只要那种应用了部分变量的递归进程在转换成非递归进程时才必须应用栈。
〔〕
13.行列是一种拔出与删除操纵分不在表的两头进展的线性表,是一种进步后出型构造。
〔〕
14.平日应用行列来处置函数或进程的挪用。
〔〕
15.行列逻辑上是一个下端跟上端既能添加又能增加的线性表。
〔〕
16.轮回行列平日用指针来实现行列的头尾相接。
〔〕
17.轮回行列也存在空间溢出咨询题。
〔〕
18.行列跟栈基本上运算受限的线性表,只同意在表的两头进展运算。
〔〕
19.栈跟行列基本上线性表,只是在拔出跟删除时遭到了一些限度。
〔〕
20.栈跟行列的存储方法,既能够是次序方法,又能够是链式方法。
〔〕
三填空题
1.栈是_______的线性表,其运算遵照_______的原那么。
2._______是限制仅在表尾进展拔出或删除操纵的线性表。
3.一个栈的输入序列是:1,2,3那么不克不及够的栈输入序列是_______。
4.设有一个空栈,栈顶指针为1000H(十六进制),现有输入序列为1,2,3,4,5,经过PUSH,PUSH,POP,PUSH,POP,PUSH,PUSH之后,输入序列是_______,而栈顶指针值是_______H。
设栈为次序栈,每个元素占4个字节。
5.当两个栈共享一存储区时,栈应用一维数组stack(1,n)表现,两栈顶指针为top[1]与top[2],那么当栈1空时,top[1]为_______,栈2空时,top[2]为_______,栈满时为_______。
6.两个栈共享空间时栈满的前提_______。
7.在作进栈运算时应先判不栈是否_(1)_;在作退栈运算时应先判不栈是否_(2)_;当栈中元素为n个,作进栈运算时发作上溢,那么阐明该栈的最年夜容量为_(3)_。
为了添加内存空间的应用率跟增加溢出的能够性,由两个栈共享一片延续的空间时,应将两栈的_(4)_分不设在内存空间的两头,如斯只要当_(5)_时才发生溢出。
】
8.多个栈共存时,最好用_______作为存储构造。
9.用S表现入栈操纵,X表现出栈操纵,假设元素入栈的次序为1234,为了失失落1342出栈次序,响应的S跟X的操纵串为_______。
10.次序栈用data[1..n]存储数据,栈顶指针是top,那么值为x的元素入栈的操纵是_______。
11.表白式23+((12*3-2)/4+34*5/7)+108/9的后缀表白式是_______。
12.轮回行列的引入,目标是为了克制_______。
13.用下标0开场的N元数组实现轮回行列时,为实现下标变量M加1后在数组无效下标范畴内轮回,可采纳的表白式是:M:=_______〔填PASCAL言语,C言语的考生不填〕;M=_______〔填C言语,PASCAL言语的考生不填〕。
14.________又称作进步先出表。
15.行列的特色是_______。
16.行列是限度拔出只能在表的一端,而删除在表的另一端进展的线性表,其特色是_______。
17.曾经明白链行列的头尾指针分不是f跟r,那么将值x入队的操纵序列是_______。
18.辨别轮回行列的满与空,只要两种办法,它们是______跟______。
19.设轮回行列用数组A[1..M]表现,队首、队尾指针分不是FRONT跟TAIL,断定队满的前提为_______。
20.设轮回行列寄存在向量sq.data[0:M]中,那么队头指针sq.front在轮回意思下的出队操纵可表现为_______,假设用就义一个单位的办法来辨别队满跟队空〔设队尾指针sq.rear〕,那么队满的前提为_______。
21.表白式求值是_______应用的一个典范例子。
22.轮回行列用数组A[0..m-1]寄存其元素值,曾经明白其头尾指针分不是front跟rear,那么以后行列的元素个数是_______。
23.设Q[0..N-1]为轮回行列,其头、尾指针分不为P跟R,那么队Q中以后所含元素个数为_______。
四应用题
1.名词说明:栈。
2.名词说明:行列。
3.什么是轮回行列?
4.假设以S跟X分不表现入栈跟出栈操纵,那么对初态跟终态均为空的栈操纵可由S跟X 构成的序列表现〔如SXSX〕。
〔1〕试指出判不给定序列是否正当的普通规那么。
〔2〕两个差别正当序列〔对统一输入序列〕是否失失落一样的输入元素序列?如能失失落,请举列阐明。
5.有5个元素,其入栈次第为:A,B,C,D,E,在种种能够的出栈次第中,以元素C,D 开始出栈〔即C第一个且D第二个出栈〕的次第有哪几多个?
6.假如输入序列为123456,试咨询是否经过栈构造失失落以下两个序列:435612跟135426;请阐明什么原因不克不及或怎样才干失失落。
7.假设元素的进栈序列为:A、B、C、D、E,应用栈操纵,是否失失落出栈序列B、C、A、
E、D跟D、B、A、C、E?什么原因?
8.设输入序列为a,b,c,d,试写出借助一个栈可失失落的两个输入序列跟两个不克不及失失落的输入序列。
9.设输入序列为2,3,4,5,6,应用一个栈能失失落序列2,5,3,4,6吗?栈能够用单链表实现吗?
10.试证实:假设借助栈由输入序列1,2,…,n失失落输入序列为P1,P2,…,P n〔它是输入序列的一个陈列〕,那么在输入序列中不克不及够呈现如斯的情况:存在着i<j<k,使P j<P k<P i。
11.设一数列的输入次序为123456,假设采纳客栈构造,并以A跟D分不表现入栈跟出栈操纵,试咨询经过入出栈操纵的正当序列。
〔1〕是否失失落输入次序为325641的序列。
〔5分〕
〔2〕是否失失落输入次序为154623的序列。
〔5分〕
12.〔1〕什么是递归次序?
〔2〕递归次序的优、缺陷是什么?
〔3〕递归次序在履行时,应借助于什么来实现?
〔4〕递归次序的入书面语句、出书面语句普通用什么语句实现?
13.当进程P递归挪用本身时,进程P外部界说的部分变量在P的2次挪用时期是否占用统一数据区?什么原因?
14.试推导出当总盘数为n的Hanoi塔的挪动次数。
15.用一个数组S〔设巨细为MAX〕作为两个客栈的共享空间。
请阐明共享办法,栈满/栈空的推断前提,并用C或PASCAL计划公用的入栈操纵push〔i,x〕,此中i为0或1,用于表现栈号,x为入栈值。
16.用栈实现将中断表白式8-(3+5)*(5-6/2)转换成后缀表白式,画出栈的变更进程图。
17.在表白式中,有的运算符请求从右到左盘算,如A**B**C的盘算次第应为(A**(B**C)),这在由中断天生后缀的算法中是怎么样实现的?(以**为例阐明)
18.有字符串次第为3*-y-a/y^2,应用栈,给出将次第改为3y-*ay2^/-的操纵步调。
〔可用X代表该字符串进程中次序取一个字符进栈的操纵,用S代表从栈中掏出一个字符参加到新字符串尾的出栈操纵。
比方,ABC变为BCA的操纵步调为XXSXSS〕
19.内存中一片延续空间〔无妨假设地点从1到m〕供给应两个栈S1跟S2应用,怎么样调配这部分存储空间,使得对任一个栈,仅当这部分空间全满时才发作上溢。
20.将两个栈存入数组V[1..m]应怎样布置最好?这时栈空、栈满的前提是什么?
21.在一个算法中需求树破多个客栈时能够选用以下三种计划之一,试咨询:这三种计划之间比拟拟各有什么优缺陷?
〔1〕分不用多个次序存储空间树破多个独破的客栈;
〔2〕多个客栈共享一个次序存储空间;
〔3〕分不树破多个独破的链接客栈。
22.在某次序中,有两个栈共享一个一维数组空间SPACE[N]、SPACE[0]、SPACE[N-1]分不是两个栈的栈底。
〔1〕对栈1、栈2,试分不写出〔元素x〕入栈的要紧语句跟出栈的要紧语句。
〔2〕对栈1、栈2,试分不写出栈满、栈空的前提。
23.简述次序存储行列的假溢出的防止办法及行列满跟空的前提。
24.举例阐明次序队的“假溢出〞景象,并给出处置计划。
25.怎么样断定轮回行列的空跟满?
26.扼要表白轮回行列的数据构造,并写出其初始形态、行列空、行列满时的队首指针与队尾指针的值。
27.应用两个栈sl,s2模仿一个行列时,怎样用栈的运算实现行列的拔出,删除以及判队空运算。
请简述这些运算的算法思维。
28.假如用一个轮回数组q[0..m-1]表现行列时,该行列只要一个行列头指针front,不设行列尾指针rear,而改置计数器count用以记载行列中结点的个数。
〔1〕编写实现行列的三个根本运算:判空、入队、出队
〔2〕行列中能包容元素的最多个数是几多?
29.给出轮回行列中元素个数的盘算式(设队最年夜长度为N,队首指针FRONT,队尾指针REAR)
30.次序行列普通应当构造成为环状行列的方法,并且普通行列头或尾此中之一应当特别处置。
比方,行列为listarray[0..n-1],行列头指针为front,行列尾指针为rear,那么listarray[rear]表现下一个能够拔出行列的地位。
请说明其缘故。
31.设一个双端行列,元素进入该行列的次第为a,b,c,d。
求既不克不及由输入受限的双端行列失失落,又不克不及由输入受限的双端行列失失落的输入序列。
32.假设以1、2、3、4作为双端行列的输入序列,试分不求出以下前提的输入序列:
〔1〕能由输入受限的双端行列失失落,但不克不及由输入受限的双端行列失失落的输入序列;
〔2〕能由输入受限的双端行列失失落,但不克不及由输入受限的双端行列失失落的输入序列;
〔3〕既不克不及由输入受限的双端行列失失落,也不克不及由输入受限的双端行列失失落的输入序列。
33.假设以数组sq[0..7]寄存轮回行列元素,变量f指向队头元素的前一地位,变量r指向队尾元素,如用A跟D分不表现入队跟出队操纵,请给出:
〔1〕队空的初始前提;
〔2〕履行操纵序列A3D1A5D2A1D2A4时的形态,并作须要的阐明。
34、设输入元素为1、2、3、P跟A,输入次第为123PA,如图〔编者略〕。
元素经过栈后达输入序列,当一切元素均抵达输入序列后,有哪些序列能够作为初级言语的变量名。
考研真题精选谜底
一、选择题
部分谜底说明如下。
1、尾递归的消弭就不需用栈
2、那个数是前序序列为1,2,3,…,n,所能失失落的不相似的二叉树的数量。
三、填空题
1、操纵受限〔或限制仅在表尾进展拔出跟删除操纵〕落后先出
2、栈
3、312
4、23100CH
5、0n+1top[1]+1=top[2]
6、两栈顶指针值相减的相对值为1〔或两栈顶指针相邻〕。
7、(1)满(2)空(3)n(4)栈底(5)两栈顶指针相邻〔即值之差的相对值为1〕
8、链式存储构造9、S×SS×S××10、data[++top]=x;
11、*2-4/34.5*7/++108.9/+〔注:表白式中的点(.)表现将数离隔,如是三个数〕
12、假溢出时少量挪动数据元素。
13、(M+1)MODN(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〕MODM=FRONT(数组下标0到M-1,假设必定应用1到M,那么取模为0者,值改取M
20、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;
四、应用题
1、栈是只准在一端进展拔出跟删除操纵的线性表,同意拔出跟删除的一端叫栈顶,另一端叫栈底。
最初拔出的元素开始删除,故栈也称落后先出〔LIFO〕表。
2、行列是同意在一端拔出而在另一端删除的线性表,同意拔出的一端叫队尾,同意删除的一端叫队头。
开始拔出队的元素开始分开〔删除〕,故行列也常称进步先出〔FIFO〕表。
3、用惯例意思下次序存储构造的一维数组表现行列,因为行列的性子〔队尾拔出跟队头删除〕,轻易形成“假溢出〞景象,即队尾已抵达一维数组的高低标,不克不及再拔出,但是队中元素个数小于行列的长度〔容量〕。
轮回行列是处置“假溢出〞的一种办法。
平日把一维数组当作首尾相接。
在轮回行列下,平日采纳“就义一个存储单位〞或“作标记〞的办法处置“队满〞跟“队空〞的断定咨询题。
4、〔1〕平日有两条规那么。
第一是给定序列中S的个数跟X的个数相称;第二是从给定序列的开场,到给定序列中的任一地位,S的个数要年夜于或等于X的个数。
〔2〕能够失失落一样的输入元素序列。
比方,输入元素为A,B,C,那么两个输入的正当序列ABC跟BAC均可失失落输入元素序列ABC。
关于正当序列ABC,咱们应用此题商定的S×S×S×操纵序列;关于正当序列BAC,咱们应用SS××S×操纵序列。
5、三个:CDEBA,CDBEA,CDBAE
6、输入序列为123456,不克不及得出435612,其来由是,输入序列最初两元素是12,前面4个元素〔4356〕失失落后,栈中元素剩12,且2在栈顶,不克不及够栈底元素1在栈顶元素2之前出栈。
失失落135426的进程如下:1入栈并出栈,失失落部分输入序列1;而后2跟3入栈,3出栈,部分输入序列变为:13;接着4跟5入栈,5,4跟2顺次出栈,部分输入序列变为13542;最初6入栈并退栈,得终极后果135426。
7、能失失落出栈序列B、C、A、E、D,不克不及失失落出栈序列D、B、A、C、E。
其来由为:假设出栈序列以D扫尾,阐明在D之前的入栈元素是A、B跟C,三个元素中C 是栈顶元素,B跟A不克不及够早于C出栈,故不克不及够失失落D、B、A、C、E出栈序列。
8、借助栈构造,n个入栈元素可失失落1/(n+1)((2n〕!/〔n!*n!〕)种出栈序列。
此题4个元素,可有14种出栈序列,abcd跟dcba确实是此中两种。
但dabc跟adbc是不克不及够失失落的两种。
9、不克不及失失落序列2,5,3,4,6。
栈能够用单链表实现,这确实是链栈。
因为栈只在栈顶操纵,因而链栈平日不设头结点。
10、假如i<j,那么关于p i<p j状况,阐明p i在p j入栈前先出栈。
而关于p i>p j的状况,那么阐明要将p j压到p i之上,也确实是在p j出栈之后p i才干出栈。
这就阐明,关于i<j<k,不克不及够呈现p j<p k<p i的输入序列。
换句话说,关于输入序列1,2,3,不克不及够呈现3,1,2的输入序列。
11、〔1〕能失失落325641。
在123顺次进栈后,3跟2出栈,得部分输入序列32;而后4,5入栈,5出栈,得部分出栈序列325;6入栈并出栈,得部分输入序列3256;最初退栈,直到栈空。
得输入序列325641。
其操纵序列为AAADDAADADDD。
〔2〕不克不及失失落输入次序为154623的序列。
部分正当操纵序列为ADAAAADDAD,失失落部分输入序列1546后,栈中元素为23,3在栈顶,故不克不及够2先出栈,得不到输入序列154623。
12、〔1〕一个函数在终了本函数之前,直截了当或直接挪用函数本身,称为递归。
比方,函数f在履行中,又挪用函数f本身,这称为直截了当递归;假设函数f在履行中,挪用函数g,而g在履行中,又挪用函数f,这称为直接递归。
在实践应用中,多为直截了当递归,也常简称为递归。
〔2〕递归次序的长处是次序构造庞杂、明晰,易证实其准确性。
缺陷是履行中占内存空间较多,运转效力低。
〔3〕递归次序履行中需借助栈这种数据构造来实现。
〔4〕递归次序的入书面语句跟出书面语句普通用前提推断语句来实现。
递归次序由根本项跟归结项构成。
根本项是递归次序出口,即不再递归即可求出后果的部分;归结项是将本来咨询题化成庞杂的且与本来方法一样的咨询题,即向着“根本项〞开展,终极“抵达〞根本项。
13、进程p递归挪用本身时,进程p由外部界说的部分变量在p的2次挪用时期,不占统一数据区。
每次挪用都保存其数据区,这是递归界说所决议,用“递归任务栈〞来实现。
14、设H n为n个盘子的Hanoi塔的挪动次数。
(假设n个盘子从钢针X移到钢针Z,可借助钢针Y)
那么H n=2H n-1+1//先将n-1个盘子从X移到Y,第n个盘子移到Z,再将那n-1个移到Z =2〔2H n-2+1〕+1
=22H n-2+2+1
=22〔2H n-3+1〕+2+1
=23H n-3+22+2+1
·
·
·
=2k H n-k+2k-1+2k-2+…+21+20
=2n-1H1+2n-2+2n-3+…+21+20
因为H1=1,因而原式H n=2n-1+2n-2+…+21+20=2n-1
故总盘数为n的Hanoi塔的挪动次数是2n-1。
15、两栈共享一贯量空间〔一维数组〕,栈底设在数组的两头,两栈顶相邻时为栈满。
设共享数组为S[MAX],那么一个栈顶指针为-1,另一个栈顶指针为MAX时,栈为空。
用C写的入栈操纵push〔i,x〕如下:
constMAX=共享栈能够抵达的最年夜容量
typedefstructnode
{elemtypes[MAX];
inttop[2];
}anode;
anodeds;
intpush(inti,elemtypex)
//ds为容量有MAX个范例为elemtype的元素的一维数组,由两个栈共享其空间。
i 的值为0或1,x为范例为elemtype的元素。
本算法将x压入栈中。
如压栈胜利,前往1;否那么,前往0。
{if〔ds.top[1]-ds.top[0]==1〕{printf〔“栈满\n〞〕;return〔0〕;}
switch〔i〕
{case0:ds.s[++ds.top[i]]=x;break;
case1:ds.s[--ds.top[i]]=x;
return〔1〕;}//入栈胜利。
}
16、中断表白式8-(3+5)*(5-6/2〕的后缀表白式是:835+562/-*-
栈的变更进程图略〔请拜见22题〕,表白式天生进程为:
中断表白式exp1转为后缀表白式exp2的规那么如下:
设操纵符栈s,初始为空栈后,压入优先级最低的操纵符‘#’。
对中断表白式从左向右,
遇操纵数,直截了当写入exp2;假设是操纵符〔记为w〕,分如下状况处置,直至表白式exp1终了。
〔1〕w为普通操纵符〔’+’,’-‘,’*’,’/’等〕,要与栈顶操纵符比拟优先级,假设w优先级高于栈顶操纵符,那么入栈;否那么,栈顶运算符退栈到exp2,w再与新栈顶操纵符作上述比拟处置,直至w入栈。
〔2〕w为左括号〔’〔’〕,w入栈。
〔3〕w为右括号〔’〕’〕,操纵符栈退栈并进入exp2,直到遇到左括号为止,左括号退栈〔不克不及进入exp2〕,右括号也丢失落,抵达exp2中消弭括号的目标。
〔4〕w为‘#’,表现中断表白式exp1终了,操纵符栈退栈到exp2,直至遇到‘#’,退栈,全部操纵终了。
这里,再引见一种庞杂办法。
中断表白式转为后缀表白式有三步:起首,将中断表白式中一切的子表白式按盘算规那么用嵌套括号括起来;接着,次序将每对括号中的运算符移到响应括号的前面;最初,删除一切括号。
比方,将中断表白式8-(3+5)*(5-6/2〕转为后缀表白式。
按如上步调:
履行完下面第一步后为:(8-((3+5)*(5-(6/2))));
履行完下面第二步后为:(8((35)+(5(62)/)-)*)-;
履行完下面第三步后为:835+562/-*-。
可用相似办法将中断表白式转为前缀表白式。
17、中断表白式转为后缀表白式的规那么根本上与下面19题一样,差别之处是对运算符**优先级的规则。
在算术运算中,先乘除后加减,先括号内后括号外,一样级不的运算符按从左到右的规那么运算。
而对**运算符,其优先级同惯例了解,即高于加减乘除而小于左括号。
为了习惯此题中“从右到左盘算〞的请求,规则栈顶运算符**的级不小于正从表白式中读出的运算符**,即刚读出的运算符**级不高于栈顶运算符**,因而也入栈。
下面以A**B**C为例阐明实现进程。
读入A,不是操纵符,直截了当写入后果表白式。
再读入*,这里规则在读入*后,不克不及破刻当乘号处置,要看下一个标记,假设下个标记不是*,那么前个*是乘号。
这里因为下一个待读的标记也是*,故以为**是一个运算符,与运算符栈顶比拟〔运算符栈顶初始化后,起首压入‘#’作为开场标记〕,其级不高于‘#’,入栈。
再读入B,直截了当进入后果表白式。
接着读入**,与栈顶比拟,均为**,咱们规则,后读入的**级不高于栈顶的**,因而**入栈。
接着读入C,直截了当到后果表白式。
如今的后果〔后缀〕表白式是ABC。
最初读入‘#’,表现输入表白式终了,这时运算符栈中从栈顶到栈底有两个**跟一个‘#’。
两个运算符**退栈至后果表白式,后果表白式变为ABC****。
运算符栈中只剩‘#’,退栈,运算终了。
18、XSXXXSSSXXSXXSXXSSSS
19、S1跟S2共享内存中一片延续空间〔地点1到m〕,能够将S1跟S2的栈底设在两头,两栈顶向共享空间的核心延长,仅当两栈顶指针相邻〔两栈顶指针值之差的相对值等于1〕时,推断为栈满,当一个栈顶指针为0,另一个栈顶指针m+1时为两栈均空。
20、设栈S1跟栈S2共享向量V[1..m],初始时,栈S1的栈顶指针top[0]=0,栈S2的栈顶指针top[1]=m+1,当top[0]=0为左栈空,top[1]=m+1为右栈空;当top[0]=0同时top[1]=m+1时为全栈空。
当top[1]-top[0]=1时为栈满。
21、〔1〕每个栈仅用一个次序存储空间时,操纵轻便,但调配存储空间小了,轻易发生溢出,调配空间年夜了,轻易形成白费,各栈不克不及共享空间。
〔2〕多个栈共享一个次序存储空间,充沛应用了存储空间,只要在全部存储空间都用完时才干发生溢出,其缺陷是当一个栈满时要向左、右栈查问有无闲暇单位。
假如有,那么要挪。