第3章 栈-算法与数据结构(第三版)-陈媛-清华大学出版社
数据结构——用C语言描述(第3版)教学课件第3章 栈和队列
if(S->top==-1) /*栈为空*/
return(FALSE);
else
{*x = S->elem[S->top];
return(TRUE);
}
返回主目录}[注意]:在实现GetTop操作时,也可将参数说明SeqStack *S 改为SeqStack S,也就是将传地址改为传值方式。传 值比传地址容易理解,但传地址比传值更节省时间、 空间。
返回主目录
算法:
void BracketMatch(char *str) {Stack S; int i; char ch; InitStack(&S); For(i=0; str[i]!='\0'; i++) {switch(str[i])
{case '(': case '[': case '{':
3.1.3 栈的应用举例
1. 括号匹配问题
思想:在检验算法中设置一个栈,若读入的是左括号, 则直接入栈,等待相匹配的同类右括号;若读入的是 右括号,且与当前栈顶的左括号同类型,则二者匹配, 将栈顶的左括号出栈,否则属于不合法的情况。另外, 如果输入序列已读尽,而栈中仍有等待匹配的左括号, 或者读入了一个右括号,而栈中已无等待匹配的左括 号,均属不合法的情况。当输入序列和栈同时变为空 时,说明所有括号完全匹配。
return(TRUE);
}
返回主目录
【思考题】
如果将可利用的空闲结点空间组织成链栈来管理,则申 请一个新结点(类似C语言中的malloc函数)相当于链 栈的什么操作?归还一个无用结点(类似C语言中的 free函数)相当于链栈的什么操作?试分别写出从链栈 中申请一个新结点和归还一个空闲结点的算法。
第3章栈和队列-数据结构与算法(第2版)-汪沁-清华大学出版社
an
队头
队尾
队列示意图
入队
13
2、队列的基本运算
初始化队列 INIQUEUE(&Q)
将队列Q设置成一个空队列。
入队列
ENQUEUE(&Q,X)
将元素X插入到队尾中,也称“进队” ,“插入”。
出队列
DLQUEUE(&Q)
将队列Q的队头元素删除,也称“退队”、“删除”。
取队头元素 GETHEAD(Q)
也就是说,栈是一种后进先出(Last In First Out)的线性表,简称为LIFO表。
3
2、栈的运算
初始化栈:INISTACK(&S)
将栈S置为一个空栈(不含任何元素)。
进栈:PUSH(&S,X)
将元素X插入到栈S中,也称为 “入栈”、 “插入”、 “压 入”。
出栈: POP(&S)
删除栈S中的栈顶元素,也称为”退栈”、 “删除”、 “弹 出”。
9
三、链栈
typedef struct Lsnode { ElemType data;
struct Lsnode *next; } Lsnode *top;
一个链表栈由ቤተ መጻሕፍቲ ባይዱ顶指针top唯一确定。
10
1、链栈的主要运算
进栈操作 void Push(Lsnode *top; ElemType x)
{ p=(Lsnode *)malloc(sizeof(Lsnode)); p->data=x; p->next=top->next; top->next=p; }/*Push*/
第3章 栈和队列
1
栈和队列是二种特殊的线性表。是操作受 限的线 性表。 一、栈
陈嫒算法与数据结构第三版课后答案
陈嫒算法与数据结构第三版课后答案算法与数据结构-C语言描述(第三版)第1章绪论1、解释以下概念:逻辑结构,存储结构,操作,数据结构,数据结构的表示,数据结构的实现,抽象数据类型,算法,算法的时间代价,算法的空间代价,大O表示法,贪心法,回溯法,分治法。
答:(1)逻辑结构(数学模型):指数据元素之间地逻辑关系。
具体解释:指数学模型(集合,表,树,和图)之间的关系。
描述方式:B=<K,R>,K是节点的有穷集合,R是K上的一个关系。
(2)存储结构(物理结构):数据的逻辑结构在计算机存储器中的映射(或表示)。
(3)操作(行为):指抽象数据类型关心的的各种行为在不同的存储结构上的具体算法(或程序)。
(4)数据结构:传统观念:数据结构是计算机中表示(存储)的、具有一定逻辑关系和行为特征的一组数据。
②根据面向对象的观点:数据结构是抽象数据类型的物理实现。
(5)数据结构的表示:(6)数据结构的实现:(7)抽象数据类型:(8)算法:是由有穷规则构成(为解决其中一类问题)的运算序列。
-算法可以有若干输入(初始值或条件)。
-算法通常又有若干个输出(计算结果)。
-算法应该具有有穷性。
一个算法必须在执行了有穷步之后结束。
-算法应该具有确定性。
算法的每一步,必须有确切的定义。
-算法应该有可行性。
算法中国的每个动作,原则上都是能够有机器或人准确完成的。
(9)算法的时间代价:(10)算法的空间代价:(11)大O表示法:-更关注算法复杂性的量级。
-若存在正常数c和n0,当问题的规模n>=cf(n), 则说改算法的时间(或空间)代价为O(f(n))(12)贪心法:当追求的目标是一个问题的最优解是,设法把整个问题的求解工作分成若干步来完成。
在其中的每一个阶段都选择都选择从局部来看是最优的方案,以期望通过各个阶段的局部最有选择达到整体的最优。
例如:着色问题:先用一种颜色尽可能多的节点上色,然后用另一种颜色在为着色节点中尽可能多的节点上色,如此反复直到所有节点都着色为止;(13)回溯法有一些问题,需要通过彻底搜索所有的情况寻找一个满足一些预定条件的最优解。
数据结构与算法第三章清华大学出版社赵玉兰
p=top->next;
retvalue=p->data;
//暂存栈顶数据
top ->next=p->next; //修改栈顶指针
delete p;
//释放,返回数据
return retvalue;
}
else{
//栈空的情况
cout<<”the stack is empty!”<<endl;
return nulldata;
30
3.1 栈——栈与递归
31
3.1 栈——栈与递归
解决汉诺塔问题的算法
main( ) {
int n;
cout<<"Input number of disks”;
cin>>n;
void hanoi (int n,char x,char y,char z)
hanoi( n ,'A','B','C' ); {
29
3.1 栈——栈与递归
汉诺塔解决方法
n=1时,直接把圆盘从塔 A 移到塔 C; n>1时,先把塔 A 上的 n-1 个圆盘移到塔 B,然后将 n
号盘从塔 A 移到塔 C,再将 n-1 个圆盘从塔 B移到塔C。
即把求解 n 个圆盘的Hanoi问题转化为求解 n-1 个圆盘 的 Hanoi 问题,依次类推,直至转化成只有一个圆盘 的 Hanoi 问题。
}
}//GetTop
21
3.1 栈——栈的实现
顺序栈和链栈的比较 时间复杂度:相同,都是常数时间O(1) 空间性能:
顺序栈:有元素个数的限制和空间浪费的问题。 链栈:没有栈满的问题,只有当内存没有可用空间时
数据结构(c语言版)第三版习题解答
数据结构(c语言版)第三版习题解答数据结构(C语言版)第三版习题解答1. 栈(Stack)1.1 栈的基本操作栈是一种具有特定限制的线性表,它只允许在表的一端进行插入和删除操作。
栈的基本操作有:(1)初始化栈(2)判断栈是否为空(3)将元素入栈(4)将栈顶元素出栈(5)获取栈顶元素但不出栈1.2 栈的实现栈可以使用数组或链表来实现。
以数组为例,声明一个栈结构如下:```c#define MAX_SIZE 100typedef struct {int data[MAX_SIZE]; // 存储栈中的元素int top; // 栈顶指针} Stack;```1.3 栈的应用栈在计算机科学中有广泛的应用,例如计算表达式的值、实现函数调用等。
下面是一些常见的栈应用:(1)括号匹配:使用栈可以检查一个表达式中的括号是否匹配。
(2)中缀表达式转后缀表达式:栈可以帮助我们将中缀表达式转换为后缀表达式,便于计算。
(3)计算后缀表达式:使用栈可以方便地计算后缀表达式的值。
2. 队列(Queue)2.1 队列的基本操作队列是一种按照先进先出(FIFO)原则的线性表,常用的操作有:(1)初始化队列(2)判断队列是否为空(3)将元素入队(4)将队头元素出队(5)获取队头元素但不出队2.2 队列的实现队列的实现一般有循环数组和链表两种方式。
以循环数组为例,声明一个队列结构如下:```c#define MAX_SIZE 100typedef struct {int data[MAX_SIZE]; // 存储队列中的元素int front; // 队头指针int rear; // 队尾指针} Queue;```2.3 队列的应用队列在计算机科学中也有广泛的应用,例如多线程任务调度、缓存管理等。
下面是一些常见的队列应用:(1)广度优先搜索:使用队列可以方便地实现广度优先搜索算法,用于解决图和树的遍历问题。
(2)生产者-消费者模型:队列可以用于实现生产者和消费者之间的数据传输,提高系统的并发性能。
算法与数据结构第三版
算法与数据结构第三版算法与数据结构——第三版前言本书是一本介绍算法和数据结构的入门书籍。
它适用于计算机科学、软件工程以及其他相关领域的本科生和研究生。
书中涵盖了各种算法和数据结构,如排序、搜索、图算法、哈希表、堆、树、链表等等。
本书旨在帮助读者理解这些算法和数据结构的基本原理,并且能够将其运用于实际问题中。
本书分为三部分。
第一部分为基础知识,介绍了算法分析和大O表示法,以及一些重要的数据结构,例如数组、链表和栈。
第二部分为排序和搜索算法,包括冒泡排序、选择排序、插入排序、快速排序、归并排序、二分搜索和哈希表。
第三部分为高级主题,包括图算法、堆、树和字符串匹配等。
本书内容丰富、通俗易懂,希望能够给读者带来实际帮助。
第一部分基础知识第1章算法分析1.1 算法复杂度1.2 大O表示法1.3 最坏情况与平均情况1.4 最好情况1.5 算法稳定性1.6 实例分析第2章基本数据结构2.1 数组2.2 链表2.3 堆栈2.4 队列第二部分排序和搜索算法第3章冒泡排序和选择排序3.1 冒泡排序3.2 选择排序第4章插入排序和快速排序4.1 插入排序4.2 快速排序第5章归并排序5.1 归并排序5.2 自然归并排序第6章基数排序和桶排序6.1 基数排序6.2 桶排序第7章二分搜索和哈希表7.1 二分搜索7.2 哈希表第三部分高级主题第8章图算法8.1 图的表示8.2 深度优先搜索8.3 广度优先搜索8.4 最短路径算法8.5 最小生成树算法第9章堆和优先队列9.1 堆和堆排序9.2 优先队列第10章树和树算法10.1 树的基本概念10.2 二叉查找树10.3 平衡树10.4 完全二叉树和堆10.5 伸展树第11章字符串匹配11.1 基本思想11.2 暴力匹配算法11.3 KMP匹配算法11.4 Boyer-Moore匹配算法后记本书所介绍的算法和数据结构是计算机科学中的基本知识,并且在实际工程中应用广泛。
它们是计算机科学学习的基石,也是计算机程序员必须掌握的技能。
数据结构(C语言版)第三版__清华大学出版社_习题参考答案
数据结构(C语言版)第三版__清华大学出版社_习题参考答案数据结构(C语言版)第三版__清华大学出版社_习题参考答案引言:数据结构是计算机科学的基础,对于学习和理解数据结构的相关概念和算法非常重要。
本文将对清华大学出版社出版的《数据结构(C语言版)第三版》中的习题进行参考答案的提供。
通过正确的理解和掌握这些习题的解答,读者可以加深对数据结构的认识,并提高自己的编程能力。
第一章:绪论1.1 数据结构的定义与作用数据结构是指数据对象以及数据对象之间的关系、运算和存储结构的总称。
数据结构的作用是在计算机中高效地组织和存储数据,同时支持常见的数据操作和算法。
1.2 算法的定义与特性算法是解决特定问题的一系列步骤和规则。
算法具有确定性、有穷性、可行性和输入输出性等特点。
第二章:线性表2.1 线性表的定义和基本操作线性表是同类型数据元素的一个有限序列。
线性表的基本操作包括初始化、查找、插入、删除和遍历等。
2.2 顺序存储结构顺序存储结构是将线性表中的元素按顺序存放在一块连续的存储空间中。
顺序存储结构的特点是随机存取、插入和删除操作需要移动大量元素。
2.3 链式存储结构链式存储结构通过结点之间的指针链表来表示线性表。
链式存储结构的特点是插入和删除操作方便,但查找操作需要遍历整个链表。
第三章:栈和队列3.1 栈的定义和基本操作栈是只能在一端进行插入和删除操作的线性表。
栈的基本操作包括初始化、入栈、出栈和获取栈顶元素等。
3.2 队列的定义和基本操作队列是只能在一端插入操作,在另一端进行删除操作的线性表。
队列的基本操作包括初始化、入队、出队和获取队头元素等。
第四章:串4.1 串的定义和基本操作串是由零个或多个字符组成的有限序列。
串的基本操作包括初始化、串的赋值、串的连接和串的比较等。
第五章:树5.1 树的基本概念和术语树是n(n>=0)个结点的有限集。
树的基本概念包括根结点、子树、深度和高度等。
5.2 二叉树二叉树是每个结点最多有两个子树的树结构。
第1章 绪论-算法与数据结构(第三版)-陈媛-清华大学出版社
例3 :n个城市间铺设光缆的问题 算法: Prim或 Kruskal算法 n个城市间铺设光缆,任意两个城市都可以铺设
只要n-1条光缆即能将这n个城市连成网络,由于
地理位置的不同,所需经费也不同,选择设计方案
使总投资最省
图中“顶点”表示城市,顶点之间的连线及其上
面的数值表示可以铺设的光缆及所需经费。
计算机科学与工程学院《数据结构》课程组
7
1.1学习数据结构意义:小结
数据结构(学科) 研究非数值计算领域的程序设计问题 问题的操作对象 操作对象之间的关系 在操作对象上面施加的操作
算法+数据结构=程序
计算机科学与工程学院《数据结构》课程组
8
习题
判断下列各小题的正误: 数据结构这门学科,研究的是非数值 计算领域问题(√) 数据结构这门学科,只研究问题的操 作对象和操作对象之间的关系
员.人员之间的关系是:经理指导部门经理的工作,部 门经理指导职员的工作.
GROUP=(P,R)
P={M,D1,D2,E11,E12,E13,E21,E23,E23} R={<M,D1>,<M,D2>,<D1,E11>,<D1,E12>…<D2,E23>}
M
D1
D2
E11 E12 E13 E21 E22 E23
计算机科学与工程学院《数据结构》课程组
11
数据的逻辑结构
逻辑结构 数据元素之间的相互逻辑关系
四种基本逻辑结构 集合 不存在关系(没表示出) 线性结构 一对一的关系 树形结构 一对多的关系
图状结构或网状结构 多对多的关系
计算机科学与工程学院《数据结构》课程组
12
数据结构的形式定义
数据结构 陈雁 第3章算法题参考答案
第3章算法题参考答案1.写出链栈的取栈顶元素算法。
解:int GetTop(SNode *top,ELEMTP *Y){if(top->next==NULL)return -1else*y=top->next->data;return 1;}2.写出链栈的置栈空算法。
void Empty(SNode *top){while(top->next){p=top->next;top->next=p->next;free(p);}}3.一个正读和反读都相同的字符序列称为“回文”。
X例如“abcba”和“1221”是回文,而“abcde”不是回文。
试写一个算法,利用栈的基本运算识别一个以@为结束符的字符序列是否是回文。
int Palindrome_Test(char str[ ])/* 判别字符串str是否回文序列,是则返回1,否则返回0 */{InitStack(s); /*初始化栈s*/for(i=0;str[i]!=’@’;i++)Push(s,str[i]);i=0;while(!StackEmpty(s)){Pop(s,a);if(a!=str[i++]) return 0;}return 1;}4.对于给定的十进制正整数,打印出对应的八进制正整数。
(1)写出递归算法。
(2)写出非递归算法。
解:int f(int n)/* 递归算法*/{if (n<8)printf("%d",n);else{f(n/8);printf("%d",n%8);}}void f(int n) /* 非递归算法*/{InitStack(p);/*初始化栈*/do{Push(p,n%8);n=n/8;}while(n);while(!Empty(p)){Pop(p,o);printf("%d",o);}}5.已知n为大于等于零的整数,试写出计算下列递归函数f(n)的递归和非递归算法。
数据结构(C语言版)(第3版)
推荐
《数据结构(C语言版第3版)》特点: (1).结构合理、内容紧凑、知识连贯、逻辑性强,并且配有学习与实验指导书,便于学生学习和实践。 (2).所有算法都用C语言函数实现,并在TurboC2.0系统下通过调试,无须修改就可被其他函数调用,避免 了使用伪算法给学生学习带来的不便。 (3).例题经典且配有精选的大量习题,既可以使学生快速掌握所学的知识,又能培养学生的应用和创新能 力。 (4).电子教案及程序源代码可在清华大学出版社网站下载。 层次分明,结构严谨,语言简炼,图文并茂。 全部算法都用C语言编写,并在TurboC下调试通过,算法描述简捷易懂。 适合作为计算机及相关专业的教材,也可作为自学或各种计算机培训班的教材。
数据结构(C语言版)(第3版)
2015年清华大学出版社出版的图书
01 内容简介
03 作者简介
目录
02 推荐 04 图书目录 Nhomakorabea《数据结构(C语言版)(第3版)》是2015年8月1日清华大学出版社出版的图书,作者是秦玉平、马靖善。
内容简介
数据结构是计算机及其相关专业的核心课程,是计算机程序设计的基础,也是程序员考试和许多高校研究生 入学考试的必考科目。全书共10章。第1章是数据结构的概述;第2~10章分别讨论了顺序表、链表、栈、队列、 串、数组、广义表、树、二叉树、图、查找、内部排序、外部排序和文件等基本类型的数据结构。本书中的算法 都已经过调试,不必修改就能在Turbo C 2.0系统下正常运行。本书可作为计算机及相关专业的教材,也可作为 自学或各种计算机培训班的教材。
作者简介
秦玉平教授,计算机专业博士,辽宁省教学名师,硕士生导师,多年从事计算机算法与程序设计类课程的教 学与研究。
马靖善教授,计算机专业硕士,多年从事计算机教学管理工作和算法与程序设计类课程的教学与研究。
数据结构第三部分栈和队列课件
否
将 问 题 n递 归 分 解 的 问 题 n -1 ,n -2 入 栈
是
3-17
3.3 队列
3.3.1 队列的定义 队列(queue):是一种先进先出(first in first out,缩写为FIFO)
的线性表。它只允许在表的一端进行插入,而在另一端删除元素。
出队列
a1 a 2 a 3 … an
*e=S->elem[S->top];
//获取栈顶元素
ห้องสมุดไป่ตู้
S->top--;
//删除栈顶
return 1;
}
3-6
中国科大《数据结构》
3.1 栈
5. 判断栈空、栈满 int IsSqstackEmpty(SQSTACK S) { //如果栈空,则返回1,否则返回0
return S.top==-1; //top是栈顶标识,是-1时表示空栈 }
中国科大《数据结构》
3-15
3.2 栈的应用举例
递归问题的非递归算法设计中栈的作用 保存暂时不能求解的问题,等待条件具备时,再将问题出栈进
行求解。被保存的问题,通常是递归分解的结果。
中国科大《数据结构》
3-16
3.2 栈的应用举例
int Fibonacci(int n) /*非递归算法*/ { SQSTACK s;
斐波那契问题非递归算法 首先将问题Fibo(n)入栈。 接着进入一个循环:弹出栈顶问题,如果是递归终点,则求值累加; 否则将Fibo(n)递归分解为Fibo(n-1)和Fibo(n-2),并将它们分别入栈, 直到栈空为止。
适用条件 由P(n)递归分解产生两个问题规模更小的问题P(n1)和P(n2),它们的求解 相互独立,相互之间不构成求解条件。
第3章 栈实用数据结构基础(第三版)陈元春---中国铁道出版社
第3章栈一.判断题答案二.填空题答案(1)栈顶(2)栈空(3)O(1) (4)O(1)(5)栈(6)栈空(7)p->next=top;(8)++ (或= S->top+1)(9)LS->next (10)栈顶元素(11)头(12)栈是否满(13)栈是否空(14)链(15)LS->next=NULL (16)首(17)相同(18)B(19)ABC/+DE*- (20)C三.选择题答案四.答案(1)①IIIOOOIOIO ②IOIIOOIIOO(2)求后缀表达式答案①A B ^ C ^ D /②0 A– B C * + D E / +③A B C + * D * E -④A B + C * E F G H / + / - D -⑤8 5 2 + / 6 -(3)stac k (分析见典型习题分析【例10】)五.算法设计题答案(1)分析:用一整型变量top表示栈顶指针,top为0时表示栈为空。
栈中元素从S [1]开始存放元素。
①【入栈程序代码】void push (char x){ if ((top+M)>MAXLEN-1)printf (―堆栈溢出!‖);else{ if (top= =0){ top++;S [top]=x;}else{ top=top+M;S [top]=x;}}}②【出栈程序代码】void pop (char x){ if (top= =0)printf (―堆栈为空栈!‖);else{ if (top= =1){ x= S [top];top––;}else{ x= S [top];top=top–M;}}}(2)分析:设表达式在字符数组a[ ]中,使用一堆栈S来帮助判断。
【程序代码】int correct (char a[ ]){stack s ;InitStack (s); // 调用初始化栈函数for (i=0; i <strlen(a);i++)if (a[i]= =’(’)Push (s,’(’);else if (a[i]= =’)’){if SEmpty (s) // SEmpty (s)为判栈空函数return 0; // 若栈为空返回0;否则出栈elsePop(s);}if (SEmpty (s) )printf (―配对正确!‖); //若栈空,说明配对正确,并返回1elseprintf (―配对错误!‖); // 配对错误返回0 }(3)【程序代码】#include<stdio.h>#include<stdlib.h>typedef struct stacknode // 栈的存储结构{int data;struct stacknode *next;}stacknode;typedef struct{stacknode *top; // 指向栈的指针}linkstack;void Conversion(int n) // 二——十六进制转换函数{linkstack s;int x;s.top=NULL;do{x=n%16;n=n/16;stacknode *p;p=new (stacknode);p->next=s.top;s.top=p;s.top->data=x;}while(n);printf("\n\t\t 转换以后的16进制数值为:");while(s.top){ if (s.top->data<10)printf("%d",s.top->data);elseswitch (s.top->data){ case 10: printf("%c",'A');break;case 11: printf("%c",'B');break;case 12: printf("%c",'C');break;case 13: printf("%c",'D');break;case 14: printf("%c",'E');break;case 15: printf("%c",'F');break;}stacknode* p=s.top;s.top=s.top->next;free(p);}printf("\n\n");}void main(){int n;printf("\n\t\t 请输入一个10进制正整数:");scanf("%d",&n);Conversion(n);}。
3-2栈(《数据结构——从概念到C实现(第2版)》王红梅 清华大学出版社)
3-2 栈
讲什么?
栈的定义及操作特性 栈的抽象数据类型定义 顺序栈的存储结构定义 顺序栈的实现 链栈的存储结构定义 链栈的实现
数 据 结 构 ( 从 概 念 到 实 现 ) 清 华 大 学 出 版 社
Page 2
栈的定义
栈:限定仅在一端进行插入和删除操作的线性表
(a1, …, an-1, an)
数
据
结
构
(
c
情况一
从 概 念 到 实
出栈:c b a
现 )
b
清 华 大
学
出
版
a
社
栈只是对插入和删除操作的位置进行了限制
并没有限定插入和删除操作进行的时间
Page 5
栈的操作特性
例:有三个元素按a、b、c的次序依次进栈,且每个元素只允许进一次栈, 则可能的出栈序列有多少种?
数
据
结
构
(
情况二
从 概 念
到 实 现
输出:如果插入成功,栈顶增加了一个元素;否则返回失败信息
) 清
华
大
学
出
插入操作是否成功
版 社
操作接口: int Push(SeqStack *S, DataType x)
Page 13
顺序栈的实现——入栈
012
…
abc x
StackSize-1
int Push(SeqStack *S, DataType x)
GetTop 输入:无 功能:读取当前的栈顶元素 输出:若栈不空,返回当前的栈顶元素值;否则返回失败信息
Empty 输入:无 功能:判断栈是否为空 输出:如果栈为空,返回1;否则,返回0
陈嫒算法与数据结构第三版课后答案
陈嫒算法与数据结构第三版课后答案1.题目:给定一个数组,其中只有一个元素只出现一次,其他元素均出现两次,请找出这个只出现一次的元素。
答案:使用位运算的异或运算:1. 令res = 0;2. 遍历数组中的每个元素,res = res^arr[i];3. 最终得到的res就是只出现一次的元素。
2.题目:求解一个给定数组的最大子数组和。
答案:1. 令sum = 0, maxSum = arr[0];2. 遍历数组,sum += arr[i];3. 如果sum > maxSum,则maxSum = sum;4. 如果sum < 0,则sum = 0;5. 最终得到的maxSum就是最大子数组和。
3.题目:给定一个字符串,求出该字符串的最长回文子串的长度。
答案:使用动态规划:1. 创建一个二维数组,dp[i][j]表示从字符串的i位置到j位置的最长回文子串的长度;2. 当i==j时,dp[i][j] = 1;3. 当str[i] == str[j]时,dp[i][j] = dp[i+1][j-1] + 2;4. 当str[i] != str[j]时,dp[i][j] = max(dp[i+1][j],dp[i][j-1]);5. 最终得到的dp[0][str.length-1]就是字符串的最长回文子串的长度。
4.题目:设有一个数组[1,2,3,4,5],请实现该数组的全排列。
答案:使用递归:转换成字符串:2. 令str1 = str[0];3. 令str2 = str.substring(1),即str2 = "2345";。
第6章 图3-算法与数据结构(第三版)-陈媛-清华大学出版社
12
PRIM算法
✓ 初始为任意一个顶点,置初始候选蓝边集 ✓ While(T中顶点数目<n) ✓{
✓ 从候选蓝边集合中选取最短蓝边(u,v); ✓ 将边(u,v)及结点涂成红色,扩充到T中; ✓ 调整候选蓝边集; ✓}
13
PRIM算法数据结构
✓ int dist[n][n]; //网络的邻接矩阵
✓ typedef struct ✓{
✓ int from,end; //边的起点和终点 ✓ int length; //边的权值 ✓ }edge; //边结构
✓ edge T[n-1]; //图的生成树
14
15
最小生成树——克鲁斯卡尔(Kruskal)算法
✓ 算法 ✓ 设连通网N={V,E}, ✓ 令最小生成树的初始状态为 ✓ 有n个顶点,无边的非连通图T=(V,Φ) ✓ 图中每一个顶点自成一个连通分量 ✓ 在E中选择权最小的边 ✓ 若此边依附的顶点落在T的不同的连通分量上,则将此边加入 到T中 ✓ 该边的加入将使两个连通分量合成一个连通分量 ✓ 否则该边的加入必然出现回路,所以舍去此边,选择下一条 代价最小的边 ✓ 依此类推,直到T 中所有顶点在同一连通分量上
✓ n个城市间建立通信网,只需n-1条线路 ✓ 如何在可能的线路中选择n-1条边,把所有城
市连起来,且总耗费(各边权值之和)最小 ✓ 找图中的最小生成树
8
PRIM算法
✓ 贪心法 ✓ 旅行推销员(TSP)问题
✓ 推销员从其中某一城市出发,唯一走遍n个城市, 再回到出发的城市,求最短的路线
✓ 在带权无向完全图中,访问每个顶点恰好一次、并且返 回出发点、总权数最小的回路
(d)
17
练习题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
✓栈 ✓ 栈的存储结构及应用 ✓ 队列 ✓ 队列的存储结构及应用
1
栈的基本概念
定 义 只能在表的一端进行插入和删除的线性表 逻辑结构 数据元素之间是一对一的关系 存储结构 顺序存储或链式存储
运算规则
只能在栈顶运算,且访问结点时依照后进先 出(LIFO)或先进后出(FILO)的原则
基本操作 建栈、判断栈满或栈空、入栈、出栈、 取栈顶元素值
35 17 8
4 2 1 0
余数 结果:11
1 1 0 0 1
5
将带头结点的单链表(a1,a2,…,an)逆置
6
栈的顺序存储结构(顺序栈)
✓ 顺序栈:利用一组地址连续的存储单元依次存放从
栈底到栈顶的数据元素
顺序栈S 栈顶top
✓C语言中
n
✓预设较大的数组空间
✓栈底设为0
✓栈顶随插入和删除元
2
栈的示意图
插入和删除都只在表的一端(栈顶)进行
栈 S= (a1 , a2 , a3 , ……….,an-1 , an )
栈底元素
栈顶元素
✓栈是仅在表尾进行插入、删除操作的线性表 ✓表尾(即 an 端)称为栈顶 (top) ✓表头(即 a1 端)称为栈底(bottom) ✓插入元素到栈顶的操作,称为入栈 ✓从栈顶删除元素的操作,称为出栈
✓ 对每种运算符赋于一个优
遵循先乘除后加减、先
先数,如:
左后右及先括号内,后 ✓ 运算符: * / + - #
括号外的四则运算法则, ✓ 优先数: 2 2 1 1 0
其计算顺序应为:
✓ 其中 # 是表达式结束符
1+2*4-9/3 └─┘ └┘ ①②
└─┘ ③
✓ 对表达式求值时,一般设 立两个栈
✓ 运算符栈(OPTR) ✓ 操作数栈(OPND)
✓ 求栈深函数
✓ int size_sqstack(sqstacktp *s);
✓ 读栈顶元函数
✓ elemtype top_sqstack(sqstacktp *s);
10
栈的链式存储结构
✓ 定义 ✓ 栈的链式存储结构,简称链栈 ✓ 组织形式与单链表类似,链表的尾部是栈底 ,链表的头部是栈顶
11
3
栈的基本操作
✓ INISTACK(S):初始化操作。设置一个空栈S。 ✓ EMPTY(S):判栈空函数。若S为空栈,函数值为1,否则为0 ✓ SIZE(S):求栈深函数。函数值为栈中当前的元素个数。 ✓ TOP(S):读栈顶元函数。若栈S不空,函数值为栈顶元素,否
则为空元素NULL。 ✓ PUSH(S,x):进栈操作。将元素x插入栈S中,使x成为栈S的
6
#+*
124
8
顺序栈的几种情况
设MAXSIZE=6 top
栈满
栈空
top
5 top 4 top
top F5
top E4
F5 E4
3 top
top D3
D3
top
2
top C2
C2
1 top
top
0 top
栈空
B1
A0
进栈
top
B1
top
A0
出栈
栈顶指针top,可初始 化为0,指向实际栈 顶后的空位置.
设数组大小为MAXSIZE s->top==0,栈空,此时出栈则下溢 s->top== MAXSIZE,栈满,此时入栈上溢
an ……
ai
素而变化
✓用一个整型变量top来
指示栈顶的位置
0
…… a2 a1
栈底
压入(PUSH): S[top++]=an+1 弹出( POP) : e=S[--top]
7
顺序栈存储结构的描述
✓ #define MAXSIZE 100 ✓ typedef int elemtype; ✓ typedef struct stack ✓{ ✓ elemtype elem[MAXSIZE]; ✓ int top; //栈顶指针 ✓ }sqstacktp; //顺序栈类型定义 ✓ sqstacktp *s; //s为顺序栈类型变量的指针 ✓ s=(sqstacktp *)malloc(sizeof(sqstacktp));
✓ void push_linkstack(linkstack *ls,elemtype x);
✓ 出栈操作
✓ elemtype pop_linkstack(linkstack *ls);
13
栈的应用实例—表达式求值 ?扩展:多位数、()
对算术表达式求值:
✓ 采用“运算符优先数法”
1+2*4-9/3
栈顶元素。 ✓ POP(S):出栈函数。若栈S不空,函数值为栈顶元素,且从栈
中删除当前栈顶元素,否则函数值为空元素NULL。 ✓ CLEAR(S):栈置空操作。不论栈S是否为空栈,将S置为空栈
4
✓ 十进制数转换成二进制数 ✓ 把所有的余数按出现的逆序排列起来(先出现
的余数排在后面,后出现的余数排在前面),十 进制数35转换成二进制数
}linkstack;
✓ linkstack *ls;
A NULL 栈底
✓ ls=(linkstack *)malloc(sizeof(linkstack));
✓ ls->top=?
12
链栈上实现的操作
✓ 初始化操作
✓ void init_linkstack(linkstack *ls);
✓ 进栈操作
9
顺序栈上实现的操作
✓ 初始化(栈置空)操作
✓ void ini_sqstack(sqstacktp *s);
✓ 判栈空函数
✓ int empty_sqstack(sqstacktp *s);
✓ 进栈操作
✓ void push_sqstack(sqstacktp *s,elemtype x);
✓ 出栈函数 ✓ elemtype pop_sqstack(sqstacktp *s) ;
└───┘ ④
✓ 分别存放表达式中的运算 符和操作数
14
利用算法对算术表达式求值的操作过程
步骤 OPTR栈 OPND栈 输入字符
──────────────────────────
1
#
1+2*4-9/3#
2
#
1
+2*4-9/3#
3
#+
1
2*4-9/3#
4
#+
12
*4-9/3#
5
#+*
12
4-9/3#
栈的链式存储结构
✓ 链栈的类型定义: ✓ typedef struct stacknode
data next
top
F
栈顶
✓ { elemtype data;
✓ struct stacknode *next;
E
✓ }stacknode;
D
✓ typedef struct
✓ { stacknode *top; //栈顶指针