算法与数据结构C语言版课后习题答案机械工业出版社第34章 习题参考答案Word文件下载.docx
《算法与数据结构C语言版课后习题答案机械工业出版社第34章 习题参考答案Word文件下载.docx》由会员分享,可在线阅读,更多相关《算法与数据结构C语言版课后习题答案机械工业出版社第34章 习题参考答案Word文件下载.docx(28页珍藏版)》请在冰豆网上搜索。
![算法与数据结构C语言版课后习题答案机械工业出版社第34章 习题参考答案Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-10/26/b16c2d47-d4c5-4989-82bc-27e835cfcfd3/b16c2d47-d4c5-4989-82bc-27e835cfcfd31.gif)
123顺序入栈,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和4
3.4
设栈S和队列Q的初始状态为空,元素e1,e2,e3,e4,e5和e6依次通过栈S,一个元素出栈后即进队列Q,若6个元素出队的序列是e3,e5,e4,e6,e2,e1,则栈S的容量至少应该是多少?
【解答】4
3.5
循环队列的优点是什么,如何判断“空”和“满”。
【解答】循环队列解决了常规用0--m-1的数组表示队列时出现的“假溢出”(即队列未满但不能入队)。
在循环队列中我们仍用队头指针等于队尾指针表示队空,而用牺牲一个单元的办法表示队满,即当队尾指针加1(求模)等于队头指针时,表示队列满。
也有通过设标记以及用一个队头或队尾指针加上队中元素个数来区分队列的“空”和“满”的。
3.6
设长度为n的链队列用单循环链表表示,若只设头指针,则入队和出队的时间如何?
若只设尾指针呢?
【解答】若只设头指针,则入队的时间为O(n),出队的时间为O
(1)。
若只设尾指针,则入队和出队的时间均为O
(1)。
3.7
指出下面程序段的功能是什么?
(1)
voiddemo1(SeqStackS)
{inti,arr[64],n=0;
while(!
StackEmpty(S))arr[n++]=Pop(S);
for(i=0;
i<
n;
i++)Push(S,arr[i]);
}
【解答】程序段的功能是实现了栈中元素的逆置。
(2)
voiddemo2(SeqStackS,intm)∥设栈中元素类型为int型
{intx;
SeqStackT;
StackInit(T);
StackEmpty(S))
if((x=Pop(S)!
=m)Push(T,x);
while(!
(StackEmpty(T)){x=Pop(T);
Push(S,x);
【解答】程序段的功能是删除了栈中值为m的元素。
(3)
voiddemo3(SeQueueQ,intm)∥设队列中元素类型为int型
SeqStackS;
StackInit(S);
QueueEmpty(Q)){x=QueueOut(Q);
StackEmpty(S)){x=Pop(s);
QueueIn(Q,x);
【解答】程序段的功能是实现了队列中元素的逆置。
3.8
试将下列递推过程改写为递归过程。
voidditui(intn)
{i=n;
while(i>
1)printf(i--);
【解答】voiddigui(intn)
{if(n>
1){printf(n);
digui(n-1);
}
3.9
写出下列中缀表达式的后缀表达式:
(1)A*B*C
(2)(A+B)*C-D(3)A*B+C/(D-E)(4)(A+B)*D+E/(F+A*D)+C
【解答】
(1)ABC**
(2)AB+C*D-
(3)AB*CDE-/+
(4)AB+D*EFAD*+/+C+
3.10
选择题:
循环队列存储在数组A[0..m]中,则入队时的操作为()。
A.rear=rear+1B.rear=(rear+1)%(m-1)
C.rear=(rear+1)%mD.rear=(rear+1)%(m+1)
【解答】D
3.11选择题:
4个园盘的Hahoi塔,总的移动次数为()。
A.7B.8C.15D.16
【解答】C
3.12选择题:
允许对队列进行的操作有()。
A.对队列中的元素排序B.取出最近进队的元素
C.在队头元素之前插入元素D.删除队头元素
二、算法设计题
3.13利用栈的基本操作,编写求栈中元素个数的算法。
【题目分析】将栈值元素出栈,出栈时计数,直至栈空。
【算法】intStackLength(StackS)
{//求栈中元素个数
intn=0;
StackEmpty(S)
{n++;
Pop(S);
returnn;
算法讨论:
若要求统计完元素个数后,不能破坏原来栈,则在计数时,将原栈导入另一临时栈,计数完毕,再将临时栈倒入原栈中。
intStackLength(StackS)
StackT;
StackInit(T);
//初始化临时栈T
Push(T,Pop(S));
StackEmpty(T)
{Push(S,Pop(T));
3.14双向栈S是在一个数组空间V[m]内实现的两个栈,栈底分别处于数组空间的两端。
试为此双向栈设计栈初始化Init(S)、入栈Push(S,i,x)、出栈Pop(S,i)算法,其中i为0或1,用以指示栈号。
[题目分析]两栈共享向量空间,将两栈栈底设在向量两端,初始时,s1栈顶指针为-1,s2栈顶为m。
两栈顶指针相邻时为栈满。
两栈顶相向、迎面增长,栈顶指针指向栈顶元素。
#defineElemTypeint∥假设元素类型为整型
typedefstruct
{ElemTypeV[m];
∥栈空间
inttop[2];
∥top为两个栈顶指针
}stk;
stkS;
∥S是如上定义的结构类型变量,为全局变量
栈初始化
intInit()
{S.top[0]=-1;
S.top[1]=m;
return1;
//初始化成功
入栈操作:
intpush(stkS,inti,intx)
∥i为栈号,i=0表示左栈,i=1为右栈,x是入栈元素。
入栈成功返回1,否则返回0
{if(i<
0||i>
1){printf(“栈号输入不对\n”);
exit(0);
if(S.top[1]-S.top[0]==1){printf(“栈已满\n”);
return(0);
switch(i)
{case0:
S.V[++S.top[0]]=x;
return
(1);
break;
case1:
S.V[--S.top[1]]=x;
}∥push
退栈操作
ElemTypepop(stkS,inti)
∥退栈。
i代表栈号,i=0时为左栈,i=1时为右栈。
退栈成功返回退栈元素
∥否则返回-1
{if(i<
0||i>
1){printf(“栈号输入错误\n”);
switch(i)
if(S.top[0]==-1){printf(“栈空\n”);
return(-1);
elsereturn(S.V[S.top[0]--]);
case1:
if(S.top[1]==m{printf(“栈空\n”);
return(-1);
elsereturn(S.V[S.top[1]++]);
}∥switch}∥算法结束
(4)
判断栈空
intEmpty();
{return(S.top[0]==-1&
&
S.top[1]==m);
[算法讨论]请注意算法中两栈入栈和退栈时的栈顶指针的计算。
s1(左栈)是通常意义下的栈,而s2(右栈)入栈操作时,其栈顶指针左移(减1),退栈时,栈顶指针右移(加1)。
3.15设以数组Q[m]存放循环队列中的元素,同时设置一个标志tag,以tag=0和tag=1来区别在队头指针(front)和队尾指针(rear)相等时,队列状态为“空”还是“不空”。
试编写相应的入队(QueueIn)和出队(QueueOut)算法。
初始化
SeQueueQueueInit(SeQueueQ)
{//初始化队列
Q.front=Q.rear=0;
Q.tag=0;
returnQ;
(2)入队
SeQueueQueueIn(SeQueueQ,inte)
{//入队列
if((Q.tag==1)&
(Q.rear==Q.front))printf("
队列已满\n"
);
else{Q.rear=(Q.rear+1)%m;
Q.data[Q.rear]=e;
if(Q.tag==0)Q.tag=1;
//队列已不空
(3)出队
ElemTypeQueueOut(SeQueueQ)
{//出队列
if(Q.tag==0)printf("
队列为空\n"
else
{Q.front=(Q.front+1)%m;
e=Q.data[Q.front];
if(Q.front==Q.rear)Q.tag=0;
//空队列
return(e);
3.16假设用变量rear和length分别指示循环队列中队尾元素的位置和内含元素的个数。
试给出此循环队列的定义,并写出相应的入队(QueueIn)和出队(QueueOut)算法。
【算法设计】
(1)循环队列的定义
typedefstruct
{ElemTypeQ[m];
∥循环队列占m个存储单元
intrear,length;
∥rear指向队尾元素,length为元素个数
}SeQueue;
(2)初始化
SeQueueQueueInit(SeQueuecq)
∥cq为循环队列,本算法进行队列初始化
{cq.rear=0;
cq.length=0;
returncq;
}
(3)入队
SeQueueQueueIn(SeQueuecq,ElemTypex)
∥c