数据结构[C语言版]第三四章习题答案及解析
![数据结构[C语言版]第三四章习题答案及解析_第1页](https://file3.zhuangpeitu.com/fileroot3/2022-5/12/70a8c1d4-48a6-4e9f-8c6f-d4d771cedf31/70a8c1d4-48a6-4e9f-8c6f-d4d771cedf311.gif)
![数据结构[C语言版]第三四章习题答案及解析_第2页](/images/s.gif)
![数据结构[C语言版]第三四章习题答案及解析_第3页](/images/s.gif)
《数据结构[C语言版]第三四章习题答案及解析》由会员分享,可在线阅读,更多相关《数据结构[C语言版]第三四章习题答案及解析(15页珍藏版)》请在装配图网上搜索。
1、. 第3章 栈和队列 习题 1.选择题 〔1若让元素1,2,3,4,5依次进栈,则出栈次序不可能出现在〔 种情况。 A.5,4,3,2,1 B.2,1,5,4,3 C.4,3,1,2,5 D.2,3,5,4,1 〔2若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为〔 。 A.i B.n-i C.n-i+1 D.不确定 〔3数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数
2、小于n,计算队列中元素个数的公式为〔 。
A.r-f B.
3、于等于0
if
4、e1、e2、e3、e4、e5和e6依次进入栈S,一个元素出栈后即进入Q,若6个元素出队的序列是e2、e4、e3、e6、e5和e1,则栈S的容量至少应该是〔 。 A.2 B.3 C.4 D. 6 〔9在一个具有n个单元的顺序栈中,假设以地址高端作为栈底,以top作为栈顶指针,则当作进栈处理时,top的变化为〔 。 A.top不变 B.top=0 C.top-- D.top++ 〔10设计一个判别表达式中左,右括号是否配对出现的算法,采用〔 数据结构最佳。 A.线性表的顺序存储结构B.队列 C
5、. 线性表的链式存储结构 D. 栈
〔11用链接方式存储的队列,在进行删除运算时〔 。
A. 仅修改头指针 B. 仅修改尾指针
C. 头、尾指针都要修改 D. 头、尾指针可能都要修改
〔12循环队列存储在数组A[0..m]中,则入队时的操作为〔 。
A. rear=rear+1 B. rear=
6、。
A.
7、a"均是回文,但"good"不是回文。试写一个算法判定给定的字符向量是否为回文。<提示:将一半字符入栈> 根据提示,算法可设计为: //以下为顺序栈的存储结构定义 #define StackSize 100 //假定预分配的栈空间最多为100个元素 typedef char DataType;//假定栈元素的数据类型为字符 typedef struct{ DataType data[StackSize]; int top; }SeqStack; int IsHuiwen< char *t> {//判断t字符向量是否为回文,若是,返回1,否则返
8、回0
SeqStack s;
int i , len;
char temp;
InitStack< &s>;
len=strlen
9、 return 1 ; // 比较完毕均相等则返回 1
}
〔3设从键盘输入一整数的序列:a1, a2, a3,…,an,试编写算法实现:用栈结构存储输入的整数,当ai≠-1时,将ai进栈;当ai=-1时,输出栈顶整数并出栈。算法应对异常情况〔入栈满等给出相应的信息。
#define maxsize 栈空间容量
void InOutS
10、 //n个整数序列作处理。
{scanf<"%d",&x>; //从键盘读入整数序列。
if
11、编写算法计算表达式的值。规定:逆波兰表达式的长度不超过一行,以$符作为输入结束,操作数之间用空格分隔,操作符只可能有+、-、*、/四种运算。例如:234 34+2*$。 [题目分析]逆波兰表达式<即后缀表达式>求值规则如下:设立运算数栈OPND,对表达式从左到右扫描<读入>,当表达式中扫描到数时,压入OPND栈。当扫描到运算符时,从OPND退出两个数,进行相应运算,结果再压入OPND栈。这个过程一直进行到读出表达式结束符$,这时OPND栈中只有一个数,就是结果。 float expr< > //从键盘输入逆波兰表达式,以‘$’表示输入结束,本算法求逆波兰式表达式的值。 {float
12、OPND[30]; // OPND是操作数栈。
init
13、 {scale=10.0; scanf<"%c",&x>;
while
14、0;//数压入栈,下个数初始化
case x=‘ ’:break; //遇空格,继续读下一个字符。
case x=‘+’:push
15、处理。
}//结束switch
scanf<"%c",&x>;//读入表达式中下一个字符。
}//结束while〔x!=‘$’
printf<"后缀表达式的值为%f",pop
16、幂数变成十分位,百分位,千分位数等等,与前面部分数相加。在拼数过程中,若遇非数字字符,表示数已拼完,将数压入栈中,并且将变量num恢复为0,准备下一个数。这时对新读入的字符进入‘+’、‘-’、‘*’、‘/’及空格的判断,因此在结束处理数字字符的case后,不能加入break语句。 〔5假设以I和O分别表示入栈和出栈操作。栈的初态和终态均为空,入栈和出栈的操作序列可表示为仅由I和O组成的序列,称可以操作的序列为合法序列,否则称为非法序列。 ①下面所示的序列中哪些是合法的? A. IOIIOIOO B. IOOIOIIO C. IIIOIOIO D. IIIO
17、OIOO
②通过对①的分析,写出一个算法,判定所给的操作序列是否合法。若合法,返回true,否则返回false〔假定被判定的操作序列已存入一维数组中。
①A和D是合法序列,B和C 是非法序列。
②设被判定的操作序列已存入一维数组A中。
int Judge 18、’> //当未到字符数组尾就作。
{switch
{case‘I’: j++; break; //入栈次数增1。
case‘O’: k++; if 19、]在入栈出栈序列〔即由‘I’和‘O’组成的字符串的任一位置,入栈次数〔‘I’的个数都必须大于等于出栈次数〔即‘O’的个数,否则视作非法序列,立即给出信息,退出算法。整个序列〔即读到字符数组中字符串的结束标记‘\0’,入栈次数必须等于出栈次数〔题目中要求栈的初态和终态都为空,否则视为非法序列。
<6假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素站点<注意不设头指针> ,试编写相应的置空队、判队空 、入队和出队等算法。
算法如下:
//先定义链队结构:
typedef struct queuenode{
Datatype data;
struct qu 20、euenode *next;
}QueueNode; //以上是结点类型的定义
typedef struct{
queuenode *rear;
}LinkQueue; //只设一个指向队尾元素的指针
<1>置空队
void InitQueue< LinkQueue *Q>
{ //置空队:就是使头结点成为队尾元素
QueueNode *s;
Q->rear = Q->rear->next;//将队尾指针指向头结点
while 21、 {s=Q->rear->next;
Q->rear->next=s->next;
free 22、就是在尾结点处插入元素
QueueNode *p= 23、Queue< Q >>
Error<"Queue underflow">;
p=Q->rear->next->next; //p指向将要摘下的结点
x=p->data; //保存结点中数据
if rear>
{//当队列中只有一个结点时,p结点出队后,要将队尾指针指向头结点
Q->rear = Q->rear->next; Q->rear->next=p->next;}
else
Q->rear->next->next=p->next;//摘下结点p
free ;//释放 24、被删结点
return x;
}
〔7假设以数组Q[m]存放循环队列中的元素, 同时设置一个标志tag,以tag== 0和tag == 1来区别在队头指针 25、ete [ ] Q;}
void EnQueue 26、//队尾指针、队头指针和队满标志
Type *Q; //存放队列元素的数组
intm; //队列最大可容纳元素个数
}
构造函数
template 27、>
voidQueue 28、空,空则出错处理
front =< front + 1 > % m; //队头位置进1, 队头指针指示实际队头的前一位置
tag = 0; //标志改0, 表示栈不满
return Q[front]; //返回原队头元素的值
}
读取队头元素函数
template 29、环队列的两端都可以进行插入和删除操作。要求:
① 写出循环队列的类型定义;
② 写出"从队尾删除"和"从队头插入"的算法。
[题目分析] 用一维数组 v[0..M-1]实现循环队列,其中M是队列长度。设队头指针 front和队尾指针rear,约定front指向队头元素的前一位置,rear指向队尾元素。定义front=rear时为队空, 30、ar;
} cycqueue;
〔2elemtp delqueue < cycqueue Q>
//Q是如上定义的循环队列,本算法实现从队尾删除,若删除成功,返回被删除元素,否则给出出错信息。
{ if 31、// Q是顺序存储的循环队列,本算法实现"从队头插入"元素x。
{if 32、0> return 33、 = Ack<1,Ack<0,Ack<0,1>>> // 因m<>0,n=0而得
=Ack<1,Ack<0,2>> // 因m=0而得
=Ack<1,3> // 因m=0而得
=Ack<0,Ack<1,2>> //因m<>0,n<>0而得
= Ack<0,Ack<0,Ack<1,1>>> //因m<>0,n<>0而得
= Ack<0,Ack<0,Ack<0,Ack<1,0>> 34、>> //因m<>0,n<>0而得
= Ack<0,Ack<0,Ack<0,Ack<0,1>>>> //因m<>0,n=0而得
= Ack<0,Ack<0,Ack<0,2>>> //因m=0而得
= Ack<0,Ack<0,3>> //因m=0而得
= Ack<0,4> //因n=0而得
=5 //因n=0而得
〔2int Ackerman< int m, 35、 int n>
{int akm[M][N];int i,j;
for 36、数;
②求链表的结点个数;
③ 求所有整数的平均值。
#include 37、ate:
ListNode *first, current;
intMax 38、value结束
voidPrintList < >; //输出链表所有结点数据
intGetMax < > { return Max < first >; } //求链表所有数据的最大值
int GetNum < > { returnNum < first >; } //求链表中数据个数
float GetAvg < > { return Avg < first >; } //求链表所有数据的平均值
};
ListNode* List::NewNode < const int item > { //创建新链表结点
ListNode *newnode = new 39、 ListNode 40、current = q; //空表时, 新结点成为链表第一个结点
else {current->link= q;current = q; } //非空表时, 新结点链入链尾
cin >> value; //再输入
}
current->link = NULL; //链尾封闭
}
voidList::PrintList<>{ //输出链表
cout<<"\nThe List is:\n";
ListNode *p = first;
while { cout< 41、\n’;
}
intList::Max 42、
if < f == NULL > return 0; //空表, 返回0
return 1+ Num < f ->link >; //否则, 返回后继链表结点个数加1
}
floatList ::Avg < ListNode *f, int&n>{//递归算法 : 求链表中所有元素的平均值
if < f ->link == NULL > //链表中只有一个结点, 递归结束条件
{n = 1; return< float > 43、n < f->data+Sum > / n; }
}
#include "RecurveList.h" //定义在主文件中
intmain < int argc, char* argv[ ] > {
List test; intfinished;
cout << "输入建表结束标志数据 :";
cin >> finished; //输入建表结束标志数据
test.NewList< finished>; //建立链表
test.PrintList < >; //打印链表
cout << "\nThe Max is : " << te 44、st.GetMax < >;
cout << "\nThe Num is : " << test.GetNum < >;
cout << "\nThe Ave is : " << test.GetAve <> << '\n';
printf < "Hello World!\n" >;
return 0;
}
第4章 串、数组和广义表
习题
1.选择题
〔1串是一种特殊的线性表,其特殊性体现在〔 。
A.可以顺序存储 B.数据元素是一个字符
C.可以链式存储 D.数据元素可以是多个字符若
〔2串 45、下面关于串的的叙述中,〔 是不正确的?
A.串是字符的有限序列 B.空串是由空格构成的串
C.模式匹配是串的一种重要运算 D.串既可以采用顺序存储,也可以采用链式存储
〔3串"ababaaababaa"的next数组为〔 。
〔4串"ababaabab"的nextval为〔 。
A.010104101 B.010102101C.010100011 D.010101011
〔5串的长度是指〔 。
A.串中所含不同字母的个数 B.串中所含字符的个数
C.串中所含不同字符的个数 D.串中所含非空格字符的个数
〔6假设以行序为主序存 46、储二维数组A=array[1..100,1..100],设每个数据元素占2个存储单元,基地址为10,则LOC[5,5]=〔 。
A.808 B.818 C.1010 D.1020
〔7设有数组A[i,j],数组的每个元素长度为3字节,i的值为1到8,j的值为1到10,数组从内存首地址BA开始顺序存放,当用以列为主存放时,元素A[5,8]的存储首地址为〔 。
A.BA+141 B.BA+180 C.BA+222 D.BA+225
〔8设有一个10阶的对称矩阵A,采用压缩存储方式, 47、以行序为主存储,a11为第一元素,其存储地址为1,每个元素占一个地址空间,则a85的地址为〔 。
A.13 B.33 C.18 D.40
〔9若对n阶对称矩阵A以行序为主序方式将其下三角形的元素<包括主对角线上所有元素>依次存放于一维数组B[1.. 48、维数组T[N 49、C.36 D.16
〔13广义表A=, 50、C.1和2 D.2和3
〔1已知模式串t=‘abcaabbabcab’写出用KMP法求得的每个字符对应的next和nextval函数值。
模式串t的next和nextval值如下:
j
1 2 3 4 5 6 7 8 9 10 11 12
t串
a b c a a b b a b c a b
next[j]
0 1 1 1 2 2 3 1 2 3 4 5
nextval[j]
0 1 1 0 2 1 3 0 1 1 0 5
〔2设目标为t="abcaabbabcabaacb 51、acba",模式为p="abcabaa"
①计算模式p的naxtval函数值;
②不写出算法,只画出利用KMP算法进行模式匹配时每一趟的匹配过程。
①p的nextval函数值为0110132。〔p的next函数值为0111232。
②利用KMP<改进的nextval>算法,每趟匹配过程如下:
第一趟匹配: abcaabbabcabaacbacba
abcab
第二趟匹配: abcaabbabcabaacbacba
abc
第三趟匹配: abcaabbabcabaacbacb 52、a
a
第四趟匹配: abcaabbabcabaac bacba
<成功> abcabaa
〔3数组A中,每个元素A[i,j]的长度均为32个二进位,行下标从-1到9,列下标从1到11,从首地址S开始连续存放主存储器中,主存储器字长为16位。求:
①存放该数组所需多少单元?
②存放数组第4列所有元素至少需多少单元?
③数组按行存放时,元素A[7,4]的起始地址是多少?
④数组按列存放时,元素A[4,7]的起始地址是多少?
每个元素32个二进制位,主存字长16位,故每个 53、元素占2个字长,行下标可平移至1到11。
〔1242 〔222 〔3s+182 〔4s+142
<4>请将香蕉banana用工具 H< >—Head< >,T< >—Tail< >从L中取出。
L= 54、har ch;
for〔i=0;i<36;i++num[i]=0;// 初始化
while〔〔ch=getchar〔!=‘#’ //‘#’表示输入字符串结束。
if〔‘0’<=ch<=‘9’{i=ch-48;num[i]++;} // 数字字符
elseif〔‘A’<=ch<=‘Z’{i=ch-65+10;num[i]++;}// 字母字符
for〔i=0;i<10;i++ // 输出数字字符的个数
printf〔"数字%d的个数=%d\n",i,num[i];
for〔i=10;i<36;i++// 求出字母字符的个数
printf〔"字母字符%c的个数=% 55、d\n",i+55,num[i];
}// 算法结束。
〔6写一个递归算法来实现字符串逆序存储,要求不另设串存储空间。
[题目分析]实现字符串的逆置并不难,但本题"要求不另设串存储空间"来实现字符串逆序存储,即第一个输入的字符最后存储,最后输入的字符先存储,使用递归可容易做到。
void InvertStore 56、>;
A[i++] = ch;//字符串逆序存储
}
A[i] = '\0'; //字符串结尾标记
}//结束算法InvertStore。
〔7编写算法,实现下面函数的功能。函数void insert 57、
对插入位置pos要验证其合法性,小于1或大于串s的长度均为非法,因题目假设给字符串s的空间足够大,故对插入不必判溢出。
void insert 58、
if<*p == '/0'> {printf<"%d位置大于字符串s的长度",pos>;exit<0>;}
else //查找字符串的尾
while<*p!= '/0'> {p++; i++;} //查到尾时,i为字符‘\0’的下标,p也指向‘\0’。
while<*q!= '\0'> {q++; x++; } //查找字符串t的长度x,循环结束时q指向'\0'。
for =*p; p--;}//串s的pos后的子串右移,空出串t的位置。
q--; //指针q回退到串t的最后一个字符
for 59、+> *p--=*q--; //将t串插入到s的pos位置上
[算法讨论] 串s的结束标记<'\0'>也后移了,而串t的结尾标记不应插入到s中。
〔8已知字符串S1中存放一段英文,写出算法format 60、id format 61、n",n>; exit<0>;}
if<*<--q>==' ' > //若最后一个字符为空格,则需向后找到第一个非空格字符
{p-- ; //p指针也后退
while<*p==' '&&*p!='\0'> p++;//往后查找一个非空格字符作串s2的尾字符
if<*p=='\0'> {printf<"s1串没有%d个两端对齐的字符串\n",n>; exit<0>; }
*q=*p; //字符串s2最后一个非空字符
*<++q>='\0'; //置s2字符串结束标记
}
*q=s3;p++; //将s1串其余 62、部分送字符串s3。
while <*p!= '\0'> {*q=*p; q++; p++;}
*q='\0'; //置串s3结束标记
}
<9>设二维数组a[1..m, 1..n] 含有m*n 个整数。
①写一个算法判断a中所有元素是否互不相同?输出相关信息 63、一次,这就是循环控制变量k和p的二层for循环。
int JudgEqual //和同行其它元素比较
if {printf<"no">; return<0>; }
//只要有一个相同的,就结论不是互不相同
for
;
}//回收结点空间
}
<2>判队空
int EmptyQueue< LinkQueue *Q>
{ //判队空
//当头结点的next指针指向自己时为空队
return Q->rear->next->next==Q->rear->next;
}
<3>入队
void EnQueue< LinkQueue *Q, Datatype x>
{ //入队
//也
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。