算法和数据结构C语言版课后习题集答案解析(机械工业出版社)第34章习题集参考答案解析
严蔚敏数据结构课后习题及答案解析
严蔚敏数据结构课后习题及答案解析数据结构课程是计算机科学与技术专业中非常重要的一门基础课程,对于学习者来说,课后习题的巩固和答案解析是学习的重要辅助材料。本文将针对严蔚敏老师所著的《数据结构(C语言版)》中的课后习
题及答案解析进行介绍和总结。
1. 第一章:绪论
(略)
2. 第二章:线性表
(略)
3. 第三章:栈和队列
3.1 课后习题
3.1.1 课后习题一:
给定一个整数序列,请设计一个算法,其中删除整数序列中重复出
现的元素,使得每个元素只出现一次。要求空间复杂度为O(1)。
3.1.2 课后习题二:
使用栈操作实现一个队列(其中队列操作包括入队列和出队列)。
3.2 答案解析
3.2.1 答案解析一:
我们可以使用双指针法来实现这一算法。设定两个指针,一个指向
当前元素,另一个指向当前元素的下一个元素。比较两个元素是否相等,如果相等,则删除下一个元素,并移动指针。如果不相等,则继
续移动指针。这样,当指针指向序列的最后一个元素时,算法结束。
空间复杂度为O(1),时间复杂度为O(n)。
3.2.2 答案解析二:
使用两个栈来实现一个队列。一个栈用于入队列操作,另一个栈用
于出队列操作。当需要入队列时,将元素直接入栈1。当需要出队列时,判断栈2是否为空,如果为空,则将栈1中的元素逐个弹出并压入栈2中,然后从栈2中弹出栈顶元素。如果栈2非空,则直接从栈2中弹出栈顶元素。这样,就可以实现使用栈操作来实现队列操作。
4. 第四章:串
(略)
5. 第五章:数组和广义表
(略)
6. 第六章:树和二叉树
(略)
7. 第七章:图
(略)
数据结构(第4版)习题及实验参考答案数据结构复习资料完整版(c语言版)
数据结构(第4版)习题及实验参考答案数据结构复习
资料完整版(c语言版)
数据结构基础及深入及考试
习题及实验参考答案见附录
结论
1、数据的逻辑结构是指数据元素之间的逻辑关系。即从逻辑关系上
描述数据,它与数据的存储无关,是独立于计算机的。2、数据的物理结
构亦称存储结构,是数据的逻辑结构在计算机存储器内的表示(或映像)。它依赖于计算机。存储结构可分为4大类:顺序、链式、索引、散列
3、抽象数据类型:由用户定义,用以表示应用问题的数据模型。它
由基本的数据类型构成,并包括一组相关的服务(或称操作)。它与数据
类型实质上是一个概念,但其特征是使用与实现分离,实行封装和信息隐
蔽(独立于计算机)。
4、算法:是对特定问题求解步骤的一种描述,它是指令的有限序列,是一系列输入转换为输出的计算步骤。
5、在数据结构中,从逻辑上可以把数据结构分成(C)A、动态结构
和表态结构B、紧凑结构和非紧凑结构C、线性结构和非线性结构D、内
部结构和外部结构6、算法的时间复杂度取决于(A)
A、问题的规模
B、待处理数据的初态
C、问题的规模和待处理数据的
初态
线性表
1、线性表的存储结构包括顺序存储结构和链式存储结构两种。
2、表长为n的顺序存储的线性表,当在任何位置上插入或删除一个
元素的概率相等时,插入一个元素所需移动元素的平均次数为(E),删
除一个元素需要移动的元素的个数为(A)。
A、(n-1)/2
B、n
C、n+1
D、n-1
E、n/2
F、(n+1)/2
G、(n-2)/23、“线
性表的逻辑顺序与存储顺序总是一致的。”这个结论是(B)A、正确的B、错误的C、不一定,与具体的结构有关
数据结构题集(C语言版)答案
void reverse(SqList &A)//顺序表的就地逆置 { for(i=1,j=A.length;i<j;i++,j--)
A.elem[i]<->A.elem[j]; }//reverse
2.22
2.26
void LinkList_reverse(Linklist &L)//链表的就地逆置;为简化算法, 假设表长大于 2 {
sum+=xp*(*p++); xp*=x; } printf("Value is:%f",sum); }//polyvalue
第二章 线性表
2.10
Status DeleteK(SqList &a,int i,int k)//删除线性表 a 中第 i 个元素 起的 k 个元素 {
if(i<1||k<0||i+k-1>a.length) return INFEASIBLE; for(count=1;i+count-1<=a.length-k;count++) //注意循环结束的条 件
说明: 1. 本文是对严蔚敏《数据结构(c 语言版)习题集》一书中所有算法 设计题目的解决方案,主要作者为 kaoyan.com 计算机版版主一具 .以下网 友:siice,龙抬头 ,iamkent,zames,birdthinking 等为答 案的修订 和完善 工作提出了宝贵意见 ,在此表示感谢; 2. 本解答中的所有算法均采用类 c 语言描述,设计原则为面向交流、面向 阅读 ,作者不保证程序能够上机正常运行 (这种保证实际上也没有任何意 义); 3. 本解答原则上只给出源代码以及必要的注释 ,对于一些难度 较高或思 路特殊的题目将给出简要的分析说明 ,对于作者无法解决的题目将给出必 要的讨论.目前尚未解决的题目有: 5.20, 10.40; 4. 请读者在自己已经解决了某 个题目或进行了充分的思考之后 ,再参考 本解答,以保证复习效果; 5. 由于作 者水平所限 ,本解答中一定存在不少这样或者那样的错误和不 足,希望读者们在阅读中多动脑、勤思考 ,争取发现和纠正这些错误 ,写出 更好的算法来 .请将你发现的错误或其它值得改进之处向作者报告 : yi-
数据结构(c语言版)课后习题答案完整版
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
(3)数组A中,每个元素A[i,j]的长度均为32个二进位,行下标从-1到9,列下标从1到11,从首地址S开始连续存放主存储器中,主存储器字长为16位。求:
private:
intrear,front,tag;//队尾指针、队头指针和队满标志
Type*Q;//存放队列元素的数组
intm;//队列最大可容纳元素个数
}
构造函数
template <class Type>
Queue<Type>::Queue(intsz):rear(0),front(0),tag(0),m(sz){
TypeGetFront( );
voidMakeEmpty( ){front = rear = tag =0;}//置空队列
intIsEmpty( )const{ returnfront == rear&&tag ==0;}//判队列空否
intIsFull( )const{ returnfront == rear&&tag ==1;}//判队列满否
(4)请将香蕉banana用工具H( )—Head( ),T( )—Tail( )从L中取出。
数据结构(c语言版)课后习题答案完整版资料
第 1 章绪论
5.选择题: CCBDCA
6.试分析下面各程序段的时间复杂度。
(1)O( 1)
(2)O( m*n )
(3)O( n2)
(4)O( log 3n)
( 5)因为 x++ 共执行了n-1+n-2+ ⋯⋯+ 1= n(n-1)/2 ,所以执行时间为O( n2)
( 6)O( n )
第 2 章线性表
1.选择题
babadbcabdcddac
2.算法设计题
( 6)设计一个算法,通过一趟遍历在单链表中确定值最大的结点。
ElemType Max (LinkList L ){
if(L->next==NULL) return NULL;
pmax=L->next; // 假定第一个结点中数据具有最大值
p=L->next->next;
while(p != NULL ){// 如果下一个结点存在
if(p->data > pmax->data) pmax=p;
p=p->next;
}
return pmax->data;
(7)设计一个算法,通过遍历一趟,将链表中所有结点的链接方向
逆转,仍利用原表的存储空间。
void inverse(LinkList &L) {
// 逆置带头结点的单
L
链表
p=L->next; L->next=NULL;
while ( p) {
的后继
q=p->next; // q 指向
*p
p->next=L->next;
L->next=p; // *p 插入在头结点之后p = q;
}
}
( 10)已知长度为n 的线性表 A 采用顺序存储结构,请写一时间复杂度为O(n) 、空间
数据结构(c语言版)课后习题标准答案完整版
数据结构(c语言版)课后习题标准答案完整版
作者: 日期:
第1章绪论
5. 选择题:CCBDCA
6. 试分析下面各程序段的时间复杂度。
(1) O( 1)
(2) O( m*n)
(3) O(n2)
(4) O (log 3n)
(5) ......................................................... 因为x++共执行了n-1+ n-2++ 1= n(n-1)/2,所以执行时间为O ( n2)
(6) 0(」)
第2章线性表
1•选择题
babadbcabdcddac
2•算法设计题
(6)设计一个算法,通过一趟遍历在单链表中确定值最大的结点。
ElemType Max (Li nkList L ){
if(L->n ext==NULL) return NULL;
pmax=L-> next; // 假定第一个结点中数据具有最大值
p=L->n ext->n ext;
while(p != NULL ){// 如果下一个结点存在
if(p->data > pmax->data) pmax=p; p=p->n ext;
} return pmax->data;
(7)设计一个算法,通过遍历一趟,将链表中所有结点的链接方向逆转,仍利用原表的存储空间。
void in verse(L in kList &L) {
// 逆置带头结点的单链表L
p=L->n ext; L->n ext=NULL;
while ( p) {
q=p->next; // q 指向*p的后继
p->n ext=L->n ext;
数据结构与算法分析c语言描述中文答案
数据结构与算法分析c语言描述中文答
案
【篇一:数据结构(c语言版)课后习题答案完整版】
选择题:ccbdca
6.试分析下面各程序段的时间复杂度。(1)o(1)(2)o
(m*n)(3)o(n2)(4)o(log3n)
(5)因为x++共执行了n-1+n-2+??+1= n(n-1)/2,所以执行时间为o(n2)(6)o(n)
第2章线性表
1.选择题
babadbcabdcddac 2.算法设计题
(6)设计一个算法,通过一趟遍历在单链表中确定值最大的结点。elemtype max (linklist l ){
if(l-next==null) return null;
pmax=l-next; //假定第一个结点中数据具有最大值 p=l-next-next; while(p != null ){//如果下一个结点存在if(p-data pmax-data) pmax=p;p=p-next; }
return pmax-data;
(7)设计一个算法,通过遍历一趟,将链表中所有结点的链接方向逆转,仍利用原表的存储空间。
void inverse(linklist l) { // 逆置带头结点的单链表 l p=l-next; l-next=null; while ( p) {
q=p-next; // q指向*p的后继p-next=l-next;
l-next=p; // *p插入在头结点之后p = q; }
}
(10)已知长度为n的线性表a采用顺序存储结构,请写一时间复杂度为o(n)、空间复杂度为o(1)的算法,该算法删除线性表中所有值为item的数据元素。
数据结构C语言版习题参考答案
附录习题参考答案
习题1参考答案
1.1.选择题
(1). A. (2). A. (3). A. (4). B.,C. (5). A. (6). A. (7). C. (8). A. (9). B. (10.)
A.
1.2.填空题
(1). 数据关系
(2). 逻辑结构物理结构
(3). 线性数据结构树型结构图结构
(4). 顺序存储链式存储索引存储散列表(Hash)存储
(5). 变量的取值范围操作的类别
(6). 数据元素间的逻辑关系数据元素存储方式或者数据元素的物理关系
(7). 关系网状结构树结构
(8). 空间复杂度和时间复杂度
(9). 空间时间
(10). Ο(n)
1.3 名词解释如下:
数据:数据是信息的载体,是计算机程序加工和处理的对象,包括数值数据和非数值数据。数据项:数据项指不可分割的、具有独立意义的最小数据单位,数据项有时也称为字段或域。数据元素:数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理,一个数据元素可由若干个数据项组成。
数据逻辑结构:数据的逻辑结构就是指数据元素间的关系。
数据存储结构:数据的物理结构表示数据元素的存储方式或者数据元素的物理关系。
数据类型:是指变量的取值范围和所能够进行的操作的总和。
算法:是对特定问题求解步骤的一种描述,是指令的有限序列。
1.4 语句的时间复杂度为:
(1) Ο(n2)
(2) Ο(n2)
(3) Ο(n2)
(4) Ο(n-1)
(5) Ο(n3)
1.5 参考程序:
main()
{
int X,Y,Z;
scanf(“%d, %d, %d”,&X,&Y,Z);
数据结构(C语言版)第三四章习题答案解析
第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为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素个数的公式为()。
A.r-f B.(n+f-r)%n C.n+r-f D.(n+r-f)%n (4)链式栈结点为:(data,link),top指向栈顶.若想摘除栈顶结点,并将删除结点的值保存到x中,则应执行操作()。
A.x=top->data;top=top->link; B.top=top->link;x=top->link;
C.x=top;top=top->link; D.x=top->link;
(5)设有一个递归算法如下
int fact(int n) { //n大于等于0
if(n<=0) return 1;
else return n*fact(n-1); }
则计算fact(n)需要调用该函数的次数为()。
A. n+1 B. n-1 C. n D. n+2 (6)栈在()中有所应用。
A.递归调用 B.函数调用 C.表达式求值 D.前三个选项都有(7)为解决计算机主机与打印机间速度不匹配问题,通常设一个打印数据缓冲区。主机将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中取出数据。该缓冲区的逻辑结构应该是()。
算法与数据结构C语言版课后习题参考答案(机械工业出版社)1绪论习题详细答案
第1章概论习题参考答案
一、基础知识题
1.简述下列概念
数据,数据元素,数据类型,数据结构,逻辑结构,存储结构,算法。
【解答】数据是信息的载体,是描述客观事物的数、字符,以及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据元素是数据的基本单位。在不同的条件下,数据元素又可称为元素、结点、顶点、记录等。
数据类型是对数据的取值范围、数据元素之间的结构以及允许施加操作的一种总体描述。每一种计算机程序设计语言都定义有自己的数据类型。
“数据结构”这一术语有两种含义,一是作为一门课程的名称;二是作为一个科学的概念。作为科学概念,目前尚无公认定义,一般认为,讨论数据结构要包括三个方面,一是数据的逻辑结构,二是数据的存储结构,三是对数据进行的操作(运算)。而数据类型是值的集合和操作的集合,可以看作是已实现了的数据结构,后者是前者的一种简化情况。
数据的逻辑结构反映数据元素之间的逻辑关系(即数据元素之间的关联方式或“邻接关系”),数据的存储结构是数据结构在计算机中的表示,包括数据元素的表示及其关系的表示。数据的运算是对数据定义的一组操作,运算是定义在逻辑结构上的,和存储结构无关,而运算的实现则依赖于存储结构。
数据结构在计算机中的表示称为物理结构,又称存储结构。是逻辑结构在存储器中的映像,包括数据元素的表示和关系的表示。逻辑结构与计算机无关。
算法是对特定问题求解步骤的一种描述,是指令的有限序列。其中每一条指令表示一个或多个操作。一个算法应该具有下列特性:有穷性、确定性、可行性、输入和输出。
2.数据的逻辑结构分哪几种,为什么说逻辑结构是数据组织的主要方面?
(完整word版)数据结构(c语言版)课后习题答案完整版资料
第1章绪论
5.选择题:CCBDCA
6.试分析下面各程序段的时间复杂度。
(1)O(1)
(2)O(m*n)
(3)O(n2)
(4)O(log3n)
(5)因为x++共执行了n—1+n—2+……+1= n(n—1)/2,所以执行时间为O(n2)(6)O(n)
第2章线性表
1.选择题
babadbcabdcddac
2.算法设计题
(6)设计一个算法,通过一趟遍历在单链表中确定值最大的结点。
ElemType Max (LinkList L ){
if(L—〉next==NULL) return NULL;
pmax=L-〉next;//假定第一个结点中数据具有最大值
p=L-〉next—>next;
while(p != NULL ){//如果下一个结点存在
if(p->data > pmax—>data) pmax=p;
p=p->next;
}
return pmax-〉data;
(7)设计一个算法,通过遍历一趟,将链表中所有结点的链接方向逆转,仍利用原表的存储空间.
void inverse(LinkList &L) {
// 逆置带头结点的单链表L
p=L-〉next;L->next=NULL;
while (p){
q=p—>next;// q指向*p的后继
p->next=L—>next;
L—>next=p; // *p插入在头结点之后
p = q;
}
}
(10)已知长度为n的线性表A采用顺序存储结构,请写一时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为item的数据元素.
算法与数据结构C语言版课后习题答案(机械工业出版社)第3,4章习题参考答案
算法与数据结构C语⾔版课后习题答案(机械⼯业出版社)第3,4章习题参考答案
第3章栈和队列
⼀、基础知识题
3.1有五个数依次进栈:1,2,3,4,5。在各种出栈的序列中,以3,4先出的
序列有哪⼏个。(3在4之前出栈)。
【解答】34215 ,34251,34521
3.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的值分别
数据结构(C语言版)(第2版)课后习题答案
数据结构(C语言版)(第2版)
课后习题答案
李冬梅
2015.3
第1 绪论 (1)
第2线性表 (5)
第3栈和队列 14 第4串、数组和广义表 27 第5树和二叉树 34 第 6 图 (43)
第7 查找 (55)
第8 排序 (66)
第 1 章绪论
1.简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。
答案:
数据:是客观事物的符号表示,指所有能输入到计算机中并被计算机程序处理的符号的总称。如数学计算中用到的整数和实数,文本编辑所用到的字符串,多媒体程序处理的图形、
图像、声音、动画等通过特殊编码定义后的数据。
数据元素:是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。在有些情况下,数据元素也称为元素、结点、记录等。数据元素用于完整地描述一个对象,如一个学生记录,树中棋盘的一个格局(状态)、图中的一个顶点等。
数据项:是组成数据元素的、有独立含义的、不可分割的最小单位。例如,学生基本信息表中的学号、姓名、性别等都是数据项。
数据对象:是性质相同的数据元素的集合,是数据的一个子集。例如:整数数据对象是集合N={0 ,± 1 ,±2,⋯},字母字符数据对象是集合C={ ‘ A’,‘ B’,⋯,‘ Z’,
‘ a’,
‘ b ’,⋯,‘z’ } ,学生基本信息表也可是一个数据对象。
数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。换句话说,数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。
逻辑结构:从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。因此,数据的逻辑结构可以看作是从具体问题抽象出来的数学模型。
数据结构(c语言版)课后习题答案完整版
第1章 绪论
5.选择题:CCBDCA
6.试分析下面各程序段的时间复杂度。.试分析下面各程序段的时间复杂度。 (1)O (1) (2)O (m*n ) (3)O (n 2) (4)O (log 3n )
(5)因为x++共执行了n-1+n-2+……+1= n(n-1)/2,所以执行时间为O (n 2) (6)O(n )
第2章 线性表
1.选择题.选择题
babadbcabdcddac 2.算法设计题.算法设计题
(6)设计一个算法,通过一趟遍历在单链表中确定值最大的结点。)设计一个算法,通过一趟遍历在单链表中确定值最大的结点。 ElemType Max (LinkList L ){
if(L->next==NULL) return NULL; pmax=L->next; //假定第一个结点中数据具有最大值假定第一个结点中数据具有最大值 p=L->next->next;
while(p != NULL ){//如果下一个结点存在
if(p->data > pmax->data) pmax=p; p=p->next; }
return pmax->data;
(7)设计一个算法,通过遍历一趟,将链表中所有结点的链接方向逆转,仍利用原表的存储空间。的存储空间。
void inverse(LinkList &L) { // 逆置带头结点的单链表 L
p=L->next; L->next=NULL; while ( p) {
q=p->next; // q 指向*p 的后继 p->next=L->next;
数据结构c语言版课后习题答案完整版
数据结构c语言版课后习题答案完整版
Document serial number【KKGB-LBS98YT-BS8CB-BSUT-BST108】
第1章绪论
5.选择题:CCBDCA
6.试分析下面各程序段的时间复杂度。
(1)O(1)
(2)O(m*n)
(3)O(n2)
n)
(4)O(log
3
(5)因为x++共执行了n-1+n-2+……+1= n(n-1)/2,所以执行时间为O(n2)(6)O(n)
第2章线性表
1.选择题
babadbcabdcddac
2.算法设计题
(6)设计一个算法,通过一趟遍历在单链表中确定值最大的结点。
ElemType Max (LinkList L ){
if(L->next==NULL) return NULL;
pmax=L->next; 法设计题
(2)回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。试写一个算法判定给定的字符向量是否为回文。(提示:将一半字符入栈)
根据提示,算法可设计为:
合应用题
(1)已知模式串t=‘abcaabbabcab’写出用KMP法求得的每个字符对应的next和nextval函数值。
-1到9,列下标从1到11,从首地址S开始连续存放主存储器中,主存储器字长为16位。求:
①存放该数组所需多少单元
②存放数组第4列所有元素至少需多少单元
③数组按行存放时,元素A[7,4]的起始地址是多少
④ 数组按列存放时,元素A[4,7]的起始地址是多少
每个元素32个二进制位,主存字长16位,故每个元素占2个字长,行下标可平移至1到11。
算法与数据结构C语言习题参考答案-章
算法与数据结构C语言习题参考答案-章
1.绪论
1.将下列复杂度由小到大重新排序:
A.2n B.n! C.n5D.10 000 E.n*log2 (n)
【答】10 000< n*log2(n)< n5< 2n < n!
2.将下列复杂度由小到大重新排序:
A.n*log2(n) B.n + n2 + n3C.24D.n0.5
【答】24< n0.5< n*log2 (n) < n + n2 + n3
3.用大“O”表示法描述下列复杂度:
A.5n5/2 + n2/5 B.6*log2(n) + 9n
C.3n4+ n* log2(n) D.5n2 + n3/2
【答】A:O (n5/2) B:O (n) C:O (n4) D:O (n2)
4.按照增长率从低到高的顺序排列以下表达式:4n2 , log3n, 3n , 20n , 2000 , log2n , n2/3。又n!应排在第几位?
【答】按照增长率从低到高依次为:2000, log3n, log2n , n2/3 , 20n , 4n2 , 3n。
n!的增长率比它们中的每一个都要大,应排在最后一位。
5. 计算下列程序片断的时间代价:
int i=1;
while(i<=n)
{
printf(“i=%d\n”,i);
i=i+1;
}
【答】循环控制变量i从1增加到n,循环体执行n次,第一句i 的初始化执行次数为1,第二句执行n次,循环体中第一句printf执行n次,第二句i从1循环到n,共执行n次。所以该程序段总的时间代价为:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第3章栈和队列
一、基础知识题
3.1有五个数依次进栈:1,2,3,4,5。在各种出栈的序列中,以3,4先出
的序列有哪几个。(3在4之前出栈)。
【解答】34215 ,34251, 34521
3.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和 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)void demo1(SeqStack S)
{int i,arr[64],n=0;
while(!StackEmpty(S)) arr[n++]=Pop(S);
for(i=0;i } 【解答】程序段的功能是实现了栈中元素的逆置。 (2)void demo2(SeqStack S,int m)∥设栈中元素类型为int型 {int x;SeqStack T; StackInit(T); while(!StackEmpty(S)) if((x=Pop(S)!=m) Push(T,x); while(!(StackEmpty(T)) {x=Pop(T); Push(S,x);} } 【解答】程序段的功能是删除了栈中值为m的元素。 (3)void demo3(SeQueue Q,int m)∥设队列中元素类型为int型 {int x;SeqStack S; StackInit(S); while(!QueueEmpty(Q)){x=QueueOut(Q); Push(S,x);} while(!StackEmpty(S)){x=Pop(s); QueueIn(Q,x);} } 【解答】程序段的功能是实现了队列中元素的逆置。 3.8试将下列递推过程改写为递归过程。 void ditui(int n) {i=n; while(i>1) printf(i--); } 【解答】void digui(int n) {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+1 B. rear=(rear+1) % (m-1) C. rear=(rear+1) % m D. rear=(rear+1) % (m+1) 【解答】D 3.11 选择题:4个园盘的Hahoi塔,总的移动次数为( )。 A.7 B. 8 C.15 D.16 【解答】C 3.12选择题:允许对队列进行的操作有( )。 A. 对队列中的元素排序 B. 取出最近进队的元素 C. 在队头元素之前插入元素 D. 删除队头元素 【解答】D 二、算法设计题 3.13 利用栈的基本操作,编写求栈中元素个数的算法。 【题目分析】将栈值元素出栈,出栈时计数,直至栈空。 【算法】int StackLength(Stack S) {//求栈中元素个数 int n=0; while(!StackEmpty(S) {n++; Pop(S); } return n; } 算法讨论:若要求统计完元素个数后,不能破坏原来栈,则在计数时,将原栈导入另一临时栈,计数完毕,再将临时栈倒入原栈中。 int StackLength(Stack S) {//求栈中元素个数 int n=0; Stack T; StackInit(T); //初始化临时栈T while(!StackEmpty(S) {n++; Push(T,Pop(S)); } while(!StackEmpty(T) {Push(S,Pop(T)); } return n; } 3.14 双向栈S是在一个数组空间V[m]实现的两个栈,栈底分别处于数组空间的 两端。试为此双向栈设计栈初始化Init(S)、入栈Push(S,i,x)、出栈Pop(S, i)算法,其中i为0或1,用以指示栈号。 [题目分析]两栈共享向量空间,将两栈栈底设在向量两端,初始时,s1栈顶指针为-1,s2栈顶为m。两栈顶指针相邻时为栈满。两栈顶相向、迎面增长,栈顶指针指向栈顶元素。 #define ElemType int ∥假设元素类型为整型 typedef struct {ElemType V[m]; ∥栈空间 int top[2]; ∥top为两个栈顶指针 }stk; stk S; ∥S是如上定义的结构类型变量,为全局变量 (1)栈初始化