串的抽象数据类型

合集下载

严蔚敏数据结构-第四章 串

严蔚敏数据结构-第四章 串
S1 4 a b c d S2 2 e f T 6 a b c d e f
15
(2)S1串长 最大串长 串长<最大串长 串长 最大串长; S1,S2串长和 最大串长 串长和>最大串长 串长和 最大串长;
S1 6 a b c d e f S2 6 g h i j k l T 8 a b c d e f g h
3
串的抽象数据类型的定义: 串的抽象数据类型的定义: ADT String{ 数据对象: 数据对象:D={ai|ai∈CharacterSet, i=1,2,...,n, n>=0} 数据关系: 数据关系:R1={<ai-1,ai>|ai-1,ai∈D, i=2,...,n} 基本操作: 基本操作: StrAssign(&T, chars)
11
作业: 作业: 1.用5种串的基本操作(StrAssign、StrCompare、StrLen Concat、SubString)来逻辑实现StrInsert(&S, pos, T)操作 、 操作. )
Status StrInsert(String S, int pos , String T) { if ……….. return error; , , ); ); ); );
chars是字符串常量。生成一个其值等于chars的串 。 是字符串常量。生成一个其值等于 的串T。 是字符串常量 的串
StrCopy(&T, S)
存在则由串S复制得串 串S存在则由串 复制得串 存在则由串 复制得串T
StrEmpty(S)
存在则若S为空串 串S存在则若 为空串 返回真否则返回假 存在则若 为空串,返回真否则返回假
Sub返回串 的第pos个字符起长度为 返回串S的第 个字符起长度为len的子串 用Sub返回串S的第pos个字符起长度为len的子串

数据结构简答题和论述题

数据结构简答题和论述题

数据结构简答题和论述题1、试描述数据结构和抽象数据类型的概念与程序设计语⾔中数据类型概念的区别。

【解答】数据结构是指相互之间存在⼀定关系的数据元素的集合。

⽽抽象数据类型是指⼀个数据结构以及定义在该结构上的⼀组操作。

程序设计语⾔中的数据类型是⼀个值的集合和定义在这个值集上⼀组操作的总称。

抽象数据类型可以看成是对数据类型的⼀种抽象。

串:是零个或多个字符组成的有限序列。

串是⼀种特殊的线性表,它的每个结点仅由⼀个字符组成。

空串 :长度为零的串,它不包含任何字符。

空⽩串 :仅由⼀个或多个空格组成的串⼦串 :串中任意个连续字符组成的⼦序列称为该串的⼦串。

串变量和串常量通常在程序中使⽤的串可分为:串变量和串常量。

(1)串变量 :串变量和其它类型的变量⼀样,其取值是可以改变的。

(2)串常量 :串常量和整常数、实常数⼀样,在程序中只能被引⽤但不能改变其值。

即只能读不能写。

(1)树形图表⽰: 树形图表⽰是树结构的主要表⽰⽅法。

(2)树的其他表⽰法① 嵌套集合表⽰法:是⽤集合的包含关系来描述树结构。

② 凹⼊表表⽰法:类似于书的⽬录③ ⼴义表表⽰法:⽤⼴义表的形式表⽰的。

上图 (a)树的⼴义表表⽰法如下:(A(B(E,F(I,J)), C,D(G,H)))1.中序遍历的递归算法定义:若⼆叉树⾮空,则依次执⾏如下操作:(1)遍历左⼦树; (2)访问根结点; (3)遍历右⼦树。

2.先序遍历的递归算法定义:若⼆叉树⾮空,则依次执⾏如下操作:(1) 访问根结点; (2) 遍历左⼦树; (3) 遍历右⼦树。

3.后序遍历得递归算法定义:若⼆叉树⾮空,则依次执⾏如下操作:(1)遍历左⼦树; (2)遍历右⼦树; (3)访问根结点。

2、链表具有的特点是B 插⼊、删除不需要移动元素C 不必事先估计存储空间D 所需空间与线性表长度成正⽐顺序队列(1)队列的顺序存储结构称为顺序队列,顺序队列实际上是运算受限的顺序表。

(2) 顺序队列的表⽰①和顺序表⼀样顺序队列⽤⼀个向量空间存放当前队列中的元素。

数据结构——第4章 串(C#)

数据结构——第4章 串(C#)
将当前链串的所有结点?nstr将q结点插入到尾部将q结点插入到尾部将链串t的所有结点?nstr将q结点插入到尾部尾结点的next置为null返回新建的链串5求子串substrij返回当前串中从第i个字符开始的连续j个字符组成的子串ຫໍສະໝຸດ 第4章 串4.1 串的基本概念
4.1.1 什么是串 串(或字符串)是由零个或多个字符组成的有限序列。 记作str="a1a2…an"(n≥0),其中str是串名,用双引号括 起来的字符序列为串值,引号是界限符,ai(1≤i≤n)是一 个任意字符(字母、数字或其他字符),它称为串的元素, 是构成串的基本单位,串中所包含的字符个数n称为串的 长度,当n=0时,称为空串。
4.2 串的存储结构
4.2.1 串的顺序存储结构-顺序串
和顺序表一样,用一个data数组(大小为MaxSize)和 一个整型变量length来表示一个顺序串,length表示data数 组中实际字符的个数。 定义顺序串类SqStringClass如下:
class SqStringClass { const int MaxSize=100; public char[] data; //存放串中字符 public int length; //存放串长 public SqStringClass() //构造函数,用于顺序串的初始化 { data=new char[MaxSize]; length=0; } //顺序串的基本运算 }
(9)串输出DispStr() 将当前串s的所有字符构成一个字符串并输出。对应的算 法如下:
public string DispStr() { int i; string mystr=""; if (length==0) mystr = "空串"; else { for (i=0;i<length;i++) mystr+=data[i].ToString(); } return mystr; }

数据结构-第4章 串

数据结构-第4章 串
真子串是指不包含自身的所有子串。
4.1 串的类型定义
子串的序号:将子串在主串中首次出现时的该 子串的首字符对应在主串中的序号,称为子串 在主串中的序号(或位置)。 【例】 A=“abcdefbbcd”,B=“bcd”,B在A中的 序号为2。 特别地,空串是任意串的子串,任意串是其自 身的子串。
4.1.2 串的抽象数据类型定义
//查找ab子串
if (p->data==‘ a’ && p->next->data==‘b’)
{ p->data=‘x’; p->next->data=‘z’;
q=(LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data=‘y’;
q->next=p->next; p->next=q;
s: a a a a b c d
t: a ab bac acb bc c ✓ 匹配成功 算法的思路是从s的每一个字符开始依次与t的 字符进行匹配。
4.2.1 Brute-Force算法
int BFIndex(SqString s,SqString t)
{ int i=0, j=0,k;
while (i<s.length && j<t.length)
4.1 串的类型定义 4.2 串的表示和实现 4.3 串的模式匹配算法
本章要求
理解: 1、串的基本概念、类型定义 2、串的存储表示和实现 3、串的KMP算法
掌握: 4、串的简单模式匹配算法(BF)
第4章 串的基本概念
串(或字符串):是由零个或多个字符组成 的有限序列。
串的逻辑表示: S=“a1a2…ai…an”,其中S为 串名,ai (1≤i≤n)代表单个字符,可以是字母、 数字或其它字符(包括空白符)。 串值:双引号括起来的字符序列。双引号不是 串的内容,只起标识作用。

第3章-字符串

第3章-字符串

图3.6 p0…pi-1的前缀与后缀比较
2021/4/8
25
k(是0≤p0k…≤pi -i-11串)中。最显大然的这前个缀值与不后但缀存的在长,度而 且仅仅依赖于p本身,与任何t无关。
当右移量小于i-k时,根据k的意义,此时用 长度大于k的前后缀对齐,比较结果必定不相 等。
当右移量大于i-k时,又可能错过目前匹配 成功的机会。
现的位置。
end ADT String
2021/4/8
5
3.2 字符串的实现
顺序表示 链接表示
2021/4/8
6
3.2.1 顺序表示
字符串的顺序表示,就是把串中的字符,顺序地存储在一 组地址连续的存储单元中。其类型定义为:
struct SeqString {
/* 顺序串的类型 */
int MAXNUM;2021/4/8 Nhomakorabea30
例子
• t="aabcbabcaabcaababc" n=18, • p=“abcaababc”, m=9。
feiwlwokucom目录31字符串及其抽象数据类型311基本概念312抽象数据类型32字符串的实现321顺序表示322链接表示33模式匹配331朴素的模式匹配332无回溯的模式匹配31字符串及其抽象数据类型311基本概念字符串简称串是一种特殊的线性表其特殊性主要在于表中的每个元素是一个字符
第三章 字符串
否则必有某个i(0≤i≤m-1),使得ti ≠pi, 这时可将p右移一个字符,用p中字符从头p0开始 与t中字符t1依次比较.
如此反复执行,直到下面两种情况之一:
到达某步时,ti = p0,ti+1 = p1,…,ti+m-1 = pm-1,匹配成功,返回第一次出现的位置是从t中第 i+1个字符ti开始;

数据结构——串

数据结构——串

7
三、串的基本操作 C语言中常用的串运算 定义下列几个变量: char s1[20]=“dirtreeformat”,s2[20]=“file.mem”; char s3[30],*p; int result;
(1) 求串长(length) int strlen(char s); //求串的长度
例如:printf(“%d”,strlen(s1)); 输出13
char strcat(char s1 , char s2)
该函数将串s2复制到串s1的末尾,并且返回一 个指向串s1的开始处的指针。
例如:strcat(a3,”/”)
strcat(a3,a2);
2020//4//a143=“dirtreeformat/file.mem”
9
(4)串比较(compare)
A=“This is a string” B=“is” B在A中出现了两次,其中首次出现所对应的主串
位置是3。因此,称B在A中的序号(或位置)为3 特别地,空串是任意串的子串,任意串是其自身的子
串。
2020/4/14
5
二、串的抽象数据定义
• ADT String { • 数据对象:D={ai| ai
16
顺序串的类型定义和顺序表类似: typedef char ElemType;
typedef struct { ElemType ch[maxstrlen]; int length;
}sstring; //其优点是涉及到串长操作时速度快。
2020/4/14
17
4.2.2 堆分配存储表示
这种存储表示的特点是,仍以一组地址连续的存储单元存 放字符串序列,但它们的存储空间是在程序执行过程中动态 分配而得。所以也称为动态存储分配的顺序表。在C语言中, 利用malloc和realloc,free等动态存储管理函数,来根据实 际需要动态分配和释放字符数组空间。这样定义的顺序串类

数据类型及其分类

数据类型及其分类

数据类型及其分类数据类型是程序设计中的基础概念,它定义了数据的特点和操作。

在计算机编程中,数据可以分为不同的类型,每种类型都有其特定的属性和可执行的操作。

本文将详细介绍主要的数据类型及其分类。

一、基本数据类型基本数据类型是编程语言中最基础、最原始的数据类型,它们是构成其他复杂数据类型的基石。

常见的基本数据类型包括以下几种:1. 整型(int):用来表示整数,可以是正数、负数或零,不包含小数部分。

2. 浮点型(float):用来表示带有小数部分的数字,通常具有单精度或双精度两种精度。

3. 字符型(char):用来表示单个字符,可以是字母、数字、标点符号等。

4. 布尔型(bool):用来表示真值,只能取两个值,即真(true)或假(false)。

二、复合数据类型复合数据类型是由多个基本数据类型组合而成的数据类型,它们能够存储更加复杂的数据结构。

常见的复合数据类型包括以下几种:1. 数组(array):是一种由相同类型的元素组成的数据结构,可以按照索引位置来访问每个元素。

2. 字符串(string):是由一串字符组成的数据类型,可以进行字符串的连接、比较等操作。

3. 结构体(struct):是一种用户自定义的数据类型,可以包含多个不同类型的数据成员。

4. 枚举(enum):是一种具有离散取值的数据类型,用于定义一组相关的常量。

三、指针类型指针是一种特殊的数据类型,用于存储变量的内存地址。

通过指针,可以直接访问内存中存储的数据。

指针类型包括以下几种:1. 指针变量(pointer):用于存储其他变量的地址,可以通过指针访问对应地址上的值。

2. 空指针(null pointer):指向空地址的指针,表示它不指向任何有效的内存空间。

3. 野指针(wild pointer):指向非法地址的指针,未初始化或已经释放的指针称为野指针。

四、抽象数据类型抽象数据类型(Abstract Data Type,ADT)是一种高级的数据类型,它将数据和操作封装在一起,提供了一种抽象的方式来理解和使用数据。

串的抽象数据类型的定义.

串的抽象数据类型的定义.

StrAssign (&T, chars)
初始条件:chars 是字符串常量。 操作结果:把 chars 赋为 T 的值。
StrCopy (&Tቤተ መጻሕፍቲ ባይዱ S)
初始条件:串 S 存在。
操作结果:由串 S 复制得串 T。
DestroyString (&S)
初始条件:串 S 存在。 操作结果:串 S 被销毁。
StrEmpty (S)
SubString (&Sub, S, pos, len)
ClearString (&S) Index (S, T, pos) Replace (&S, T, V) StrInsert (&S, pos, T)
StrDelete (&S, pos, len)
} ADT String
StrDelete (&S, pos, len)
初始条件:串S存在
1≤pos≤StrLength(S)-len+1。
操作结果:从串S中删除第pos个字符
起长度为len的子串。
ClearString (&S) 初始条件:串S存在。 操作结果:将S清为空串。
对于串的基本操作集可以有不同的定义 方法,在使用高级程序设计语言中的串类型 时,应以该语言的参考手册为准。 gets(str) 输入一个串; puts(str) 输出一个串; strcat(str1, str2) 串联接函数; strcpy(str1, str2, k) 串复制函数; strcmp(str1, str2) 串比较函数; strlen(str) 求串长函数;
StrInsert (&S, pos, T)
初始条件:串S和T存在,
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

======实习报告一“串的抽象数据类型”演示程序 ========(一)、程序的功能和特点1. 程序功能:建立存放字符串的数组,来存放串,并对以存放的串可以进行键盘录入,查找,统计和匹配,显示等功能。

2. 程序特点:采用java 面向对象语言,将串和对其的各种操作进行进行类的封装。

(二)、程序的算法设计 算法一:“在当前串中查找子字符串(模式匹配)”算法: 1.【逻辑结构与存储结构设计】 逻辑结构:线性结构。

存储结构:顺序存储结构。

这种存储方式可以直接得到串的长度:s.curlen+1。

如图所示。

串的顺序存储方式2.【基本操作设计】设主串s="ababcabcacbab ",模式t="abcac ",匹配过程如图所示。

3.【算法设计】0 1 2 3 4 5 6 7 8 9 10 ... MAXSIZE-1a b cdefghijk…第一趟 第二趟 第三趟 第四趟 第五趟 第六趟简单模式匹配的匹配过程s.curlens.data文字说明:(1).首先将字串的第一个字符和当前串的字符进行一一比对;(2).如果字串在当前串中第一个字符匹配成功,在进行第二个字符的匹配; (3).如果接下来字串中的第二个字符在当前串中接下来的一个字符匹配不成功,则匹配失败返回到(1),如果匹配成功则在进行接下来的字符匹配,如果其中有一次字符匹配不成功,则重新开始;(4).如果匹配成功返回字串出现的首地址。

且继续对当前串进行匹配到结束,有多少字串返回多少字串出现的首地址。

4. 【高级语言代码】//在当前串中查找子字符串(模式匹配) public int Find ( cString pat ){ //穷举的模式匹配for ( int i = 0; i <= curLen -pat.curLen ; i++ ){ //逐趟比较int j = 0; //从ch[i]与模式pat.ch 比较 while ( j < pat.curLen )if ( ch [i+j] == pat.ch [j] ) j++; else break ;if ( j == pat.curLen ) return i+1; //pat 扫描完, 匹配成功,返回子串开始位置 }return -1; //匹配失败 }算法二:“取出当前串从pos 开始len 个字符组成的子串”算法: 1.【逻辑结构与存储结构设计】 逻辑结构:线性结构。

存储结构:顺序存储结构。

这种存储方式可以直接得到串的长度:s.curlen+1。

如图所示。

串的顺序存储方式2.【基本操作设计】0 1 2 3 4 5 6 7 8 9 10 ... MAXSIZE-1a b cdefghijk…s.curlens.dataPos pos+len0 1 2 3 4 5 6.... .... MAXSIZE-1a b c d e f g ....创建char[len]数组0 1 2 .... Len-1c d e f g ...pos.dat3.【算法设计】文字说明:(1).首先创建字符数组char[len]。

(2).找到pos位置,既要取出子串的首地址;(3).再将当前串的元素从pos到pos+len依次存放到字符数组char[len]中;(4).返回取出的字符数组。

4.【高级语言代码】//取出当前串从pos开始len个字符组成的子串public cString subString( int pos, int len ){//从串中第 pos 个位置起连续提取 len 个字符//形成子串返回if ( pos+len > curLen ) //子串长度不合理len = curLen - pos;char t[]=new char[len]; //字符数组for ( int i = 0, j = pos; i < len; i++, j++ )t[i] = ch[j]; //传送串数组cString temp=new cString(t); //构造方法二return temp;}(三)、程序中类的设计“cString”类:1.【逻辑结构与存储结构】逻辑结构:线性结构。

存储结构:顺序存储结构。

串的顺序存储方式可以直接得到串的长度:s.curlen+1。

如图所示。

串的顺序存储方式示意图2.【主要成员变量说明】 主要成员变量有:maxLen ,int 类型变量,静态的最终变量,字符串允许的最大字符数。

curLen ; int 型变量,表示当前串的实际长度。

char ch []=new char [maxLen ];串的存储数组(一定是字符数组) 3.【主要成员方法说明】public cString (cString other):构造方法,参数为一个字符串,实现从已知串other 复制。

public cString ( char arrchar[]):构造方法,从已有字符数组中复制,参数为已知数组。

public cString( ):构造函数,无参,从键盘输入字符串。

public void strPrint():打印字符串。

public int Length ( ):求当前串的串的实际长度。

public char [] get_value ( ):返回当前串的字符数组。

public int Find ( cString pat ):在当前串中查找子字符串(模式匹配)。

public cString subString( int pos, int len ):取出当前串从pos 开始len个字符组成的子串。

public int cStringCmp ( cString other ):判当前串与对象串other 的大小关系。

boolean IsStrEmpty () :判当前串是否空串。

public void cStringApp (cString other)将串other 连接到当前串之后。

public char getChar( int i )取当前串的第 i 个字符。

4.【高级语言代码】 //定义“字符串”类 class cString {final static int maxLen = 128; int curLen ; //串的实际长度char ch []=new char [maxLen ]; //串的存储数组(一定是字符数组) //构造方法一:从已有串other 复制 public cString (cString other) { curLen =other.curLen ;for (int i=0;i<curLen ;i++) ch [i]=other.ch [i]; }//构造方法二:从已有字符数组复制0 1 2 3 4 5 6 7 8 9 10 ... MAXSIZE-1abcdefghijk…s.curlen n s.datapublic cString ( char arrchar[]) {curLen=arrchar.length; //数组长度for(int i=0;i<curLen;i++)ch[i]=arrchar[i];}//构造方法三:从键盘输入public cString( ) {System.out.println("输入若干字符后,回车。

");try {BufferedReader br=new BufferedReader(new InputStreamReader(System.in));br.read(ch);} catch(IOException e){}int l=0;while(ch[l]!=13) l++; //回车结束curLen=l; //串的实际长度}//打印串public void strPrint() {for(int i=0;i<curLen;i++)System.out.print(ch[i]);System.out.println();}//求当前串的实际长度public int Length ( ) { return curLen; }//返回当前串的字符数组public char[] get_value ( ){char tmp[]=new char[curLen];for(int i=0;i<curLen;i++)tmp[i]=ch[i];return tmp;}//在当前串中查找子字符串(模式匹配)public int Find ( cString pat ){//穷举的模式匹配for ( int i = 0; i <= curLen-pat.curLen; i++ ){ //逐趟比较int j = 0; //从ch[i]与模式pat.ch比较while ( j < pat.curLen )if ( ch[i+j] == pat.ch[j] ) j++;else break;if ( j == pat.curLen ) return i+1;//pat扫描完, 匹配成功,返回子串开始位置}return -1; //匹配失败}//取出当前串从pos开始len个字符组成的子串public cString subString( int pos, int len ){//从串中第 pos 个位置起连续提取 len 个字符//形成子串返回if ( pos+len > curLen ) //子串长度不合理len = curLen - pos;char t[]=new char[len]; //字符数组for ( int i = 0, j = pos; i < len; i++, j++ )t[i] = ch[j]; //传送串数组cString temp=new cString(t); //构造方法二return temp;}//判当前串与对象串other的大小关系public int cStringCmp ( cString other ){int l=curLen>other.curLen ? curLen : other.curLen;int i=0,j=0;while(i<l&&ch[i++]!=other.ch[j++]);return ch[i]-other.ch[j];}//判当前串是否空串boolean IsStrEmpty () {return curLen == 0;}//将串other连接到当前串之后public void cStringApp (cString other) {int j=0,i=curLen;while(i<maxLen&&j<other.curLen)ch[i++]=other.ch[j++];curLen+=other.curLen;}//取当前串的第 i 个字符public char getChar( int i ) {if(i<curLen)return ch[i];elsereturn 0;}//主方法public static void main(String args[]){cString s1=new cString(); //构造方法三s1.strPrint();char tmp[]=s1.get_value(); //字符数组cString s2=new cString(tmp); //构造方法二s2.strPrint();cString s3=new cString(tmp); //构造方法一s3.strPrint();cString sub1=new cString();System.out.println(s1.Find(sub1));s1.cStringApp(sub1);s1.strPrint();}} //定义“字符串”类cString结束(四)、程序的输入输出和运行结果截屏程序运行结果截屏:。

相关文档
最新文档