数据结构ch4

合集下载

ch4 顺序程序设计llh

ch4 顺序程序设计llh

A
直到P为假
直到型循环
13
用三种N--S流程图中的基本框,可以组成复 杂的N--S流程图。图中的A框或B框,可以是一 个简单的操作,也可以是三个基本结构之一。
A框可以是一个选择结构
B框可以是一个循环结构
14
五、顺序结构程序的基本操作
(1)如何在程序中给变量赋值?
– 赋值表达式 – 赋值表达式语句 – Total = m * pow(1+r, n);
–说明
• 格式字符要用小写 • 格式字符与输出项个数应相同,按先后顺序一一对应
27
附加格式说明符(修饰符): 修饰符 功 能 m 输出数据域宽,数据长度<m,左补空格;否则按实际输出 .n + 0 # l 对实数,指定小数点后位数(四舍五入) 对字符串,指定实际输出位数 输出数据在域内左对齐(缺省右对齐) 指定在有符号数的正数前显示正号(+) 输出数值时指定左面不使用的空位置自动填0 在八进制和十六进制数前显示前导0,0x
2
二、算法的分类
• 数值运算算法:
–解决的是求数值解的问题,例如用辗转 相除法求两个数的最大公约数等
• 非数值运算算法:
–主要用于解决需要用分析推理、逻辑推 理才能解决的问题,例如人工智能中的 许多问题,查找、分类等问题
3
三、算法的表示方法
• • • • 自然语言表示 传统的流程图表示 N-S结构化流程图表示 伪代码表示
开始/结束框
一般处理框
判断决策框 输入输出数据框 流程线
输入rate, capital,n
计算deposit
输出 deposit 结束
7
1、顺序结构
A
A
B

武汉理工数据结构ch4

武汉理工数据结构ch4
武汉理工大学
串中任意个连续字符组成的子序列称为该串的子串, 串中任意个连续字符组成的子序列称为该串的子串,包含子 子串 串的串相应地称为主串 主串。 串的串相应地称为主串。通常将子串在主串中首次出现时的 该子串的首字符对应的主串中的序号, 该子串的首字符对应的主串中的序号,定义为子串在主串中 位置。例如, 的位置。例如,设A和B分别为 A=“This string” B=“is is” A= This is a string B= is 的子串, 为主串。 中出现了两次, 则B是A的子串,A为主串。B在A中出现了两次,其中首次出 现所对应的主串位置是3 因此, 中的序号(或位置) 现所对应的主串位置是3。因此,称B在A中的序号(或位置) 为3。 特别地,空串是任意串的子串,任意串是其自身的子串。 特别地,空串是任意串的子串,任意串是其自身的子串。 两个串相等的 当且仅当这两个串的值相等。 称两个串相等的,当且仅当这两个串的值相等。即只有当 两个串的长度相等,且各个对应位置的字符相等时才相等。 两个串的长度相等,且各个对应位置的字符相等时才相等。
武汉理工大学
通常在程序中使用的串可分为两种:串变量和串常量。 通常在程序中使用的串可分为两种:串变量和串常量。 串常量和整常数、实常数一样,在程序中只能被引用但 串常量和整常数、实常数一样, 不能改变其值,即只能读不能写。 不能改变其值,即只能读不能写。通常串常量是由直接 量来表示的,例如语句Error( overflow”) Erro,例如语句Error( overflow )中“overflow 是直接量。但有的语言允许对串常量命名, 是直接量。但有的语言允许对串常量命名,以使程序易 易写。 C++中 读、易写。如C++中,可定义 path[]=“dir/bin/appl dir/bin/appl”; const char path[]= dir/bin/appl ; 这里path是一个串常量,对它只能读不能写。 path是一个串常量 这里path是一个串常量,对它只能读不能写。串变 量和其它类型的变量一样, 量和其它类型的变量一样,其取值是可以改变的

甲烷的模型搭建原理

甲烷的模型搭建原理

甲烷的模型搭建原理
甲烷的模型搭建原理主要基于两个原则:分子结构和化学键。

1. 分子结构:甲烷(CH4)是由一个碳原子和四个氢原子组成的分子。

碳原子中心由4个单价电子,氢原子由1个单价电子,因此碳原子与四个氢原子形成共价键,并且该共价键呈四面体构型。

2. 化学键:甲烷中的碳-氢键属于共价键,共用了一个电子对。

在模型搭建中,可以使用棍球模型或者空间填充模型来表示分子中的原子和化学键。

基于以上原理,可以按照以下步骤进行甲烷模型的搭建:
1. 准备棍球模型或者空间填充模型所需的零件,包括碳原子和氢原子的球形模型和棍子模型。

2. 将一个碳原子放置在模型的中心位置。

3. 将四个氢原子分别连接到碳原子周围的四个空位,使用棍子模型连接碳原子和氢原子,形成化学键。

4. 确保四个氢原子朝向碳原子的四个空位,呈四面体构型。

5. 根据需要,可以对模型进行调整和修正,使得分子模型更加准确和稳定。

通过上述步骤,就可以搭建出甲烷分子的模型。

这种模型可以帮助我们更好地理解甲烷分子的结构和化学键,并在学习和研究中起到重要的作用。

ch4 类的高级特性

ch4 类的高级特性
17
接口
• 允许一个类从几个接口继承而来。 • Java 程序一次只能继承一个类但可以实现 几个接口。 • 接口不能有任何具体的方法。 • 接口也可用来定义可由类使用的一组常量。
18
创建接口的步骤2-1
• 定义一个接口:
Public或者默认 无方法体,本质 // 有方法的接口 public interface myinterface { 上是抽象方法 public void add(int x, int y); public void volume(int x,int y, int z); } 接口为public,则成员默认都为public // 定义程序使用的常量的接口 public interface myconstants { public static final double price = 1450.00; public static final int counter = 5; } 不写默认(不能被实现类修改),必须初始化
6
静态块
• 如果需要通过计算来初始化静态变量,可以 声明一个静态块。 • 静态块仅在该类被加载时执行一次。 • 只能初始化类的静态数据成员。
class TryInitialization { static int[] values = new int[10]; //静态数组成员 static { for(int i=0; i<values.length; i++) values[i] = (int)(100.0*Math.random()); } }
特性公用于任何类。
23
缺省访问权限/protected 访问修饰符
• 缺省的成员可以被同一包中的其他类访问。 • protected 访问修饰符允许类本身、同一包 中的所有类和不同包中的子类访问 。 • 如果希望一个成员在当前包外可见,但仅 仅是成员所在类的子类直接可见,就要使 用 protected 修饰该成员。

ch4-虚拟内存

ch4-虚拟内存

Registers
Speed (ns): 1ns
100ns
10ms
Size (bytes): 100s
Ms
Gs
请求调页时的有效访问时间
100(1-p)+10000000p= 100+9999900p 110
p<0.000001
有效访问时间=(1-p)ma+p调页时间 缺页率(页错误率)应该很小: 1/105
运行进程页表基址
③命中
物理地址
内存(系统 区)运行进 程页表
④不命中
⑤页表命中
页框 页内地址
内存(用户区)
运行进 程映象
③ ⑤
访 问
⑨装入 、改表
⑧调页
⑦发缺页中断 缺页中断处理
请求分页虚存地址转换过程(2)
在外存
无登记
逻辑地址
有登记 查快表
在内存 查页表
形成绝对地址
发缺页中断
登记入快表
继续执行指令 硬件
Ref: A B C A B D A D B C B
Page:
1A
C
2
B
3
C
D
本实例,OPT导致5次缺页 可惜,OPT需要知道将来发生的事… 怎么办?
LRU页面置换
用过去的历史预测将来。LRU算法: 选最近最长 一段时间没有使用的页淘汰(最近最少使用)。
继续上面的实例: (3frame)A B C A B D A D B C B
R=1 R=1 R=1
R=0
R=0
R=0
R=1
R=1
R=1
R=0 R=0 R=1
R=0 R=1 R=1
R=0
R=0

Ch4数组

Ch4数组

Ch4 数组主要学习内容:一维数组、二维数组和多维数组的定义、元素的引用方法,字符型数组及字符串的处理方法。

自测题:一、选择题1.下列说明中错误的是( )A.int a[2] […A‟];B.int a[2][l0/2.0];C.int a[2][2*5];D.int a[2][100 + 1];2.关于数组的定义,下列说明中错误的是( )A.int a[6][6];B.int i,a[i][i];C.int a[2*3][6];D.int a[1 + 5][6];3.关于一维数组的初始化,下列错误的是( )A.int a[5]={1,2,3,4,5};B.int a[]={1,2,3,4,5};C.int a[5]=1,2,3,4,5;D.int a[5]=(1,2};4.初始化一维数组a正确的语句是( )A.int a[10]=(0,0,0,0,0);B.int a[10]={ };C.int a[]=(10);D.int a[10]={[l0*1]};5.数组int a[20];的最后一个元素的引用形式为( )A.a[20] B.a(20) C.a(19) D.a[19]6.关于二维数组的初始化,下列错误的是( )A.int a[3][3]={1,2,3,4,5,6,7,8,9};B.int a[][3]={1,2,3,4,5,6,7,8,9};C.int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};D.int a[][]={1,2,3,4,5,6,7,8,9};7.关于二级数组有说明:int a[3][3]={{1},{2},{3}};则值为2的元素的下标是()A .0,1 B.2,1 C.1,0 D.1,18.设有说明:int a[2][3]={1,2,3,4};则表达式a[1][1]的值是( )A.1 B.2 C.4 D.09.设有说明:int a[3][3]={1,2,3,4};则表达式a[2][1]的值是( )A.3 B.4 C.0 D.无值10.在二维数组int[a][3]={1,2,3,4,5,6,7,8,9};中a[1][2]的值为( )A.2 B.5 C.6 D.311.合法的数组定义是( )A.int a[]={“good”};B.int a[5]={1,2,3,4,5,6};C.char a=“good”;D.char a[ ]=(“good”};12.数组int a[10];的最后一个元素的引用形式为( )A.a[9] B.a(9) C.a(9) D.a[9]13.设char strl[10]=“ABCDE”,,str2[10]=“XYZ”;则执行语句:printf(“%d”,strlen(strcpy(str1,str2)));后的输出是( )A.3 B.5 C.8 D.914.下列说明中正确的是( )A.char s[1][3]={“A”,”XY”};B.char[][]={‘A’,‘B’,‘C’};C.int a[][]={1,2,3,4};D.a[5]={1,2,3,4,5,0}15.设有说明int a[10]={10,11,12,13};则下列表达式中值不为11的是( )A.a[0] + + B.a[1] C.a[2] D.a[3-1]-116.设有说明int a[10]={10,11,12};若每个int型数据在内存中占2字节,则数组a的元素个数和a的长度分别为( )A.3,6 B.10,6 C.10,20 D.3,2017.设有说明int a[][3]={{10,20},{30,40,50}};则a[0][2]+a[1][2]的值是( )A.30 B.40 C.50 D.6018.设有说明int a[][3]={{10,20},{30,40,50},{60}};则a[1][1]+a[2][1]的值是( ) A.30 B.40 C.50 D.60二、填空题1.设有说明char s[]=“ABC”,t[]={‘A’,‘B’,‘C’};则s长度为( )字节;t 长度为( )字节。

ch4

ch4

8+7+6+5+4+3+2+1=36
二、串的ADT描述
三、串的ADT应用举例
例1、利用判断串相等、求串长度,求子串操作实现定位操作。
1 2 3 4 5
s
t
例1、利用判断串相等、求串长度,求子串操作实现定位操作。
//T为非空串,若主串S中第pos 个字符之后存在与T相等的子串, //则返回第一个这样的子串在S中的位置
Y ++i; ++j; next[i]=j; j=next[j];
§4.3.2 串的模式匹配KMP算法
第四章

王瑜
本章内容提要
1、理解串的定义及逻辑结构 2、理解串的存储结构及操作的虚拟实现 3、理解串的模式匹配算法
§4.1 串类型的定义
本章学习另一种特殊的线性表,它特殊在:
1、数据元素都来自字符集! 例如:操作对象一般是子串(即一组数据元素)而不 是单个数据元素!
有些高级语言已经把串ADT物理实现了,所以,我们这里只
第二趟匹配
a b a b c a b c a c b a b a
第三趟匹配
a b a b c a b c a c b a b a b c a c
§4.3.1 串的模式匹配BF算法
第四趟匹配
a b a b c a b c a c b a b
a BF算法若不匹配时,主 a b a b c a b c a c b a b 串回到上一次起始的下 一位置,模式串回到起 a 始的第一个字符! a b a b c a b c a c b a b a b c a c
abcdefa
adefa i<=3

数据结构ch4作业

数据结构ch4作业

第四章习题4.3如果已知一棵二叉树有20个叶子结点,有10个结点仅有左孩子,15个结点仅有右孩子,求出该二叉树的结点数目。

解:设结点总数为n ,叶子数n 0,1度节点数n 1,2度节点数n 2。

由题意得:n 0=20 n 1=10+15=25有由二叉树性质得:n 2=n 0-1=20-1=19所以,总结点数 n= n 0+ n 1+ n 2=20+25+19=644.10证明:由二叉树的先序序列和中序序列能唯一确定一棵二叉树,并分别由下面的两个序列构造出相应的二叉树:①先序:ABCDEFGHI ②先序:ABCDEFGHIJ 中序:ADECFBGIH 中序:BDECAGIJHF 解:4.12已知一棵二叉树的先序、中序和后序序列如下,其中各有一部分未给出其值,请构造出该二叉树。

先序:A B C D E F G H I J中序:C B E D A H G F I J后序:C E D B H G J I F A4.17解:算法如下://先序遍历查找结点 x ,打印到根节点路径void BiTreeSearchNR(BiNode* pBT, elementType x, BiNode* &pR) {① 对应二叉树② 对应二叉树BiNode* p;seqStack S;int tag[MaxLen]; //标记左子树、右子树initStack(S); //初始化栈p=pBT;while(p || !stackEmpty(S)){if(p) //p!=NULL{pushStack(S, p); //当前根节点指针p 入栈tag[S.top]=0; //标记遍历左子树//判定p是否目标结点if(p->data==x){//返回p指针pR=p;while(!stackEmpty(S)) //找到目标结点,打印到根节点的路径{popStack(S,p);cout<<p->data<<", ";}break; //退出循环}elsep=p->lChild; //遍历左子树}else //p==NULL 但是栈不空{stackTop(S, p); //取栈顶,但不退栈,以便遍历p的右子树if(tag[S.top]==0) //说明p 的右子树尚未遍历,设置标记,遍历右子树{tag[S.top]=1;p=p->rChild;}else //tag[S.top]==1,说明栈顶结点p的左右子树都已经遍历,且没有找到目标,p直接弹出{popStack(S, p);p=NULL; //上面出栈的p已经没有,回去循环取栈顶的下一个元素}}}}4.24 将下图中的森林转换为对应的二叉树。

ch4堆栈及其应用(阅读)

ch4堆栈及其应用(阅读)
符型等)、或是结构类型的数据元素。
栈中元素ai-1是ai的唯一直接前驱,ai+1是ai的唯一直
接后继;而栈底元素a1无前驱,栈顶元素an无后继。 因此,栈属于线性逻辑结构。 。
5
栈的特点
☞ 根据栈的定义可知,最先放入栈中元素在栈底, 最后放入的元素在栈顶,而删除元素刚好相反,最后 放入的元素最先删除,最先放入的元素最后删除。
10
4.2 顺序栈及其基本算法
☞4.2.1 顺序栈概念及数据类型
4.2.2 顺序栈的基本算法
11
♣ 顺序栈概念 ☞用地址连续的存储空间依次存储栈中数据元素,并 记录当前栈顶数据元素的位置,这样的栈称为顺序栈。 ☞ 可用数组来实现顺序栈。 因为栈底位置是固定不变的,所以可以将栈底位置 设置在数组的一端;栈顶位置是随着进栈和退栈操作而 变化的,故需用一个整型变量top来指示当前栈顶的位 置,通常称top为栈顶指针。
}SeqStack;
13
栈顶top 的值为栈顶元素下标。
栈满 5 4 3 2 1 top=-1 栈空 0 top top top F E D C B A 进栈
栈空
top top top top top top top
5
4 3 2 1 0
F E D C
B A 出栈
5 4 3
top top top
2 1 0
else return 1;//栈空时返回1,不空返回0
栈顶指针top,指向实际栈顶 后的空位置,初值为-1
设数组长度为M top=-1,栈空,此时出栈,则下溢(underflow) top=M-1,栈满,此时入栈,则上溢(overflow)
14
☞ 设S是SeqStack类型的指针变量。则s–>data[0]是 栈底元素。

CH4习题参考答案

CH4习题参考答案

习题4解答判断题:1.空串是由空白字符组成的串( FALSE )2. 串的定长顺序结构是用一组地址连续的存储单元存储串值的字符序列,按照预定义的大小,为每个定义的串变量分配一个固定长度的存储区。

(TRUE )3.串的堆分配存储表示是用一组地址连续的存储单元存储串值的字符序列,但它们的存储空间是在程序执行过程中动态分配得到的。

(TRUE )4.串中StrInsert(&S,pos,T)基本操作是最小的操作子集(FALSE)5.串是由有限个字符构成的连续序列,串长度为串中字符的个数,子串是主串中字符构成的有限序列。

(FALSE)(错:子串是主串中连续的字符构成的有限序列)(题源:胡元义,C版数据结构课程辅导与习题解析,p80,4.2.1(判断题)_1)6.如果一个串中的所有字符均在另一串中出现,那么则说明前者是后者的子串。

(FALSE)( 错:是否连续是关键)(题源:陈明,C版实用数据结构基础,p109,(判断题)_2)7.串类型的最小操作子集不能利用其他串操作来实现,反之,其他串操作均可在最小操作子集上实现。

(TRUE)(题源:根据教材p72自编)单项选择题:8.下列那些为空串()A)S=“” B)S=“”C)S=“φ” D)S=“θ”答案:B9.S1=“ABCD”,S2=“CD”则S2在S3中的位置是()A)1 B)2C)3 D)4答案:C10.假设S=“abcaabcaaabca”,T=“bca”,Index (S,T,3) 的结果是()A)2 B)6 C)11 D)0答案:B11.在串中,对于SubString(&Sub,S,pos,len)基本操作,pos和len的约束条件是()A)0<pos<StrLength(S)+1且1<=len<=StrLength(S)-pos+1B)0<pos<StrLength(S)+1且0<=len<=StrLength(S)-pos-1C)1<=pos<=StrLength(S) 且0<=len<=StrLength(S)-pos+1D)1<=pos<=StrLength(S) 且1<=len<=StrLength(S)-pos-1答案:C12. 串是一种特殊的线性表,其特殊性体现在( )。

Ch4控制系统结构与程序管理

Ch4控制系统结构与程序管理
*
双机集中控制
双机系统: 主备用方式 冷备用 热备用或同步工作方式 负荷分担式
*
双机集中控制-主备用
主处理机负责整个交换机呼叫处理和资源管理,故障时倒换到备用机。结构简单,但倒换时会丢失当前的呼叫处理和已建立的连接。
处理机都处于工作态,都接收当前的资源状态和呼叫请求,但只一个有效发布控制命令。控制结构较复杂,但一般不会丢失当前的呼叫处理和已建立的连接。
*
双机集中控制-负荷分担
*
分散控制
用于控制的每台处理机只能访问部分资源或控制部分功能。 按照其在管理任务中的关系,又可分为单级多机系统和多级多机系统和分布式控制。
*
单级多机控制方式
*
多级多机处理机系统
*
分布式控制
分布式控制 每个功能板均配置单片机和处理程序,构成完整的基础模块,通过相互通信对消息加工,协调完成所承担的功能或作用。 结构类似单级多机系统。 优点 标准组件化,设计和编程规整,易组成更大容量、更复杂功能系统; 方便引入新技术、新元件,系统持续发展性好; 可靠性高,故障只影响局部。
*
4.2.1 呼叫处理能力分析
BHCA(忙时试呼次数)计算公式 系统开销:处理机时间资源的占用率 固有开销:与呼叫处理次数(话务量)无关的系统开销 非固有开销:与呼叫处理次数有关的系统开销。 单位时间内处理机用于呼叫处理的时间开销为: t=a+bN t:系统开销 a:固有开销 b:处理一次呼叫的平均开销(非固有开销) N:单位时间内所处理的呼叫总数,即处理能力值(BHCA)
*
程序的级别划分和调度
交换机程序的特点是并发性和实时性强,存在多道被激活的作业,须在规定时间内作出响应。 调度程序,根据实时性要求将各处理程序划分为不同的优先级,并按其高低顺序调度相关程序在处理机上执行。 控制程序通常按任务紧急性和实时性的要求不同划分为故障级、时钟级和基本级三个等级。

ch4

ch4

4.2.1 继承方式
继承语法形式
class B {……}; class D : [private | protected | public] B { …… };
4.2.2 公有继承 公有继承
public
– 最常见的派生方式 – 维持基类成员的可访问性 – 派生类不可直接访问基类的private成员,可 通过基类的共有成员函数访问
class C { public: C() { cout<<"Constructing C"<<endl;} ~C(){ cout<<"Destructing C"<<endl;} B b; A a; };
Constructing B Constructing A Constructing C Destructing C Destructing A Destructing B
class derived:private base{ int y; public: 接口 void sety(int n){y=n; } Setx() void sety(){ base Getx() y=getx(); } Showx() void showy() { cout<<y<<endl; } derived };
例题ch4_1.cpp
class base{ int x; public: void setx(int n){ x=n; int getx(){ return x; } void showx() { cout<<x<<endl; } }; class derived:public base{ int y; public: void sety(int n){ y=n; void sety(){ y=getx(); } void showy() { cout<<y<<endl; } };

解释CH4分子空间构型

解释CH4分子空间构型

解释CH4分子空间构型前几天,我们学了分子的空间构型,但是我有一个疑问,这些空间构型哪来的? CH4的结构比较复杂,不像苯和甲烷那么简单。

下面就由我来给大家解释解释。

首先,我们要明白物质都是由原子构成的,原子再由原子核、核外电子、核外电子构成。

这三种东西都叫元素。

我们生活中见到的各种元素按性质分成金属元素、非金属元素和稀有气体元素三大类。

化合物又可以分为单质和化合物两大类。

其中的一类叫做非金属元素,另一类是金属元素。

通过查资料,得知,原子结构由四部分组成:质子、中子、核外电子和电子云。

质子是氢原子核,中子是带正电荷的质子。

带正电荷是因为它在强力的作用下相互吸引,形成稳定结构,很难破坏。

原子核内中子数和质子数相等,即氢原子是质子数等于中子数的稳定结构,是由中子和质子组成的。

核外电子是最外层的电子,他受到核的吸引力而紧靠着核,但核与电子之间的距离极小,以至于原子核与核外电子都可能对它产生吸引力,也就是说原子核的吸引力很大,所以有的原子核能够被电子穿透,而原子则失去了电子。

质子数等于中子数的元素原子,叫做“氢原子”。

质子数与中子数相同的元素原子叫做“氦原子”。

但在中子数或者质子数和电子数之和,大于8的元素里,每一个质子和中子都可以有一个电子参加成键,但两个质子之间,一个中子和一个电子之间只能形成两个共价键。

但在中子数或者质子数和电子数之和,小于8的元素里,质子和中子只能各有一个电子,不能形成共价键。

核外电子受到核的吸引力而围绕核运动,如果外电子数超过核内电子数,电子就会越轨道,超出核的势力范围,自己建造轨道。

所以核外电子超过核内电子的数量称为“核电荷数”。

物质在形成后都会发生变化,其中的一种变化是氧原子的失去一个电子,结果就是二氧化碳。

在同位素原子中,核电荷数最多的元素是氧。

二氧化碳是不是唯一的同位素呢?不是,在核电荷数和质子数和电子数之和,等于8的元素里,质子和中子各有一个电子,其他元素的同位素,每一个质子和中子各有一个电子。

ch4 串(梁)概述

ch4   串(梁)概述
17
//以下是运算符重载 friend ostream& operator<<(ostream&,const String& s); friend istream& operator>>(istream&,const String& s); };
源程序
18
//构造函数 String::String() { str = new char[1]; str[0] = '\0'; size = 0; } String::String(int length) { size = length; str = new char[size+1]; for(int i=0;i<size;i++) str[i] = ' '; str[size]='\0'; }
8
9. 模式匹配Index( s, t ) :求子串t在字符 串s中的位置。
简单模式匹配(Brute-Force)
KMP模式匹配
9
复习:C++中的字符串函数
求串的长度 int strlen(const char* str)
串拷贝 char* strcpy(char* str1,const char* str2)
第4章

主讲:梁宝兰
教学要求: 1、掌握:串的基本概念、串的抽象数据类型、 串的2种存储结构,尤其是在顺序存储下的顺 序串类及其基本运算、基于穷举法的BruteForce串的简单模式匹配算法。 2、理解:KMP模式匹配算法。
2
内容提要
串的基本概念 串的抽象数据类型 串的存储结构 顺序存储的顺序串类及其基本运算 串的模式匹配算法

C语言程序ppt课件ch4 选择结构

C语言程序ppt课件ch4 选择结构

功能: 判断表达式的值,若为非0,再判断表达式1的 值,非0执行语句11,否则执行语句12
若表达式的值为0,再判断表达式2的值,非0 执行语句21,否则执行语句22
共 39 页 第 22 页
思考
下列程序段表示的数学式子?
y=-1;
if (x!=0)
{if (x>0) y=2*sin(x);}
else y=0;
main( )
{
char c;
c=getchar( );
if(c= ='+ ') printf(" plus\n "); else if(c= = ' - ') printf(" minus\n ");
else if(c= = ' * ') printf(" multiplication\n ");
第四章
共 39 页 第 1 页
本章要点: • 正确使用关系表达式和逻辑表达式 • 掌握用if语句和switch语句实现选择结构 • 掌握条件运算符的使用
共 39 页 第 2 页
为什么要用选择结构?
根据学生分数判断是否及格 根据学生分数如何进行分级 一元二次方程求解
如何解决?
自然语言:如果… 那么… 否则…
if(x<0) y=-1; elห้องสมุดไป่ตู้e if(x== 0) y=0;
else y=1; printf(“x=%d, y=%d\n”, x, y); }
共 39 页 第 25 页
例4-3从键盘输入一个字符,当该字符是+、 - 、*、/时, 显示对应的英文单词,否则显示Error!。

Ch4程序的控制结构.ppt

Ch4程序的控制结构.ppt

28
猜数游戏用到的库函数
• 随机函数srand
▪ 为函数rand()设置随机数种子来实现对函数rand 所产生的伪随机数的 “随机化”
• 通过键入随机数种子,产生[0,100]之间的随 机数
scanf("%u", &seed); srand(seed); magic = rand() % 100 + 1;
2020/4/9
NEUQ计算机兴趣小组专用教案
7
结构化程序设计的核心思想
• 采用顺序、选择和循环三种基本结构作为程 序设计的基本单元
▪ 只有一个入口; ▪ 只有一个出口; ▪ 无死语句,即不存在永远都执行不到的语句; ▪ 无死循环,即不存在永远都执行不完的循环。
• 采用“自顶向下、逐步求精”和模块化的方 法进行结构化程序设计

A
A

条 件P

2020/4/9
当型循环 直到型循环 NEUQ计算机兴趣小组专用教案
11
循环结构
条 假件P 假

当P为真
A
A
当P为真
2020/4/9
A 当型循环
NEUQ计算机兴趣小组专用教案
12
循环结构
A

条 件P
A
直到P为假

A
直到P为假
直到型循环
2020/4/9
NEUQ计算机兴趣小组专用教案
#include <time.h>
srand(time(NULL));
magic = rand() % 100 + 1;
2020/4/9
NEUQ计算机兴趣小组专用教案
30
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

J 12345678 模式串 a b a a b c a c Next[j] 0 1 1 2 2 3 1 2
如何求Next[j]?
求next函数值的过程是一个递推过程, 已知:next[1] = 0; 假设:next[j] = k; 即 “p1…pk-1”=“pj-k+1…pj-1” 若 pj = pk 则: next[j+1] = k+1=next[k]+1 若: pj pk 则需往前回朔,检查 pj = p?,这实际上也是一 个匹配的过程,不同在于:主串和模式串是 同一个串
在输入程序的同时,文本编辑程序先为文本串建立相应的页表和行表, 即建立各子串的存储映象。串值存放在文本工作区,而将页号和该页 中的起始行号存放在页表中,行号、串值的存储起始地址和串的长度 记录在行表.
下面我们就来讨论文本的编辑。 (1)插入一行时,首先在文本末尾的空闲工作区写入该行的串值,然 后,在行表中建立该行的信息,插入后,必须保证行表中行号从小到 大的顺序。 (2)删除一行时,则只要在行表中删除该行的行号,后面的行号向前 平移。若删除的行是页的起始行,则还要修改相应页的起始行号(改 为下一行)。 (3)修改文本时,在文本编辑程序中设立了页指针,行指针和字符指 针,分别指示当前操作的页、行和字符。若在当前行内插入或删除若 干字符,则要修改行表中当前行的长度。如果该行的长度超出了分配 给它的存储空间,则应为该行重新分配存储空间,同时还要修改该行 的起始位置。 对页表的维护与行表类似,在此不再叙述。
串的动态存储结构 串的各种运算与串的存储结构有着很大的关系,在随机取子串时,顺 序存储方式操作起来比较方便,而对串进行插入、删除等操作时,就 会变得很复杂。因此,有必要采用串的动态存储方式。 串的动态存储方式采用堆存储结构和链式存储结构两种形式:
4.2.2堆存储结构
特点
仍以一组地址连续的存储单元存放串值字符序列,但它们的存 储空间是在程序执行过程中动态分配的。
基本算法(P76-77) 举例:串插入操作 串的堆分配存储结构基本操作
Status StrAssign(HString &T,char* chars);//生成一个值等于串常量chars的串T Int StrLength(HString S);//返回串S的元素个数,称为串的长度 Int StrCompare(HString S,HString T);//若S>T,返回值>0,若S=T,返回值=0,若 S<T,返回值<0 Status ClearString(HString &S);//将S清为空串,并释放S所占空间 Status Concat(HString &T,HString S1,HString H2);//用T返回S1和S2联接成的新串 HString SubString(HString S, int pos, int len);//返回串S的第Pos个字符起长度为len 的子串 //1<=pos<=StrLength(S)&&0<=len<=StrLength(S)-pos+1;
第四章 串的基本概念
4.1 串类型的定义
串(或字符串)(String)是由零个或多个字符组成的有限序列 。一般记作 s=〃a1a2…an〃 (n≥0) 其中:s为串名,用双引号括起来的字符序列是串的值; ai(0≤i≤n)可以是字母、数字或其它字符;双引号为串值的定界符 ,不是串的一部分;串中字符的数目n称为串的长度。 空串——零个字符的串,通常以两个相邻的双引号来表示空串( Null string),如:s=〃〃,它的长度为零; 空格串——仅由空格组成的的串,如:s=〃└┘〃;若串中含有 空 格 , 在 计 算 串 长 时 , 空 格 应 计 入 串 的 长 度 中 , 如 : s=〃I’m a student〃的长度为13。
求子串算法SubString(&Sub,S,pos,len)
Status SubString(SString &Sub,SString S,int pos,int len){ //用Sub返回串的第pos个字符起长度为len的子串,其中 //1<=pos<=StrLength(s)&&0<=len<=StrLength(s)-pos+1
下标为0的分量存放串的实际长度,如:pascal
在串尾加一个不计入串长的结束标记符。如:C中的‘\0‟
串连接算法Concat(&T,S1,S2)
Status Concat(SString &T, SString S1,SString S2){ //用T返回由S1和S2联接而成的新串。若未截断,则返回TRUE,否则FALSE。S[0] //保存串的长度,有三种情况(1)S1[0]+S2[0]<=MAXSTRLEN;(2)S1[0]<MAXSTRLEN //&&S1[0]+S2[0]>MAXSTRLEN;(3)S1[0]=MAXSTRLEN
If(S1[0]+S2[0]<=MAXSTRLEN{//未截断
T[1..S1[0]]=S1[1..S1[0]]; T[S1[0]+1..S1[0]+S2[0]]=S2[1..S2[0]]; T[0]=S1[0]+S2[0];uncut=TRUE;}
else if(S1[0]<MAXSTRLEN){//截断 T[1..S1[0]]=S1[1..S1[0]]; T[S1[0]+1..MAXSTRLEN]=S2[1..MAXSTRLEN-S1[0]]; T[0]=MAXSTRLEN;uncut=FALSE;} else{//截断,仅取S1 T[0..MAXSTRLEN]=S1[0..MAXSTRLEN];uncut=FALSE; } return uncut; }
数据元素所占存储位 实际分配的存储位
4.3 串的模式匹配算法
4.3.1求子串位置的定位函数Index(S,T,pos)
如S=“A STRING SEARCHING EXAMPLE CONSISTING OF SIMPLE TEXT” T=“STING” 结果:Index=37,while循环次数执行41次,(Index+T[0]1)+4,算法复杂度O(n+m) 对于S=“0000000…0001”,T=“00000001” 结果:Index=S[0]-T[0]+1,while循环次数Index*m,时间复杂 度O(n*m)
struct Chunk *next;
} Chunk; typedef struct Chunk{ Chunk *head,*tail;//串的头尾指针,tail联接2个串使用 int } Chunk; curlen; //串的当前长度
存储密度
存储密度小(如节点大小为1时),运算处理 方便,但存储占用量大。 因此,串的链式存储结构对如联接操作方便, 但总体不如定长顺序存储和堆分配存储灵活, 占用存储量大且操作复杂。
串的抽象数据定义:P71
对于串的基本操作集可以有不同 的定义方法,读者在使用高级语 言中的串类型时,应该以语言的 参考手册为准。
定位算法(P72) —— Index(S,T,pos)
4.2
串的表示和实现
对串的存储方式取决于我们对串所进行的运算,如果在程序设计 语言中,串的运算只是作为输入或输出的常量出现,则此时只需存储 该串的字符序列,这就是串值的存储。此外,一个字符序列还可赋给 一个串变量,操作运算时通过串变量名访问串值。
4.2.3链式存储结构
串的链式存储结构中每个结点包含字符域和结点链接指针域,字符域 用于存放字符,指针域用于存放指向下一个结点的指针,因此,串可用 单链表表示。 用单链表存放串,每个结点仅存储一个字符,因此,每个结点的指针 域所占空间比字符域所占空间要大得多。为了提高空间的利用率,我们 可以使每个结点存放多个字符,称为块链结构。 用块链表存放字符串时,其结构用C语言定义如下: #define CHUNKSIZE 80 typedef struct Chunk{ char ch[CHUNKSIZE]; //用户定义块的大小
4.3.2首尾匹配算法 先比较模式串的第一个字符,再比较模式串 的最后一个字符,最后比较模式串中从第二 个到第n-1个字符。
4.3.3 KMP算法(D.E.Knuth, V.R.Pratt, J.H.Morris )
↓i=3 第一趟匹配 a b a b c a b c a c b a b abcac ↑j=3 ↓i=3 ↓i=7 第二趟匹配 a b a b c a b c a c b a b abcac ↑j=1 ↑j=5 ↓i=7 ↓i=11 第三趟匹配 a b a b c a b c a c b a b abcac ↑j=2 j=6
模式串的next函数
当j 1时 0 Max{k|1 k j next[j] 且'p1p2 p k-1' 'p j-k 1 p j-1'} 1 其它情况
Next[j]表示当模式串中第j个字符与主串中相应 字符失配时,在模式串中需要重新和主串中 该字符进行比较的字符位置
将模式串向右滑动至第next[k]个字符与主串中 第j个字符比较。 若next[k]=k‟且pj=pk‟,则 next[j+1]=k‟+1=next[k‟]+1 若pj pk‟,则以此类推
J 123456 模式 abaabc Next[j] 0 1 1 2 2 3
78 ac
12
next函数的改进
在C语言中,存在一个称为“堆”的自由空间,由动态分配函数 malloc( )分配一块实际串长所需的存储空间,如果分配成功,则 返回这段空间的起始地址,作为串的基址。由free( )释放串不再 需要的空间。 存储结构: typedef struct{ char *ch; //若是非空串,按串长分配空间,否则ch为NULL int length; //串长 } HString;
相关文档
最新文档