数据结构8_串类型的定义、表示和实现

串类型的定义

是由零个或多个字符组成的有限序列

串中字符的数目n称为串的长度。零个字符的串称为空串

串中任意个连续的字符组成的子序列称为该串的子串

包含子串的串相应地称为主串。通常称字符在序列中的序号为该字符在串中的位置

串值必须用一对单引号括起来。单引号本身不属于串,它的作用只是为了避免与变量名或数的常量混淆而已。

例如 x=’123’; x是一个串变量名,字符序列123是其值。

由一个或多个空格组成的串’’称为空格串(注意不是空串)。

串的逻辑结构和线性表极为相似,区别仅在于串的数据对象约束为字符集

串的基本操作和线性表有很大差别。

串的基本操作中,通常以“串的整体”作为操作对象。

串的表示和实现

在多数非数值处理的程序中,串也以变量的形式出现。串有3种机内表示方法

存储结构不同,操作也就不同;

定长顺序存储表示

类似于线性表的顺序存储结构,用一组地址连续的存储单元存储串值的字符序列。

在串的定长顺序存储结构中,按照预定义的大小,为每个定义的串变量分配一个固定长度的存储区。

串的实际长度可在这预定义长度的范围内随意,超过预定义长度的串值则被舍去,称之为“截断”。(预定义串最大长度有个弊病,就是在进行串联接时可能产生截断的情况。克服该问题的方法就是动态分配串值的存储空间。)

以下标为0的数组分量存放串的实际长度。

在串后面加上一个不计入串长的结束标记字符:C语言中以“\0”表示串值的终结。串长为隐含值。

在这种存储结构中如何实现串的操作:1)串联接,2)求子串

顺序存储结构中,串操作的原操作为“字符序列的复制”。

操作的时间复杂度取决于字符序列的长度

另一个操作特点:如果在操作中出现串值序列的长度超过上界,约定用截尾法处理。这种弊病在求联接串时可能发生,在串的其他操作中,如插入,置换等也可能发生。克服这种弊病的方法就是不限定串长的最大长度。

堆分配存储表示

在C语言中,存在一个称之为“”的自由存储区。并由C语言动态分配函数malloc()和free()来管理。利用函数malloc()为每个新产生的串分配一块实际串长所需的存储空间。

是内存中的一块特定存储区域,用于在程序运行过程中动态分配存储空间。

若分配成功,则返回一个指向起始地址的指针,做为串的基址。

同时为了以后处理方便,约定串长也作为存储结构的一部分。

串的堆分配存储表示

typedef struct

{

char  *ch;

int   length;

}HString;

这种存储结构表示时的串操作仍是基于“字符序列的复制”进行的。

串复制操作StrCopy(&T,S):若串T已存在,则先释放串T所占空间,当S不空时,首先为串T分配大小和串S长度相等的存储空间。然后将串S的值复制到串T中。

串插入操作StrInsert(&S, pos, T):将串S重新分配大小等于串S和串T长度之和的存储空间,然后进行串值复制。

堆分配存储结构的串既有顺序存储结构的特点,处理方便。操作中对串长又没有任何限制,更显灵活。

串的块链存储表示

当以链表存储串值时,除头指针外还可以附设一个尾指针指示链表中的最后一个结点,并给出当前串的长度。设尾指针的目的是为了便于进行联结操作,但应注意联结时需处理第一个串尾的无效字符。如此定义的串存储结构称为块链结构。块的大小根据需要选择。块太大的化,处理不灵活。块太小则存储密度小。总体来说这种存储结构不如前两种灵活方便。占用存储空间大而且操作复杂。只有在联结操作时有一定方便之处。

原文地址:https://www.cnblogs.com/grooovvve/p/10398387.html

时间: 2024-10-27 13:26:39

数据结构8_串类型的定义、表示和实现的相关文章

第四章:1.串 -- 串类型定义及串的表示和实现

前言: 计算机上的应用程序几乎都是以字符串数据作为处理对象,然而,现今我们使用的计算机的硬件结构主要是反映数值计算的需要的,因此,在处理字符串数据时比处理整数和浮点数要复杂得多.而且,在不同类型的应用中,所处理的字符串具有不同的特点,要有效地实现字符串的处理,就必须根据具体情况使用合适的存储结构.这一章,我们将讨论一些基本的串处理操作 和 几种不同的存储结构. 目录: 1.串类型的定义 2.串的表示和实现 2.1.定长顺序存储表示 2.2.堆分配存储表示 2.3.串的快链存储表示 3.串的模式匹

没为类型 Node 定义方法 getTextContent (zz)

没有为类型 Node 定义方法 getTextContent (zz) 晚上下班的时候,把班上写了半截的代码带了回来.结果回到家后出乎意料的是回来的时候将代码导入eclipse后,下面这行代码就直接报错了,显示 getTextContent()未定义 . ((Element) ele.getElementsByTagName( "err_code").item(0 )).getTextContent(); 首先想到的是jdk 的版本问题,不可能啊,我昨天才装的jdk 1.6.0_24

记录类型的定义和应用

1.记录类型的定义 type info = record name :string; age    :integer; addr  :string; end; 2.记录类型应用 procedure TForm1.Button1Click(Sender: TObject);type  myinfo = record  name : string;  age  : Integer;  addr : string;end;var  info : myinfo;begin  info.name:='lo

enum枚举类型的定义

enum枚举类型的定义方式与某种用法 #include <iostream> using namespace std; int main() { enum TOT{ zero, one, two, three, four, five };//0,1,2,3,4,5 TOT to1; to1 = five; switch (to1) { case 0:cout << "zero\n"; break; case 1:cout << "one\n

cocos2dx -- 错误笔记(3)class类型重定义

发生这个错误之后,百度之 发现原因是因为: “class”类型重定义  : 一般都是头文件重复include引起的. 比较之后发现: .h 文件中 缺少了   #pragma once 加入之后问题解决!

子界类型的定义和应用

引用: 如果我们定义一个integer类型,他的范围-2147483648...2147483647之间,事实上一个程序的变量都是有一定范围的:如人的年龄0到130岁,身高0到3米: 假如我们能在程序中规定变量的值域在一定范围内,那我们就可以很快检查出那些数据是不合法的,并能使程序在正确运行时节省很多不必要的空间: 1.子界类型的定义:TYPE 子界类型标识符 = 下界..上界;(常量A..常量B);  //上下边界必须是同一类型的,且上界必须大于下界的序号

sockaddr struct 类型重定义

windows.h和winsock2.h有类型重定义我是知道的,本来就一个库来说没问题,把winsock2放到windows.h前或先定义WIN32_LEAN_AND_MEAN都能解决问题但现的出了问题,自己写的一个库里要用到ws2tcpip,这个头文件第一个包含的头文件就是winsock2.h把它放到windows前,库是能成功编译了,但当我在一个wxWidgets中调用它时,又出现那个让人厌烦的错误 ““sockaddr”: “struct”类型重定义”明显是wxWidgets先包含了win

物料类型AM11没有任务清单类型N定义

CA01 创建工艺路线时报错信息:“物料类型AM11没有为任务清单类型N定义” (如下图) 处理方法: 配置路径:生产->基本数据->工艺路线->通用数据->定义物料类型分配 事务代码:OP50

c#中枚举类型的定义与使用

介绍枚举是一个指定的常数,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举.定义默认基数从O开始,也可指定数值. enum Days { Saturday=1, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday }; enum Colors { Red = 1, Green = 2, Blue = 4, Yellow = 8 }; 使用