A.iB.n=IC.n-i+1D.不确定
14.若己知一个栈的进栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=3,则p2_______。
A.可能是2B.一定不是2C.可能是1D.一定是1
15.若己知一个栈的进栈序列p1,p2,p3,…,pn,输出序列是1,2,3,…,n,若p3=1,则p1________。
A.可能是2B.一定是2C.不可能是2D.不可能是3
16.若己知一个栈的进栈序列p1,p2,p3,…,pn,输出序列是1,2,3,…,n,若p3=1,则p1________。
A.n-i+1B.n-iC.iD.有多种可能
17.判定一个顺序栈st(最多元素为MaxSize)为空的条件是_______。
A.st->top!
=-1B.st->top==-1C.st->top!
=MaxSize-1D.st->top==MaxSize-1
18.判定一个顺序栈st(最多元素为MaxSize)为栈满的条件是_______。
A.st->top!
=-1B.st->top==-1C.st->top!
=MaxSize-1D.st->top==MaxSize-1
19.最不适合用作链栈的链表是________。
A.只有表头指针没有表尾指针的循环双链表B.只有表尾指针没有表头指针的循环双链表C.只有表尾指针没有表头指针的循环单链表D.只有表头指针没有表尾指针的循环单链表
20.向一个栈项指针为hs的链栈中插入一个s所指结点时,则执行_______。
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;
21.从一个栈项指针为hs的链栈中删除一个结点时,用x保存被删结点的值,则执行______。
A.x=hs;hs=hs->next;B.x=hs->data;C.hs=hs->next;x=hs->data;D.x=hs->data;hs=hs->next;
22.一个队列的入队序列是1,2,3,4,则队列的输出序列是_______。
A.4,3,2,1B.1,2,3,4,C.1,4,3,2D.3,2,4,1
23.判定一个环形队列qu(最多元素为MaxSize)为空的条件是________。
A.qu->rear-qu->front==MaxSizeB.qu->rear-qu->front-1==MaxSize
C.qu->front==qu->rearD.qu->front==qu->rear+1
24.判定一个环形队列qi(最多元素为MaxSize)为满队列的条件是________。
A.(qu->rear+1)%MaxSize==qu->frontB.qu->rear-qu->front-1==MaxSize
C.qu->front==qu->rearD.qu->front==qu->rear+1
25.环形顺序队列中是否可以插入下一个元素,________。
A.与队头指针的队尾指针的值有关B.只与队尾指针的值有关,与队头指针的值无关
C.只与数组大小有关,与队首指针和队尾指针的值无关D.与曾经进行过多少次插入操作有关
26.环形队列用数组A[0...MaxSize-1]存放其元素值,己知其头尾指针分别是front和rear,则当前队列的元素个数是_______。
A.(rear-front+MaxSize)%MaxSizeB.rear-front+1
C.(rear-front-1)%MaxSizeD.(rear-front)%MaxSize
27.若用一个大小为6的一维数组来实现环形队列,且当前rear和front的值分别为0和3。
当从队列中删除一个元素,再加入两个元素后,rear和front的值分别是______。
A.1和5B.2和4C.4和2D.5和1
28.最不适合用作链队的链表是______。
A.只带队头指针的非循环双链表B.只带队头指针的循环双链表C.只带队尾指针的循环双链表D.只带队尾指针的循环单链表
29.在一个链队中,假设f和r分别为队头和队尾指针,则插入s所指结点的运算是_______。
A.f->next=s;f=s;B.r->next=s;r=s;C.s->next=r;r=s;D.s->next=f;f=s;
30.在一个链队中,假设f和r分别为队头和队尾指针,则删除一个结点的运算是_______。
A.r=f->next;B.r=r->next;C.f=f->next;D.f=r->next;
31.用单链表表示的链队的队头在链用不着的________位置。
A.链头B.链尾C.链中D.任意
32.中缀表达式A*(B+C)/(D-E+F)的后缀表达式是________。
A.A*B+C/D-E+FB.AB*C+D/E-F+C.ABC+*DE-+/D.ABCDEF*+/-+
33.己知一个栈的进栈序列是ABC,出栈序列为CBA,经过的栈操作是________。
A.push,pop,push,pop,push,popB.push,push,push,pop,pop,pop
C.push,push,pop,pop,push,popD.push,pop,push,push,pop,pop
34.判定一个顺序栈st为(元素个数最多为MaxSize)空的条件为______。
A.st.top==-1B.st.top!
=-1C.st.top!
=MaxSizeD.st.top==MaxSize
35.判定一个顺序栈st(元素个数最多为MaxSize)为栈满的条件是______。
A.st.top!
=-1B.st.top==-1C.st.top!
=MaxSize-1D.st.top==MaxSize-1
36.表达式a*(b+c)-d的后缀表达式是______。
A.abcd*+-B.abc+*d-C.abc*+d-D.-+*abcd
37.表达式(2+2*3)*2+6*3/2的后缀表达式是______。
A.223*+2*63*2/+B.22*3+2*63*2/+C.223*2*63*+2/+
D.223*+263*2/+*
38.链栈与顺序栈相比有一个明显的优点,即______。
A.插入操作更方便B.通常不会出现栈满的情况C.不会出现栈空的情况D.删除操作更加方便
39.最不适合用作链栈的链表是______。
A.只有表头指针没有表尾指针的循环双链表B.只有表尾指针没有表头指针的循环双链表
C.只有表尾指针没有表头指针的循环单链表D.只有表头指针没有表尾指针的循环单链表
40.如果以链表作为栈的存储结构,则退链栈操作时______。
A.必须判别栈是否满B.判别链栈元素的类型C.必须差别链栈是否空
D.对链栈不作任何差别
41.向一个不带头结点的栈指针为1st的链栈中插入一个s所指结点时,则执行______。
A.1st->next=s;B.s->next=1st->next;1st->next=s;
C.s->next=1st;1st=s;D.s->next=1st;1st=1st->next;
42.从一个不带头结点的栈顶指针为1st的链栈中删除一个结点时,用x保存被删结点的值,则执行______。
A.x=1st;1st=1st->next;B.x=1st->data;
C.1st=1st->next;x=1st->data;D.x=1st->data;1st=1st->next;
43.一个栈的进栈序列是a,b,c,d,e,则栈的不可能的输出序列是______.
A.edcbaB.decbaC.dceabD.abcde
44.在一个长度为n的顺序存储的集合中查找值为x的元素时,在等概率情况下,查找成功时的平均查找长度为_________。
A.nB.n/2C.(n+1)/2D.(n-1)/2
45.在一个长度为n的链接存储的集合中查找值为x的元素时,算法的时间复杂度为_________。
A.O
(1)B.O(n)C.O(n*n)D.O(lbn)
46.已知一个元素x不属于一个长度为n的顺序或链接存储的集合S中的元素,把它插入集合S时不进行比较过程,则插入过程的时间复杂度为_________。
A.O
(1)B.O(lbn)C.O(n)D.O(n*n)
47.设一个具有t个非零元素的m*n大小的稀疏矩阵采用顺序存储,求其转置矩阵的普通转置算法的时间复杂度为_________。
A.O(m)B.O(n)C.O(n+t)D.O(n*t)
判断题:
1.栈底元素是不能删除的元素。
F
2.顺序栈中元素值的大小是有序的。
F
3.在n个元素进栈后,它们的出栈顺序和进栈顺序一定正好相反。
T
4.栈顶元素和栈底元素有可能是同一个元素。
T
5.若用S[1]-S[m]表示顺序栈的存储空间,则对栈的进栈、出栈操作最多只能进行m次。
F
6.栈没有栈顶指针。
F
填空题:
1.在具有n个单元、顺序存储的循环队列中,队满时共有______个元素。
n-1
2.栈和队列的区别仅在于________。
删除运算的不同
3.通常元素进栈的操作是________。
先移动栈顶指针,后存入元素
4.通常元素退栈的操作是________。
先取出元素,后移动栈顶指针
5.一个栈的输入序列是12345,则栈的输出序列432512是__________。
不可能的
6.一个栈的输入序列是12345,则栈的输出序列12345是________。
可能的
7.设有一个顺序栈S,元素s1,s2,s3,s4,s5,s6依次进栈,如果6个元素的出栈顺序为s2,s3,s4,s6,s5,s1,则顺序栈的容量至少应为________。
3
8.设栈采用顺序存储结构,若己知i-1个元素进栈,则将第i个元素进栈时,进栈算法的时间复杂度为________。
O
(1)
9.若用不带头结点的单链表来表示链栈S,则创建一个空栈所要执行的操作是________。
S=NULL
10.从环形队列中插入一个元素时,通常的操作是________。
先存放元素,后移动队尾指针
11.从环形队列中插入一个元素时,通常的操作是________。
从环形队列中插入一个元素时,通常的操作是________。
MaxSize-1
12.在链表qu中,判定只有一个结点的条件是________。
qu->front==qu->rear&&qu->front!
=NULL
13.设栈S和队列Q的初始状态为空,元素a1,a2,a3,a4,a5,a6,a7和a8依次通过栈S,一个元素出栈后立即进入队列Q,若8个元素出队列的顺序是a3,a6,a7,a5,a8,a4,a2,a1,则栈S的容量至少应该是多少(即至少应该容纳多少个元素)?
5
14.设有算术表达式x+a*(y-b)-c/d,该表达式的前缀表达为________。
后缀表示为______。
-+x*a-yb/cd|xayb-*+cd/-
15.栈是一种具有______特性的线性表。
后进先出
16.顺序栈和链栈的区别仅在于______的不同。
存储结构
17.如果栈的最大长度难以估计,则最好使用______。
链栈
18.一个栈的输入序列是12345,则栈的输出序列12345是______。
可能的
19.设栈采用顺序存储结构,若己知i-1个元素进栈,则将第i个元素进栈时,进栈算法的时间复杂度为______。
O
(1)
20.表达式23+((12*3-2)/4+34*5/7)+108/9的后缀表达式是______。
23123*2-4/345*7/++1089/+
21.若用不带头结点的单链表来表示链栈1st,则创建一个空栈所要执行的操作是______。
1st=NULL
22.对于链栈1st,进栈操作在______端进行,出栈操作在_____端进行。
链栈头|链栈头
23.将递归算法转换为非递归算法时,通常使用______这种数据结构。
栈
24.有如下递归算法:
voidprint(intw)
{inti;
if(w!
=0)
{print(w-1);
for(i=1;i<=w;i++)
printf("%3d",w);
printf("\n");
}
}
调用语句printf(4)的结果是______。
1223334444
25.有如下递归过程:
voidreverse(intm)
{
printf("%d",n%10);
if(n/10!
=0)
reverse(n/10);
}
调用语句reverse(582)的结果是______。
285
26.求顺序存储的集合的长度的时间复杂度为____________。
O
(1)
27.求链接存储的集合的长度的时间复杂度为____________。
O(n)
28.设集合S的长度为n,则判断x是否属于集合S的时间复杂度为____________O(n)
29.在稀疏矩阵的顺序存储中,利用一个数组来存储非零元素,该数组的长度应____________对应三元组线性表的长度。
大于等于
算法分析题:
1.设计一个算法,利用栈的基本运算将指定栈中的内容进行逆转。
答:
、statusNizhuan(sqstacks,inta,intb,intt)
{
If(s.top==s.base)
error(‘nodata’);
for(i=0;i{
a=*--top;
b=*s.base;
a=t;t=b;b=a;
s.top--;
s.base++;
}
}
2.设计一个算法,利用栈的基本运算返回指定栈中的栈底元素。
答:
statusGetbase(Aqstacks,int&e)
{
If(s.top==s.base)
Error(‘nodata’)
else
e=*s.base;
returne;
}
3.有两个栈s1和s2共享存储空间c[1..MaxSize],其中一个栈底设在c[1]处,另一个栈底设在c[MaxSize]处,分别编写s1和s2的进栈push(i,x)、退栈pop(i)和设置栈空setnull(i)的函数,其中i=1,2。
注意:
仅当整个空间c[1..MaxSize]占满时才产生上溢。
答:
(1)初始化操作
【共享栈的初始化】
intinitDupStack(dupsqstack*s)
{/*创建两个共享邻接空间的空栈由指针S指出*/
if((s=(dupsqstack*)malloc(sizeof(dupsqstack)))==NULL)
returnFALSE;
s->lefttop=-1;
s->righttop=MAXNUM;
returnTRUE;
}
(2)入栈操作
【共享栈的入栈操作】
intpushDupStack(dupsqstack*s,charstatus,Elemtypex)
{*把数据元素x压入左栈(status=’L’)或右栈(status=’R’)*/
if(s->lefttop+1==s->righttop)
returnFALSE;/*栈满*/
if(status=’L’)
s->stack[++s->lefttop]=x;/*左栈进栈*/
else
if(status=’R’)
s->stack[--s->lefttop]=x;/*右栈进栈*/
else
returnFALSE;/*参数错误*/
returnTRUE;
}
(3)出栈操作
【共享栈的出栈操作】
ElemtypepopDupStack(dupsqstack*s,charstatus)
{/*从左栈(status=’L’)或右栈(status=’R’)退出栈顶
4.用不带头结点的单链表存储链栈,设计初始栈、判断栈是否为空、进栈和出栈等相应的算法。
答:
(1)入栈操作
【单个链栈的入栈操作】
intpushLstack(slStacktype*top,Elemtypex)
{//将元素x压入链栈top中
slStacktype*p;
if((p=(slStacktype*)malloc(sizeof(slStacktype)))==NULL)
returnFALSE;//申请一个结点
p->data=x;
p->next=top;
top=p;
returnTRUE;
}
(2)出栈操作
【单个链栈的出栈操作】
ElemtypepopLstack(slStacktype*top)
{//从链栈top中删除栈顶元素
slStacktype*p;
Elemtypex;
if(top==NULL)
returnNULL;//空栈
p=top;
top=top->next;
x=p->data;
free(p);
returnx;
}
问答题:
1.试述栈的基本性质?
解答:
由栈的定义可知,这种结构的基本性质综述如下:
(1)集合性。
栈是由若干个元素集合而成,当没有元素的空集合称为空栈;
(2)线性结构。
除栈底元素和栈顶元素外,栈中任一元素均有唯一的前驱元素和后继元素;
(3)受限制的运算。
只允许在栈顶实施压入或弹出操作,且栈顶位置由栈指针所指示;
(4)数学性质。
当多个编号元素依某种顺序压入,且可任意时刻弹出时,所获得的编号元素排列的数目,恰好满足卡塔南数列的计算,即:
Cn=Cn2n/(n+1)
其中,n为编号元素的个数,Cn是可能的排列数目。
2.何谓队列的上溢现象?
解决它有哪些方法,且分别简述其工作原理。
解答:
在队列的顺序存储结构中,设队头指针为front,队尾指针为rear,队的容量(存储空间的大小)为m。
当有元素要加入队列时,若rear=m(初始时reat=0),则发生队列的上溢现象,该元素不能加入队列。
这里要特别注意的是:
队列的假溢出现象,队列中还有空余的空间,但元素不能进队列。
造成这种现象的原因是由于队列的操作方式所致。
解决队列的上溢有以下几种方法:
(1)建立一个足够大的存储空间,但这样做往往会造成空间使用的效率低。
(2)当出现假溢出时,可采用以下几种方法:
①采用平移元素的方法。
每当队列中加入一个元素时,队列中已有的元素向队头移动一个位置(当然要有空余的空间可移);
②每当删去一个队头元素时,则依次序移队中的元素,始终使front指针指向队列中的第一个位置;
③采用循环队列方式。
把队头队尾看成是一个首尾相邻的循环队列,虽然物理上
假定用一个循环单链表表示队列(称此为循环链队),该队列只设一个队尾指针,不设队首指针,试编写下列算法:
(1)向循环链队插入一个元素为x的结点。
(2)从循环链队中删除一个结点(假定不需要保留被删除结点的值和不需要回收结点)。
3.假定用一个循环单链表表示队列(称此为循环链队),该队列只设一个队尾指针,不设队首指针,试编写下列算法:
(1)向循环链队插入一个元素为x的结点。
(2)从循环链队中删除一个结点(假定不需要保留被删除结点的值和不需要回收结点)
解答:
(1)解答:
statusinsert(Rear,x){
//假定Rear为循环链队的队尾指针,x为待插入的元素
(1)malloc(p);
p->data=x;//建立值为x的新结点p^
(2)if(Rear=nil){
Rear=p;Rear->next=p;
}
else