广工数据结构mooc第3章

合集下载

数据结构(第3章)

数据结构(第3章)

2013年7月12日
数据结构讲义
1
3.1 栈
栈的定义及基本运算 栈的存储实现和运算实现
2013年7月12日
数据结构讲义
2
3.1.1 栈的定义及基本运算
栈是限制在表的一端进行插入和删除的线性表。允许 插入、删除的这一端称为栈顶,另一个固定端称为栈底。 当表中没有元素时称为空栈。 右图所示栈中有三个元素, 进栈的顺序是a1、a2、a3,当 需要出栈时其顺序为a3、a2、 a1,所以栈又称为后进先出的 线性表(Last In First Out), 简称 LIFO表。
2013年7月12日 数据结构讲义 7
⑵判空栈
【算法3-2】栈空判别算法 int Empty_SeqStack(SeqStack *s){ if (s->top==-1) return 1; //栈顶指针指向栈底,空栈 else return 0; }
2013年7月12日
数据结构讲义
8
⑶入栈
【算法3-3】入栈算法 int Push_SeqStack(SeqStack *s,DataType x){ if (s->top==MAXSIZE-1) return 0; //栈满不能入栈,返回错误代码0 else { s->top++; //栈顶指针向上移动 s->data[s->top]=x; //将x至入新的栈顶 return 1; //入栈成功,返回成功代码1 } }
2013年7月12日 数据结构讲义 12
⒉链栈
通常链栈用单链表表示,因此其结点结构与单链表的 结构相同: typedef struct node { datatype data; struct node *next; }StackNode,* LinkStack; 说明top为栈顶指针: LinkStack top ; 因为栈中的主要运算是在栈顶插入、删除,显然在链 表的头部做栈顶是最方便的,而且没有必要象单链表那 样为了运算方便附加一个头结点。通常将链栈表示成图 的形式。

数据结构第三章的习题答案

数据结构第三章的习题答案

数据结构第三章的习题答案数据结构第三章的习题答案在学习数据结构的过程中,习题是巩固知识和提高能力的重要方式。

第三章的习题主要涉及线性表、栈和队列的实现和操作。

本文将对这些习题进行解答,并给出详细的步骤和思路。

1. 第一题要求实现一个线性表的插入操作。

线性表是一种常用的数据结构,它的特点是元素之间存在一对一的关系。

要实现插入操作,首先需要定义线性表的数据结构,可以使用数组或链表来实现。

然后,根据插入位置,将插入位置之后的元素依次后移,为要插入的元素腾出空间。

最后,将要插入的元素放入插入位置。

2. 第二题要求实现一个栈的压栈和出栈操作。

栈是一种后进先出(LIFO)的数据结构,可以使用数组或链表来实现。

压栈操作就是将元素放入栈顶,出栈操作就是将栈顶元素取出并删除。

要实现这两个操作,可以使用一个指针来指示栈顶位置,每次压栈时将指针加一,出栈时将指针减一。

需要注意的是,栈满时不能再进行压栈操作,栈空时不能进行出栈操作。

3. 第三题要求实现一个队列的入队和出队操作。

队列是一种先进先出(FIFO)的数据结构,同样可以使用数组或链表来实现。

入队操作就是将元素放入队尾,出队操作就是将队头元素取出并删除。

与栈不同的是,队列需要维护队头和队尾两个指针。

每次入队时将元素放入队尾,并将队尾指针后移一位;出队时将队头元素取出,并将队头指针后移一位。

需要注意的是,队列满时不能再进行入队操作,队列空时不能进行出队操作。

4. 第四题要求实现一个栈的括号匹配算法。

括号匹配是一种常见的应用场景,例如编程语言中的括号匹配。

要实现这个算法,可以使用栈来辅助。

遍历字符串中的每个字符,如果是左括号,则将其压入栈中;如果是右括号,则将栈顶元素取出并判断是否与右括号匹配。

如果匹配,则继续遍历下一个字符;如果不匹配,则说明括号不匹配,返回错误。

最后,如果栈为空,则说明括号匹配成功;如果栈不为空,则说明括号不匹配,返回错误。

5. 第五题要求使用栈实现一个逆波兰表达式的计算器。

数据结构第3章作业答案

数据结构第3章作业答案

第3章作业答案一、填空1. 向量、栈和队列都是线性结构,可以在向量的任何位置插入和删除元素;对于栈只能在栈顶插入和删除元素;对于队列只能在队尾插入和队首删除元素。

2. 栈是一种特殊的线性表,允许插入和删除运算的一端称为栈顶。

不允许插入和删除运算的一端称为栈底。

3. 队列是被限定为只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表。

4.在具有n个单元的循环队列中,队满时共有n-1 个元素。

设有4个数据元素a1、a2、a3和a4,对他们分别进行栈操作或队操作。

在进栈或进队操作时,按a1、a2、a3、a4次序每次进入一个元素。

假设栈或队的初始状态都是空。

现要进行的栈操作是进栈两次,出栈一次,再进栈两次,出栈一次;这时,第一次出栈得到的元素是 A ,第二次出栈得到的元素是 B 是;类似地,考虑对这四个数据元素进行的队操作是进队两次,出队一次,再进队两次,出队一次;这时,第一次出队得到的元素是 C ,第二次出队得到的元素是 D 。

经操作后,最后在栈中或队中的元素还有E个。

供选择的答案:A~D:①a1 ②a2 ③a3 ④a4E:①1 ②2 ③3 ④0答:ABCDE=2, 4, 1, 2, 2栈是一种线性表,它的特点是 A 。

设用一维数组A[1,…,n]来表示一个栈,A[n]为栈底,用整型变量T指示当前栈顶位置,A[T]为栈顶元素。

往栈中推入(PUSH)一个新元素时,变量T的值 B ;从栈中弹出(POP)一个元素时,变量T的值 C 。

设栈空时,有输入序列a,b,c,经过PUSH,POP,PUSH,PUSH,POP操作后,从栈中弹出的元素的序列是 D ,变量T的值是 E 。

供选择的答案:A:①先进先出②后进先出③进优于出④出优于进⑤随机进出B,C:①加1 ②减1 ③不变④清0 ⑤加2 ⑥减2D:①a,b ②b,c ③c,a ④b,a ⑤c,b ⑥a,cE:①n+1 ②n+2 ③n ④n-1 ⑤n-2答案:ABCDE=2, 2, 1, 6, 4在做进栈运算时,应先判别栈是否 A ;在做退栈运算时,应先判别栈是否 B 。

数据结构与算法第3章课后答案

数据结构与算法第3章课后答案

第 3 章特殊线性表——栈、队列和串(2005-07-14) -第 3 章特殊线性表——栈、队列和串课后习题讲解1. 填空⑴设有一个空栈,栈顶指针为1000H,现有输入序列为1、2、3、4、5,经过push,push,pop,push,pop,push,push后,输出序列是(),栈顶指针为()。

【解答】23,1003H⑵栈通常采用的两种存储结构是();其判定栈空的条件分别是(),判定栈满的条件分别是()。

【解答】顺序存储结构和链接存储结构(或顺序栈和链栈),栈顶指针top= -1和top=NULL,栈顶指针top等于数组的长度和内存无可用空间⑶()可作为实现递归函数调用的一种数据结构。

【解答】栈【分析】递归函数的调用和返回正好符合后进先出性。

⑷表达式a*(b+c)-d的后缀表达式是()。

【解答】abc+*d-【分析】将中缀表达式变为后缀表达式有一个技巧:将操作数依次写下来,再将算符插在它的两个操作数的后面。

⑸栈和队列是两种特殊的线性表,栈的操作特性是(),队列的操作特性是(),栈和队列的主要区别在于()。

【解答】后进先出,先进先出,对插入和删除操作限定的位置不同⑹循环队列的引入是为了克服()。

【解答】假溢出⑺数组Q[n]用来表示一个循环队列,front为队头元素的前一个位置,rear为队尾元素的位置,计算队列中元素个数的公式为()。

page: 2The Home of jetmambo - 第 3 章特殊线性表——栈、队列和串【解答】(rear-front+n)% n【分析】也可以是(rear-front)% n,但rear-front的结果可能是负整数,而对一个负整数求模,其结果在不同的编译器环境下可能会有所不同。

⑻用循环链表表示的队列长度为n,若只设头指针,则出队和入队的时间复杂度分别是()和()。

【解答】O(1),O(n)【分析】在带头指针的循环链表中,出队即是删除开始结点,这只需修改相应指针;入队即是在终端结点的后面插入一个结点,这需要从头指针开始查找终端结点的地址。

数据结构第3章V2课件

数据结构第3章V2课件
}
2021/6/27
CH.3
18
算法3.2(行编辑程序)存在的问题
本算法输入输出参数处理不恰当,不符合第一章对算法特征 的描述。
ClearStack(S);语句依次输出一行的次序与输入相反。 一个改进的函数原型如下:
void LineEdit (char *line_in, char *line_out);
分配
struct STACK {
SElemType *base; SElemType *top; int stacksize;
};
typedef struct STACK Sqstack;
2021/6/27
CH.3
7
ADT STACK的表示和实现
Status InitStack(SqStack &S); Status DestroyStack(SqStack &S); Status ClearStack(SqStack &S); Status StackEmpty(SqStack S); int StackLength(SqStack S); Status GetTop(SqStack S,SElemType &e); Status Push(SqStack &S,SElemType e); Status Pop(SqStack &S,SElemType &e); Status StackTraverse(SqStack S,Status
InitStack(&S);
printf("Input a number to convert to OCT:\n");
scanf("%d",&n);

广东工业大学数据结构Aniview系统第三章参考答案

广东工业大学数据结构Aniview系统第三章参考答案

广东工业大学数据结构Aniview第三章参考答案◆3.17③试写一个算法,识别依次读入的一个以@为结束符的字符序列是否为形如'序列1&序列2'模式的字符序列。

其中序列1和序列2中都不含字符'&',且序列2是序列1的逆序列。

例如,'a+b&b+a'是属该模式的字符序列,而'1+3&3-1'则不是。

实现下列函数:Status match(char *str);/* 若str是属该模式的字符序列,*//* 则返回TRUE,否则返回FALSE */Stack是一个已实现的栈。

可使用的相关类型和函数:typedef char SElemType; // 栈Stack的元素类型Status InitStack(Stack &s);Status Push(Stack &s, SElemType e);Status Pop(Stack &s, SElemType&e);Status StackEmpty(Stack s);Status GetTop(Stack s, SElemType&e);Status match(char *str)/* 若str是属该模式的字符序列,*//* 则返回TRUE,否则返回FALSE */{ Stack S;inti;SElemType e;InitStack(S);for(i=0;str[i]!='&';i++){ Push(S,str[i]); }for(i=i+1;!StackEmpty(S)&&str[i]!='@';i++){Pop(S,e);if(e!=str[i]){ return FALSE;}}if(StackEmpty(S)&&str[i]=='@'){ return TRUE;}}3.18②试写一个判别表达式中开、闭括号是否配对出现的算法。

数据结构 第3章答案(已核)

数据结构 第3章答案(已核)

数据结构第3章答案(已核)数据结构第3章答案(已核)数据结构是计算机科学中非常重要的一门课程,它研究如何组织和存储数据,以便于高效地访问和处理。

在第3章中,我们学习了一些与树相关的重要概念和算法。

本文将对该章节的内容进行总结和解答。

一、树(Tree)树是一种非线性的数据结构,它由一组节点(Node)和一组连接这些节点的边(Edge)组成。

树的一个节点被称为根节点,它没有父节点;其他节点可以有一个或多个子节点。

树的每个节点除了根节点外都有且只有一个父节点。

树有许多种类,如二叉树、平衡树等。

二、二叉树(Binary Tree)二叉树是一种特殊的树结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。

在二叉树中,左子树和右子树也是二叉树。

二叉树有许多重要的性质和应用,比如二叉搜索树、平衡二叉树等。

三、二叉搜索树(Binary Search Tree)二叉搜索树是一种特殊的二叉树,它的左子树中的所有节点的值都小于根节点的值,而右子树中的所有节点的值都大于根节点的值。

这个特性使得在二叉搜索树中进行插入、删除和查找操作非常高效。

四、平衡二叉树(AVL Tree)平衡二叉树也是一种特殊的二叉搜索树,它的左子树和右子树的高度差不超过1。

通过对插入和删除操作进行树的旋转,可以保持平衡二叉树的平衡性,使得操作的时间复杂度保持在O(log n)。

五、堆(Heap)堆是一种特殊的树结构,它可以分为最大堆和最小堆。

最大堆中,父节点的值大于等于子节点的值;最小堆中,父节点的值小于等于子节点的值。

堆常用于实现优先队列等数据结构,有助于高效地找出最大或最小元素。

六、哈夫曼树(Huffman Tree)哈夫曼树是一种特殊的二叉树,用于实现哈夫曼编码。

在哈夫曼树中,频率较高的字符具有较短的编码,而频率较低的字符具有较长的编码。

哈夫曼树常用于数据压缩领域,可以有效地减少数据的存储空间。

七、图(Graph)图是一种复杂的数据结构,它由节点和连接节点的边组成。

数据结构第三章习题答案解析

数据结构第三章习题答案解析

数据结构第三章习题答案解析第三章习题1. 按图3.1(b)所示铁道(两侧铁道均为单向行驶道)进行车厢调度,回答:⑴ 如进站的车厢序列为123 ,则可能得到的出站车厢序列是什么?⑵如进站的车厢序列为123456 ,能否得到435612 和135426 的出站序列,并说明原因。

(即写出以“S”表示进栈、以“ X”表示出栈的栈操作序列)。

2. 设队列中有A、B、C、D、E这5个元素,其中队首元素为A。

如果对这个队列重复执行下列4步操作:1) 输出队首元素;2) 把队首元素值插入到队尾;3) 删除队首元素;4) 再次删除队首元素。

直到队列成为空队列为止,得到输出序列:(1)A、C、E、C、C (2)A、C、E(3)A、C、E、C、C、 C (4)A、C、E、C3. 给出栈的两种存储结构形式名称,在这两种栈的存储结构中如何判别栈空与栈满?4. 按照四则运算加、减、乘、除和幕运算(T)优先关系的惯例,画出对下列算术表达式求值时操作数栈和运算符栈的变化过程:A —B *C/D+EfF5. 试写一个算法,判断依次读入的一个以@为结束符的字母序列,是否为形如‘序列1 & 序列2' 模式的字符序列。

其中序列1 和序列2 中都不含字符' &'且,序列2 是序列1 的逆序列。

例如,‘a+b&b+a '是属该模式的字符序列,而’1+ 3 &3 —1'则不是。

6. 假设表达式由单字母变量和双目四则运算算符构成。

试写一个算法,将一个通常书写形式且书写正确的表达式转换为逆波兰式。

7. 假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素结点 (注意不设头指针) ,试编写相应的队列初始化、入队列和出队列的算法。

8. 要求循环队列不损失一个空间全部都能得到利用,设置一个标志域tag ,以tag为0或1来区分头尾指针相同时的队列状态的空与满,请编写与此结构相应的入队与出队算法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第3章
得分:85一、选择题:
1、顺序存储方式插入和删除时效率太低,因此它不如链式存储方式好
A.对
B.错
2、顺序存储方式的优点是存储密度大,且插入、删除运算效率高。

A.对
B.错
3、线性表的特点是每个元素都有一个前驱和一个后继。

A.对
B.错
4、下述哪一条是顺序存储结构的优点?
A.存储密度大
B.插入运算方便
C.删除运算方便
D.可方便地用于各种逻辑结构的存储表示
5、下面关于线性表的叙述中,错误的是哪一个?
A.线性表采用顺序存储,必须占用一片连续的存储单元。

B.线性表采用顺序存储,便于进行插入和删除操作。

C.线性表采用链接存储,不必占用一片连续的存储单元。

D.线性表采用链接存储,便于插入和删除操作。

6、线性表是具有n个()的有限序列(n>0)。

A.表元素
B.字符
C.数据元素
D.数据项
E.信息项
7、若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用( )存储方式最节省时间。

A.顺序表
B.双链表
C.带头结点的双循环链表
D.单循环链表
8、集合与线性表的区别在于是否按关键字排序。

A.对
B.错
9、取线性表的第i个元素的时间同i的大小有关.
A.对
B.错
10、线性表就是顺序存储的表。

A.对
B.错
11、若长度为n的线性表采用顺序存储结构,在其第i个位置插入一个新元素的算法的时间复杂度为( )(1<=i<=n+1)。

答案:C
A.O(0)
B.O(1)
C.O(n)
D.O(n2)
12、对于顺序存储的线性表,访问结点和增加、删除结点的时间复杂度为(
)。

答案:C
A.O(n) O(n)
B.O(n) O(1)
C.O(1) O(n)
D.O(1) O(1)
13、线性表只能用顺序存储结构实现。

A.对
B.错
14、栈通常用哪两种方式存储?
A.顺序存储和链表存储
B.散列方式和索引方式
C.链表存储结构和数组
D.线性存储结构和非线性存储结构
15、栈的特点是:后进先出
A.对
B.错
16、栈是一种逻辑结构?
A.对
B.错
17、一个数组第一个元素的存储地址是100,每个元素长度是2,则第5个元素的地址是:
A.100
B.108
C.110
D.120
18、栈的数组实现需要移动元素吗?
A.不需要
B.需要
C.不一定
19、计算前缀表达式**76-/821的值
A.120
B.135
C.126
D.128
20、将表达式(a+b)/ c转换成后缀表达式
A.ab+c/
B.abc+/
C.ab/c+
D.abc/+
21、一个栈的入栈序列是a,b,c,d,e,则栈的不可能的输出序列是
A.edcba
B.decba
C.dceab
D.abcde
22、在队列中,允许进行插入操作的一端称为____
A.队首
B.队尾
C.栈顶
D.栈底
23、
以下操作不属于队列的操作是:
A.队尾添加一个元素
B.构造空队列
C.取队列长度
D.删除队列中部的元素
二、填空或作图题:
3.1.1、已知栈S = (m,v,o,u) ,Pop( S,e )操作之后栈S的结果是
(m,v,o)。

3.1.2、已知栈S = (y,r,o,x),Push( S,‘v’ )操作之后栈S的结果是
(y,r,o,x,v)。

3.1.3、已知栈S = (h,l,e,a,r) , Push(S, Pop(Push(S, Pop(S, Pop(S, e))), e))操作之后栈S的结果是(h,l,e,a)。

3.1.4、用S表示入栈操作,X表示出栈操作,若元素入栈的顺序是
(d,q,u,y,n),为了得到(d,q,n,y,u)出栈序列,用相应的S和X表示的操作串为SXSXSSSXXX。

3.1.5、用S表示入栈操作,X表示出栈操作,若元素入栈的顺序是
(y,c,i,u,b),为了得到(c,b,u,i,y)出栈序列,用相应的S和X表示的操作串为SSXSSSXXXX。

3.2.1、已知队列Q = (u,n,w,b,g),EnQueue( Q, 'k' )操作之后队列Q的结果是(u,n,w,b,g,k)。

3.2.2、已知队列Q = = (u,i,j,a,c,y),DeQueue( Q,e )操作之后队列Q的结果是(u,i,j,a,c)。

(i,j,a,c,y)
3.2.3、已知队列Q = (q,d,w,l,o,i,t),DeQueue( Q,e )操作之后队列Q的结
果是(q,d,w,l,o,i)。

(d,w,l,o,i,t)
3.2.4、已知队列的输入序列是= (e,o,a,g,y,v),则队列的合法输出序列是(e,o,a,g,y,v)。

3.2.5、若用一个长度为6的数组来表示循环队列,且当前front和rear的值分别是0和5则该队列的长度是4。

5
3.2.6、若用一个长度为6的数组来表示循环队列,且当前front和rear的值分别是5和3当从队列中删除2个元素,再加上4个元素后,rear和front的值分别为1和1。

-- 完 --。

相关文档
最新文档