数据结构第三章字符串

合集下载

数据结构各章概要

数据结构各章概要

数据结构各章概要数据结构是计算机科学中非常重要的一个学科,其主要研究各种数据的组织方式和操作方法。

善于运用合适的数据结构可以提高算法的效率,并优化程序的性能。

本文将对数据结构的各个章节进行概要介绍,帮助读者了解不同章节的主要内容和应用。

第一章:引论在引论章节,我们将引入数据结构的基本概念和术语,例如什么是数据、数据项、数据对象等等。

同时,还将介绍数据结构的分类和基本操作,如搜索、遍历、插入、删除和排序。

这些基础知识是后续章节的基础。

第二章:线性表线性表是数据结构中最简单、最基本的一种结构。

其特点是数据元素之间的前驱和后继关系非常明确。

线性表可以用数组和链表两种方式实现。

在本章节中,我们将分别介绍顺序表和链表的实现原理、插入、删除、合并以及应用场景。

第三章:栈和队列栈和队列是两种特殊的线性表结构,它们对数据的访问具有限制性。

栈具有“先进后出”的特点,而队列则具有“先进先出”的特点。

在本章节中,我们将介绍栈和队列的实现方式以及常见的应用场景,如递归、表达式求值、广度优先搜索等。

第四章:串串是由零个或多个字符组成的有限序列,其长度可以为零。

在本章节中,我们将介绍串的定义和操作,包括字符串的模式匹配、模式识别和编辑操作。

串的相关算法在文本处理、计算机网络等领域具有广泛的应用。

第五章:数组和广义表数组是一种在内存中以连续方式存储的数据结构,它具有高效的随机访问特性。

广义表是线性表的一种扩展,可以包含表结构、原子结构以及其他广义表。

本章节将介绍数组和广义表的定义、操作和应用。

第六章:树树是一种非线性的数据结构,具有分层次、递归和层次遍历等特点。

在本章节中,我们将介绍树的基本概念、二叉树、树的遍历算法、平衡树以及树的应用,如编译器中的语法树、文件系统的目录结构等。

第七章:图图是一种复杂的非线性数据结构,由顶点集合和边集合组成。

在本章节中,我们将介绍图的各种表示方式,图的遍历算法、最短路径算法以及常用的图算法,如最小生成树算法和拓扑排序。

数据结构(C语言版)_第3章 串与数组

数据结构(C语言版)_第3章 串与数组
typedef struct lnode {
char data; struct lnode *next;
}lstring;
3.3.3 串的存储结构——链式存储结构
当结点大小>1时,可以采用块链结构。
#define CHUNKSIZE 100
/*可由用户定义块的大小*/
typedef struct Chunk
第三章 串与数组
本章要点
➢字符串的基本概念与基本运算 ➢字符串的存储和基本运算的实现 ➢数组的概念和基本运算 ➢数组的存储结构 ➢特殊矩阵的压缩存储及运算 ➢广义表的概念及相关术语 ➢广义表的存储形式
3.1 “文学研究助手”案例导入
“文学研究助手”引例:请从下面的英文文章里,统计其中 good出现的次数和位置,并查找单词the所在的行号,该行中出 现的次数以及在该行中的相应位置。
3.4.1 数组的定义
数组是n个具有相同类型的数据元素构成的有限序列,数组 中的数据是按顺序存储在一块地址连续的存储单元中。
数组中的每一个数据通常称为数组元素,数组元素用下标 区分,其中下标的个数由数组的维数决定。
若线性表中的数据元素为非结构的简单元素,则称为一维 数组,又称为向量;若一维数组中的数据元素又是一维数组结 构,则称为二维数组;依次类推,若二维数组中的元素又是一 个一维数组结构,则称作三维数组。
3.3.4 串的基本操作的实现算法
第二种顺序存储方式下几种基本操作的算法
算法1:串连接操作 算法2:串比较操作 算法3:取子串操作 算法4:串插入操作 算法5:串删除操作 算法6:串置换函数 算法7:子串定位操作
3.3.5 串的应用
【例3-1】设计一个算法求串s中出现的第1个最长重复子串 及其位置。

信息学奥赛数据结构之字符串

信息学奥赛数据结构之字符串
字符
ASCII
0
48
1
49
2
50
3
51
4
52
5
53
6
54
7
55
8
56
9
57
字符
ASCII
A
B
C


Z
65 66
67
90
字符
a b
c
99
… …
z
122
ASCII 97 98
2、标准函数:ord(x) chr(x)
1)、ord(x):返回字符x的ASCII码。 i:=ord(‘A’); j:=ord(‘B’);n:=ord(‘1’); write(I,j,n); 65 66 49 2)、 chr(x):返回ASCII码为x的字符。 var a:char; a:=chr(98); writeln(a); write(chr(97)); 3)、字符大小的比较: ASCII码大的字符大。 ‘b’>’a’ ‘5’>’1’ ‘a’>’A’ (十进制转化为十六进制的输出)
val(s,k,code)
过程
将字符串s转为数值,存 在k中;code是错误代码 将数值i转为字符串s 在s中删除从第w位开始 的k个字符 将s1插到s中第w位
str(i,s)
过程
Delete(s,w,k)
过程
s := 'Honest Abe Lincoln'; Delete(s,8,4); Writeln(s); { 'Honest Lincoln' } S := 'Honest Lincoln'; Insert('Abe ', S, 8); { 'Honest Abe Lincoln' }

数据结构字符串对称的判断算法

数据结构字符串对称的判断算法

一、介绍在计算机科学中,数据结构是指在计算机中组织和存储数据的一种特殊方式。

而字符串对称的判断算法则是在数据结构中的一个重要应用,它用来判断一个字符串是否是对称的,即该字符串从左到右和从右到左读是一样的。

这是一个很常见的算法问题,在很多面试和编程挑战中经常会遇到。

本文将介绍一些常见的字符串对称判断算法,以帮助读者更好地理解和掌握这一算法。

二、暴力法暴力法是最简单的一种字符串对称判断算法。

它的思路是遍历字符串,同时比较对应位置上的字符是否相同。

具体步骤如下:1. 从字符串的两端分别设置两个指针,分别指向字符串的首尾字符。

2. 比较两个指针所指向的字符是否相同,如果相同则继续比较下一对字符,如果不同则说明该字符串不是对称的,算法结束。

3. 重复上述步骤直到两个指针相遇,如果过程中没有出现不同的情况,则说明该字符串是对称的。

暴力法的时间复杂度为O(n),其中n为字符串的长度。

但这种算法并不高效,因为它需要遍历整个字符串并逐个比较字符,所以在处理较长的字符串时效率并不高。

三、栈的应用栈是一种后进先出的数据结构,可以用来判断字符串是否对称。

具体步骤如下:1. 遍历字符串,将字符串的每个字符依次入栈。

2. 将栈中的字符逐个出栈,同时与字符串的对应位置上的字符进行比较,如果出现不同的情况则说明该字符串不是对称的,算法结束。

3. 如果整个遍历过程中没有出现不同的情况,且栈中所有字符都已经出栈,说明该字符串是对称的。

栈的应用在判断字符串对称时的时间复杂度也为O(n),但相较于暴力法,使用栈可以在一定程度上提高效率。

四、递归算法递归算法也可以用来判断字符串是否对称。

其思路是将字符串分割成两部分,分别比较这两部分的对应字符是否相同。

具体步骤如下:1. 将字符串分割成左右两部分,如果字符串长度为奇数,则左侧字符串比右侧多一个字符。

2. 逐个比较左右两部分对应位置上的字符,如果出现不同的情况则说明该字符串不对称,算法结束。

《数据结构(C语言版 第2版)》(严蔚敏 著)第三章练习题答案

《数据结构(C语言版 第2版)》(严蔚敏 著)第三章练习题答案

《数据结构(C语言版第2版)》(严蔚敏著)第三章练习题答案第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答案:C解释:栈是后进先出的线性表,不难发现C选项中元素1比元素2先出栈,违背了栈的后进先出原则,所以不可能出现C选项所示的情况。

(2)若已知一个栈的入栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1=n,则pi为()。

A.i B.n-i C.n-i+1 D.不确定答案:C解释:栈是后进先出的线性表,一个栈的入栈序列是1,2,3,…,n,而输出序列的第一个元素为n,说明1,2,3,…,n一次性全部进栈,再进行输出,所以p1=n,p2=n-1,…,pi=n-i+1。

(3)数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素个数的公式为()。

A.r-f B.(n+f-r)%n C.n+r-f D.(n+r-f)%n答案:D解释:对于非循环队列,尾指针和头指针的差值便是队列的长度,而对于循环队列,差值可能为负数,所以需要将差值加上MAXSIZE(本题为n),然后与MAXSIZE(本题为n)求余,即(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;答案:A解释:x=top->data将结点的值保存到x中,top=top->link栈顶指针指向栈顶下一结点,即摘除栈顶结点。

第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开始;

北大数据结构课件,内部资料,精品

北大数据结构课件,内部资料,精品

第三章字符串任课教员:张铭、赵海燕、冯梅萍、王腾蛟/mzhang/DS/北京大学信息科学与技术学院©版权所有,转载或翻印必究主要内容3.1 字符串抽象数据类型3.2 字符串的存储结构和类定义 3.3 字符串运算的算法实现3.4 字符串的模式匹配3.1字符串抽象数据类型3.1.1 基本概念3.1.2 String抽象数据类型3.1.1 基本概念字符串,由0个或多个字符的顺序排列所组成的复合数据结构,简称“串”。

串的长度:一个字符串所包含的字符个数。

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

3.1.1.1字符串常数和变量字符串常数例如:"\n"字符串变量3.1.1.2 字符字符(char) :组成字符串的基本单位。

在C和C++中单字节(8 bits)采用ASCII码对128个符号(字符集charset)进行编码3.1.1.3 字符的编码顺序为了字符串间比较和运算的便利,字符编码表一般遵循约定俗成的“偏序编码规则”。

字符偏序:根据字符的自然含义,某些字符间两两可以比较次序。

其实大多数情况下就是字典序中文字符串有些特例,例如“笔划”序3.1.1.4 C++标准string标准字符串:将C++的<string.h>函数库作为字符串数据类型的方案。

例如:char S[M];串的结束标记:'\0''\0'是ASCII码中8位BIT全0码,又称为NULL符。

3.1.1.4 C++标准string(续)1. 串长函数int strlen(char*s);2. 串复制char *strcpy(char*s1, char*s2);3.串拼接char *strcat(char*s1, char *s2);4.串比较int strcmp(char*s1, char *s2);3.1.1.4 C++标准string(续)5.输入和输出函数6.定位函数char *strchr(char*s, char c); 7.右定位函数char *strrchr(char*s, char c);3.1.1.4 C++标准string(续)3.1.2 String抽象数据类型字符串类(class String): 不采用char S[M]的形式而采用一种动态变长的存储结构。

什么是字符串

什么是字符串

什么是字符串?字符串(String)是一种在编程中常用的数据类型,用于表示和操作文本数据。

字符串是由字符组成的序列,可以包含字母、数字、符号和空格等字符。

字符串在计算机内部通常以字符数组的形式存储,其中每个字符占据一定的内存空间。

字符可以是任何Unicode字符,包括ASCII字符和扩展字符。

字符串的主要特点如下:1. 不可变性:字符串是不可变的,意味着一旦创建,它的值不能被改变。

当对字符串进行修改时,实际上是创建了一个新的字符串对象。

2. 字符串字面量:大多数编程语言支持使用字符串字面量来表示字符串。

字符串字面量是用引号(单引号或双引号)括起来的字符序列。

3. 字符串操作:字符串支持许多常见的操作,如连接(拼接)、截取、查找、替换、比较等。

这些操作可以根据具体编程语言的提供的函数或方法来实现。

4. 字符串长度:字符串的长度是指字符串中字符的数量。

可以通过内置函数或方法来获取字符串的长度。

创建字符串的语法因编程语言而异,以下是一些常见的示例:在C语言中,使用字符数组来表示字符串的示例:```char str[] = "Hello, World!"; // 创建一个字符串```在Java语言中,使用字符串字面量创建字符串的示例:```String str = "Hello, World!"; // 创建一个字符串```在Python语言中,使用引号括起来的字符序列来表示字符串的示例:```str = "Hello, World!" # 创建一个字符串```通过字符串操作,我们可以进行各种常见的操作。

例如,连接两个字符串可以使用字符串拼接操作符(`+`)。

截取字符串可以使用子字符串函数或方法。

查找字符串中特定字符或子字符串可以使用查找函数或方法,如`indexOf`。

替换字符串中的某些字符可以使用替换函数或方法,如`replace`。

比较字符串可以使用相等性运算符(`==`)或比较函数或方法。

3-3栈 课件-2021-2022学年浙教版(2019)高中信息技术选修1

3-3栈 课件-2021-2022学年浙教版(2019)高中信息技术选修1


栈的基本操作
·栈一般按顺序结构存储的,可以用数组来实现,而在Python语言中,可
以用列表实现。
top
栈顶:
a4
top=3
a3
a2
栈底: a1
a1 a2 a3 a4 数组st的下标: 0 1 2 3
数组存储栈
栈结构
·栈的链式存储结构(链栈)
top=3
D
C
B
A^

栈的基本操作
·建栈
toБайду номын сангаас = -1
else: stack.append(i)
print("result:%s" % stack[0])
输出结果:
请输入逆波兰表达式:6 8 2 - 2 * 3/+ result:10.0

栈的基本应用
·思考
如何把计算表达式转化成逆波兰式,然后计算其值。
例如: 计算表达式:6+(83-2)*2/3
逆波兰式:6 83 2 - 2 * 3 / +
·出栈: stacklist.pop( )
·输出栈顶元素: print( stacklist[ len( stacklist ) - 1] ) print( stacklist[ - 1] )
·输出栈中元素个数: print( len( stacklist ) )

栈的基本操作
·列表自带的方法实现栈的入栈和出栈
选修1《数据与数据结构》
第三章 字符串、队列和栈
3.3 栈

学习目标
栈的概念与特性 栈的基本操作
栈的概念和特性
·栈的概念
栈是一种操作受限的线性表,仅 允许在表的一端进行插入或删除。

数据结构之字符串字符串的存储方式操作和常见问题解决方法

数据结构之字符串字符串的存储方式操作和常见问题解决方法

数据结构之字符串字符串的存储方式操作和常见问题解决方法数据结构之字符串:字符串的存储方式、操作和常见问题解决方法1. 前言在计算机科学中,字符串是一种常见的数据类型,用于存储和操作文本数据。

本文将介绍字符串的存储方式、基本操作以及常见问题的解决方法。

2. 字符串的存储方式2.1 静态存储方式静态存储方式是指将字符串存储在固定大小的空间中,无法修改其长度。

常见的静态存储方式有数组和字符数组。

2.2 动态存储方式动态存储方式是指使用堆或者栈等数据结构来存储字符串,可以动态调整字符串的长度。

常见的动态存储方式有链表和动态数组。

3. 字符串的基本操作3.1 字符串的创建和初始化创建字符串时,可以使用字符串常量或者字符数组进行初始化。

例如:```C++string str1 = "Hello World";char str2[] = "Welcome";```3.2 字符串的拼接字符串的拼接是指将两个字符串连接在一起。

在C++中,可以使用"+"运算符或者使用字符串的成员函数append()来实现拼接操作。

例如:```C++string str1 = "Hello";string str2 = "World";string result = str1 + str2; // 使用"+"运算符string result2 = str1.append(str2); // 使用append()函数```3.3 字符串的比较字符串的比较是判断两个字符串是否相等。

在C++中,可以使用"=="运算符或者使用字符串的成员函数compare()来进行比较。

例如:```C++string str1 = "Hello";string str2 = "World";bool isEqual = (str1 == str2); // 使用"=="运算符int result = pare(str2); // 使用compare()函数,返回值为0表示相等```4. 常见问题的解决方法4.1 字符串的长度获取字符串的长度是常见的操作,可以使用字符串的成员函数length()或者size()来获得字符串的长度。

数据结构第3章中缀表达式

数据结构第3章中缀表达式

数据结构第3章中缀表达式数据结构实验报告(第三章)实验类型:综合性实验班级:学号:姓名:实验⽇期:2014年5⽉24⽇⼀、表达式求值1.问题描述表达式是数据运算的基本形式。

⼈们的书写习惯是中缀式,如:11+22*(7-4)/3。

中缀式的计算按运算符的优先级及括号优先的原则,相同级别从左到右进⾏计算。

表达式还有后缀式(如:22 7 4 - * 3 / 11 +)和前缀式(如:+ 11 / * 22 – 7 4 3)。

后缀表达式和前缀表达式中没有括号,给计算带来⽅便。

如后缀式计算时按运算符出现的先后进⾏计算。

本设计的主要任务是进⾏表达式形式的转换及不同形式的表达式计算。

2.基本要求●从⽂件或键盘读⼊中缀表达式。

●设计操作数为多位整数,操作符为加、减、乘、除、求模的中缀表达式求值算法。

●设计将中缀表达式转换为后缀表达式的算法。

●设计将中缀表达式转换为前缀表达式的算法。

●设计后缀表达式求值算法。

●设计前缀表达式求值算法。

●输出各种形式的表达式。

3.数据结构设计任何⼀个表达式都是由操作符,运算符和界限符组成的。

我们分别⽤顺序栈来寄存表达式的操作数和运算符。

栈是限定于紧仅在表尾进⾏插⼊或删除操作的线性表。

顺序栈的存储结构是利⽤⼀组连续的存储单元依次存放⾃栈底到栈顶的数据元素,同时附设指针top指⽰栈顶元素在顺序栈中的位置,base为栈底指针,在顺序栈中,它始终指向栈底,即top=base可作为栈空的标记,每当插⼊新的栈顶元素时,指针top增1,删除栈顶元素时,指针top减1。

typedef struct{int *base;int *top;int numstacksize; //数字栈}numstack;typedef struct{char *base;char *top;int charstacksize;//字符栈}charstack;4.算法设计(1)中缀表达式求值1.从左到右读⼊中缀表达式,每次⼀个字符。

5字符串

5字符串
Int Index(SString S, SString T, int pos) {
i
pos=5
i=pos;
j=1;
while ( i<=S[0] && j<=T[0] ) {
S="a b a b c a b c a c b a T="a b c a c" b"
j
if (S[i] = = T[j] ) {++i, ++j} //继续比较后续字符
包含子串的串相应的称为主串。
例,串 "eij" 是串 "beijing" 的子串, "beijing" 称为主 串。
字符在序列中的序号称为该字符在串中的位置。
子串在主串中的位置定义为子串的第一个字符在主串 中的位置。
例,字符 ‘n’ 在串 "beijing" 中的位置为 6 。 2 例,子串 "eij" 在串 "beijing" 中的位置为 。
字符串
简单匹配算法代码
29/40
简单模式匹配算法过程
第二趟比较: 第五趟比较: 第四趟比较: 第三趟比较: 第一趟比较: i ii ii ii i i i i ii i i i i i i i
t0 l l p0
j
t1 o o p1
t2 n n p2
t3 g g p3
jj
t4 l l p4
j
t5 o o p5
else {i=i-j+2; j=1;}
} else return0; }//Index
//指针回溯到 下一首位,重新开始匹配

数据结构_字符串操作原理

数据结构_字符串操作原理

4.1 串类型的定义

一、串的基本概念

串(String)的定义
s=“a1a2…an”

其中:
s为串的名字, 串的值
ai(1≤i≤n)一般是字母、数学、标点符号等可屏幕显
示的字符。
串的长度n。
4.1 串类型的定义

字符串与一般的线性表的区别:


串的数据元素约束为字符集;
串的基本操作通常针对串的整体或串的一个部分进行。


3.串的某些操作(如:串的连接、串的替换等)受到限制。
4.2.2 堆分配存储表示

特点:

仍用一组连续的存储单元来存放串,但存储空间是在程序 执行过程中动态分配而得。 利用malloc函数合理预设串长空间。
typedef struct{ char *ch; int length; }HString;

子串和主串

eg:
A=“This is a string” B=“is”

特别地:

空串是任意串的子串,任意串是其自身的子串。

串的相等
二、串的抽象数据类型定义
ADT String{
数据对象:D={ai|ai∈CharacterSet,i=1,2,…,n;n≥0}
数据关系:S={< ai-1 , ai >| ai-1, ai ∈D, i = 2,…,n} 基本操作: StrAssign(&T,chars) StrLength(S) SubString(&Sub,S,pos,len) StrCopy(&T,S) Index(S,T,pos)

串的结束标志的设置

数据结构之串类型

数据结构之串类型

数据结构之串类型 串的基本概念: 串(字符串):是零个或多个字符组成的有限序列。

记作: S=“a1a2a3…”,其中S是串名,ai(1≦i≦n)是单个,可以是字母、数字或其它字符。

串值:双引号括起来的字符序列是串值。

串长:串中所包含的字符个数称为该串的长度。

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

空格串(空⽩串):构成串的所有字符都是空格的串称为空⽩串。

注意:空串和空⽩串的不同,例如“ ”和“”分别表⽰长度为1的空⽩串和长度为0的空串。

⼦串(substring):串中任意个连续字符组成的⼦序列称为该串的⼦串,包含⼦串的串相应地称为主串。

⼦串的序号:将⼦串在主串中⾸次出现时的该⼦串的⾸字符对应在主串中的序号,称为⼦串在主串中的序号(或位置)。

特别地,空串是任意串的⼦串,任意串是其⾃⾝的⼦串。

串相等:如果两个串的串值相等(相同),称这两个串相等。

换⾔之,只有当两个串的长度相等,且各个对应位置的字符都相同时才相等。

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

串的抽象数据类型定义: ADT String{ 数据对象:D = { ai|ai∈CharacterSet, i=1,2,…,n, n ≥0 } 数据关系:R = {<ai-1, ai>| ai-1, ai∈D, i=2,3,…,n } 基本操作: StrAssign(t , chars) 初始条件: chars是⼀个字符串常量。

操作结果:⽣成⼀个值为chars的串t 。

StrConcat(s, t) 初始条件:串s, t 已存在。

操作结果:将串t联结到串s后形成新串存放到s中。

StrLength(t) 初始条件:字符串t已存在。

操作结果:返回串t中的元素个数,称为串长。

SubString (s, pos, len, sub) 初始条件:串s, 已存在, 1≦pos≦StrLength(s)且 0≦len≦StrLength(s) –pos+1。

数据结构(字符串)练习题与答案

数据结构(字符串)练习题与答案

1、下面关于串的叙述中,正确的是()。

A.串是一种特殊的线性表B.串中元素只能是字母C.空串就是空白串D.串的长度必须大于零正确答案:A解析:串是一种特殊的线性表,其元素为单个字符,长度可以为0。

2、两个字符串相等的条件是()。

A.串的长度相等B.含有相同的字符集C.都是非空串D.两个串的长度相等且对应位置的字符相同正确答案:D3、若串str=“Software”,其子串的个数是()。

A.8B.9C.36D.37正确答案:D解析:该串中所有字符不相同,长度为0的子串1个,长度为1的子串8个,长度为2的子串7个,…,长度为7的子串2个,长度为8的子串1个,总计子串数=1+8+7+…+2+1=1+8×9/2=37。

4、一个链串的节点类型定义为#define NodeSize 6typedef struct node{ char data[NodeSize];struct node *next;} LinkStrNode;如果每个字符占1个字节,指针占2个字节,该链串的存储密度为()。

A.1/3B.1/2C.2/3D.3/4正确答案:D解析:链串节点大小指每个节点存放的字符个数,本题节点大小为6,存储密度=(6*1)/(6*1+2)=3/4。

5、串采用节点大小为1的链表作为其存储结构,是指()。

A.链表的长度为1B.链表中只存放一个字符C.链表中每个节点的数据域中只存放一个字符D.以上都不对正确答案:C解析: C、链串节点大小指每个节点存放的字符个数。

6、对于一个链串s,查找第一个字符值为x的算法的时间复杂度为()。

A.O(1)B.O(n)C. O(n2)D.以上都不对正确答案:B解析:在链串查找第一个字符值为x的算法的时间复杂度为O(n)。

7、设有两个串p和q,其中q是p的子串,则求q在p中首次出现位置的算法称为()。

A.求子串B.串联接C.模式匹配D.求串长正确答案:C解析:模式匹配算法就是找子串在主串中的位置。

第三章 字符串、队列和栈——队列和栈复习课件 浙教版(2019)高中信息技术选修1

第三章 字符串、队列和栈——队列和栈复习课件 浙教版(2019)高中信息技术选修1

elif s[i]== ")":
if top==-1:
_f_l_a_g_=_F_a_l_s_e__
break
else:
_t_o_p_=_t_o_p_-_1___
if top>=0: flag=False #栈中还有左括号
if flag: print("括号匹配”)
else: print("括号不匹配")
以交替进行,且7个元素的出栈顺序为b,d,c,f,e,a,g,则栈s的容量至少
C 应该为(

A.1
B.2
C.3
D.4
二、栈和队列的基本操作
存储 建队 入队 出队 存储 建栈 入栈 出栈
存储
★ 队列的存储结构:顺序结构存储(线性表结构),可以用数组来实现,也可用链表来实现。
〄 头指针head: 记录队首元素位置 〄 尾指针tail: 记录队尾元素的下一个位置 〄 初始时为空列表时,head和tail 均记录下标为0的位置
将一个十进制数转换为二进制数,根据入栈、出栈的步骤, 采用Python编写的完整程序及测试结果如下所示:
算法思想: 1)用栈结构存放每次获得的余数 2)根据栈特征输出每次获得的余数
st=[-1]*100
#列表中元素初始值为-1
top=-1
number=int(input(“请输入十进制整数:”))
出队
#出队1、2
while head!=tail: print(que[head]) head+=1
出栈
#出栈1、2:
while top>-1: print(stack[top]) top-=1
top!=-1
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。


子串:串中任意个连续的字符组成的子序列。 主串:包含子串的串。 子串的位置:子串的第一个字符在主串中的序号。
S1="ab12cd " S2="ab12" S3="ab13" S4="ab12φ" S5=" " S6="φφφ "

串的比较:通过组成串的字符之间的比较来进行的。
给定两个串:X="x1x2…xn"和Y="y1y2…ym",则: 1. 当n=m且x1=y1,…,xn=ym时,称X=Y; 2. 当下列条件之一成立时,称X<Y: ⑴ n<m且xi=yi(1≤ i≤n); ⑵存在k≤min(m,n),使得xi=yi(1≤i≤k-1)且xk<yk。 例:S1="ab12cd ",S2="ab12",S3="ab13"

例:主串S="ababcabcacbab",模式T="abcac"
i
第 4 趟
a b a b c a b c a c b a b a b c a c
j
i=4,j=1失败 i回溯到5,j回溯到1
Hale Waihona Puke 串例:主串S="ababcabcacbab",模式T="abcac"
i
第 5 趟
a b a b c a b c a c b a b a b c a c
为什么BF算法时间性能低?
在每趟匹配不成功时存在大量回溯,没有利用已经 部分匹配的结果。
如何在匹配不成功时主串不回溯?
主串不回溯,模式就需要向右滑动一段距离。
如何确定模式的滑动距离?
串 i
第 1 趟
a b a b c a b c a c b a b a b c a c
j
i=3,j=3失败; s2=t2;t1≠t2 ∴t1≠s2

⑺ StrInsert (s, i, t):插入,将串t插入到串s中的第i个 位置。 ⑻ StrDelete (s, i, len):删除,在串s中删除从第i个字 符开始的连续len个字符。 ⑼ StrRep (s, t, r):替换,在串s中用串r替换所有与串t 相等的子串。 与其他数据结构相比,串的操作对象有什么特点? 串的操作通常以串的整体作为操作对象。
最坏情况:不成功的匹配都发生在串T的最后一个字符。
设匹配成功发生在si处,则在i-1趟不成功的匹配中共 比较了(i-1)×m次,第i趟成功的匹配共比较了m次, 所以总共比较了i×m次,因此
n - m +1
m(n - m + 2) = O(n m) pi (i m) = 2 i =1

int BF(char S[ ], char T[ ]) { i=1; j=1;start=1; while (i<=S[0]&&j<=T[0]) { if (S[i]==T[j]) { i++; j++; } else { start++; i=start; j=1; } } if (j>T[0]) return start; else return 0; }

⑴ StrLength (s):求串s的长度。 ⑵ StrAssign (s1, s2):赋值,将s2的值赋值给串s1。 ⑶ StrConcat (s1, s2, s):连接,将串s2放在串s1的后 面连接成一个新串s。 ⑷ SubStr (s, i, len):求子串,返回从串s的第i个字符 开始取长为 len 的子串。 ⑸ StrCmp (s1, s2):串比较,若s1=s2,返回0;若 s1<s2, 返回-1;若s1>s2, 返回1。 ⑹ StrIndex (s, t):定位,返回子串t在主串s中首次 出现的位置。若t不是s的子串,则返回0。

顺序串:用数组来存储串中的字符序列。
如何改造数组实现串的顺序存储? (1)非压缩形式。 (2)压缩形式。
启示:时空权衡!
a e b f c g d

如何表示串的长度? 方案1:用一个变量来表示串的实际长度。
0
1
2
3
4
5
6 … … Max-1
a b c d e f
g
空 闲
9

如何表示串的长度? 方案1:用一个变量来表示串的实际长度。 方案2:在串尾存储一个不会在串中出现的特殊字符 作为串的终结符,表示串的结尾。

求子串操作SubStr(s, i, len)示例 i = 3, len = 3 i = 7, len = 4
a b c d e f g e
a b c d e f g e
空串
c d e
g e

顺序串:用数组来存储串中的字符序列。
如何改造数组实现串的顺序存储? (1)非压缩形式。
a
b
c
d
e
f
g
0
1
2
3
4
5
6
7 … … Max-1 空 闲
a
b
c
d
e
f
g \0

如何表示串的长度? 方案1:用一个变量来表示串的实际长度。 方案2:在串尾存储一个不会在串中出现的特殊字符 作为串的终结符,表示串的结尾。 方案3:用数组的0号单元存放串的长度,从1号单 元开始存放串值。 0 1 2 3 4 5 6 7……
⑴ 算法的一次执行时间不容忽视:问题规模通常很 大,常常需要在大量信息中进行匹配; ⑵ 算法改进所取得的积累效益不容忽视:模式匹配 操作经常被调用,执行频率高。

i
回溯
i
主串S …
模式T
si
……
tj
j
回溯
j

i
主串S …
模式T
si
……
tj
j

i
主串S …
模式T
si
……
tj
j

例:主串S="ababcabcacbab",模式T="abcac"
第 2 趟
a b a b c a b c a c b a b
a b c a c
串 i
第 1 趟
a b a b c a b c a c b a b a b c a c
j
i=3,j=3失败; s2=t2;t1≠t2 ∴t1≠s2
第 3 趟
a b a b c a b c a c b a b a b c a c
i i i
第 1 趟
j
a b a b c a b c a c b a b a b c a c
j j
i=3,j=3失败; i回溯到2,j回溯到1

例:主串S="ababcabcacbab",模式T="abcac"
i
第 1 趟
j
a b a b c a b c a c b a b a b c a c
i=3,j=3失败; i回溯到2,j回溯到1

设串S长度为n,串T长度为m,在匹配成功的情况 下,考虑两种极端情况:
⑴ 最好:不成功的匹配都发生在串T的第一个字符。 例如:S="aaaaaaaaaabcdccccc" T="bcd "

设串S长度为n,串T长度为m,在匹配成功的情况 下,考虑两种极端情况:
最好情况:不成功的匹配都发生在串T的第1个字符。 设匹配成功发生在si处,则在i-1趟不成功的匹配中共 比较了i-1次,第i趟成功的匹配共比较了m次,所以 总共比较了i-1+m次,所有匹配成功的可能情况共有 n-m+1种,则:
j
i=7,j=5失败 s5=t3;t1≠t3 ∴t1≠s5
第 5 趟
a b a b c a b c a c b a b a b c a c
串 i
第 3 趟
a b a b c a b c a c b a b a b c a c
j
i=7,j=5失败 s5=t3;t1≠t3 ∴t1≠s5
第 6 趟
a b a b c a b c a c b a b a b c a c
j
i=5,j=1失败 i回溯到6,j回溯到1

例:主串S="ababcabcacbab",模式T="abcac"
i
第 5 趟
a b a b c a b c a c b a b a b c a c
j
i=5,j=1失败 i回溯到6,j回溯到1

例:主串S="ababcabcacbab",模式T="abcac"
j
i=2,j=1失败 i回溯到3,j回溯到1

例:主串S="ababcabcacbab",模式T="abcac"
i i i i i
第 3 趟
a b a b c a b c a c b a b a b c a c
j j j j j
i=7,j=5失败 i回溯到4,j回溯到1

例:主串S="ababcabcacbab",模式T="abcac"
i
第 3 趟
a b a b c a b c a c b a b a b c a c
j
i=7,j=5失败 i回溯到4,j回溯到1

例:主串S="ababcabcacbab",模式T="abcac"
相关文档
最新文档