[数据结构]线性结构——串

原创 2015年07月08日 20:32:09

在非数值处理、事务处理等问题常涉及到一系列的字符操作。计算机的硬件结构主要是反映数值计算的要求,因此,字符串的处理比具体数值处理复杂。

串类型的定义

串的基本概念

  • 串(字符串):是零个或多个字符组成的有限序列。记作: 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。
              操作结果:用sub返回串s的第pos个字符起长度为len 的子串。
        ......
}

串的存储表示和实现

串是一种特殊的线性表,其存储表示和线性表类似但又不完全相同。串的存储方式取决于将要对串所进行的操作。串在计算机中有3种表示方式:

  • 定长顺序存储方式:将串定义成字符数组,利用 串名可以直接访问串值。用这种表示方式,串的存 储空间在编译时确定,其大小不能改变。
  • 堆分配存储方式:仍然用一组地址连续的存储单 元来依次存储串中的字符序列,但串的存储空间是 在程序运行时根据串的实际长度动态分配的。
  • 块链存储方式:是一种链式存储结构表示。

串的定长顺序存储表示

这种存储结构又称为串的顺序存储结构。是用一组连续的存储单元来存放串中的字符序列。所谓定长顺序存储结构,是直接使用定长的字符数组来定义,数组的上界预先确定。

//定长顺序存储结构定义为:
#define MAX_STRLEN 256 
typedef struct
{ 
    char str[MAX_STRLEN] ; 
    int length;
} StringType ;

//串的联结操作
Status StrConcat ( StringType s, StringType t)
/* 将串t联结到串s之后,结果仍然保存在s中 */ 
{ 
    int i, j ;
    if ((s.length+t.length)>MAX_STRLEN) 
        Return ERROR ; /* 联结后长度超出范围 */
    for (i=0 ; i<t.length ; i++) 
        s.str[s.length+i]=t.str[i] ; /* 串t联结到串s之后 */ 
    s.length=s.length+t.length; /*修改联结后的串长度 */ 
    return OK ;
}

//求子串操作
Status SubString (StringType s, int pos, int len, StringType *sub) 
{ 
    int k, j ;
    if (pos<1||pos>s.length||len<0||len>(s. length-pos+1))
        return ERROR ; /* 参数非法 */ 
    sub->length=len-pos+1 ; /* 求得子串长度 */
    for (j=0, k=pos ; k<=leng ; k++, j++)
        sub->str[j]=s.str[i] ; /* 逐个字符复制求得子串 */
    return OK ;
}

串的堆分配存储表示

实现方法:系统提供一个空间足够大且地址连续的存储空间(称为“堆”)供串使用。可使用C语言的动态存储分配函数malloc()和free()来管理。
 特点是:仍然以一组地址连续的存储空间来存储字符串值,但其所需的存储空间是在程序执行过程中动态分配,故是动态的,变长的

//串的堆式存储结构的类型定义
typedef struct
{ 
    char *ch; /* 若非空,按长度分配,否则为NULL */
    int length; /* 串的长度 */ 
} HString ;

//串的联结操作
Status Hstring *StrConcat(HString *T, HString *s1, HString *s2)
/* 用T返回由s1和s2联结而成的串 */
{
    int k, j , t_len ;
    if (T.ch) 
        free(T); /* 释放旧空间 */ 
    t_len=s1->length+s2->length ;
    if ((p=(char *)malloc(sizeof((char)*t_len))==NUL L)
    { 
        printf(“系统空间不够,申请空间失败 ! \n”) ;
        return ERROR ; 
    }
    for (k=s1->length, j=0 ; j<s2->length; k++, j++)
        T->ch[j]=s1->ch[j] ; <span style="font-size:14px;">/* 将串s2复制到</span>串T中 */
    free(s1->ch) ; 
    free(s2->ch) ; 
    return OK ;
}

串的链式存储表示

串的链式存储结构和线性表的串的链式存储结构类似,采用单链表来存储串,结点的构成是:

  • data域:存放字符,data域可存放的字符个数称为结点的大小;
  • next域:存放指向下一结点的指针。

若每个结点仅存放一个字符,则结点的指针域就非常多,造成系统空间浪费,为节省存储空间,考虑串结构的特殊性,使每个结点存放若干个字符,这种结构称为块链结构

串的块链式存储的类型定义包括:

//(1) 块结点的类型定义
#define BLOCK_SIZE 4
typedef struct Blstrtype
{ 
    char data[BLOCK_SIZE] ; 
    struct Blstrtype *next;
}BNODE ;

//(2) 块链串的类型定义 
typedef struct
{ 
    BNODE head; /* 头指针 */ 
    int Strlen ; /* 当前长度 */
}Blstring ;
在这种存储结构下,结点的分配总是完整的结点为单位,因此,为使一个串能存放在整数个结点中,在串的末尾填上不属于串值的特殊字符,以表示串的终结。
当一个块(结点)内存放多个字符时,往往会使操作过程变得较为复杂,如在串中插入或删除字符操作时通 常需要在块间移动字符。

版权声明:本文为博主原创文章,未经博主允许不得转载。

【数据结构】串的基本操作

串的基本操作.cpp #include using namespace std; typedef int Status; #define Max 20 #define OK 1 #define E...
  • qq_32353771
  • qq_32353771
  • 2015年11月10日 15:10
  • 5187

数据结构学习(十)——串的操作

几天没看数据结构了,今天重新开始了。     串是一种特殊的线性表,它的每个结点是一个字符,所以串也称作字符串。     关于串的操作主要有求串长,串复制,串连接,求子串,串插入,串删除,子串定位...
  • abclixu123
  • abclixu123
  • 2012年12月04日 21:09
  • 4112

数据结构(C实现)------- 串

字符串(简称串),可以将其看作是种特殊的线性表,其特殊性在于线性表的数据元素的类型总是字符性,字符串的数据对象红豆为字符集。     串是由0个或多个字符组成的有限序列。一般记作:s = "s1 s2...
  • jesson20121020
  • jesson20121020
  • 2014年09月23日 00:59
  • 2789

数据结构简介与特点

数据结构简介与特点线性表 顺序表 单链表 循环链表 双向循环链表 静态链表 栈 顺序栈 链栈 队列 顺序队列 链队列 循环队列 串 串的定长存储 串的堆分配存储 串的块链存储 树 树的双亲表示法 树的...
  • NGUever15
  • NGUever15
  • 2017年05月18日 17:38
  • 371

常用数据结构--线性结构

数据结构是计算机存储、组织数据的方式。常见的数据结构分类方式如下图: 常用的线性结构有:线性表,栈,队列,循环队列,数组。线性表中包括顺序表、链表等,其中,栈和队列只是属于逻辑上的概念,实际...
  • StubbornPotatoes
  • StubbornPotatoes
  • 2012年04月27日 00:20
  • 16363

数据结构里的串是什么东西?(其实串就是指字符串)

早先的计算机在被发明时,主要作用是做一些科学和工程的计算工作,也就是现在我们理解的计算器,只不过它比小小计算器功能更强大、速度更快一些。后来发现,在计算机上作非数值处理的工作越来越多,使得我们不得不需...
  • qq_15037231
  • qq_15037231
  • 2016年08月13日 21:40
  • 1389

数据结构 - 串的存储表示和实现

串的基本概念字符串:应用在非数值处理、事务处理等领域。 计算机的硬件:主要是反映数值计算的要求。 字符串的处理比具体数值处理复杂。 串(字符串):是零...
  • wangzi11322
  • wangzi11322
  • 2015年04月29日 10:04
  • 1754

数据结构---串的模式匹配算法介绍

前言 The years teach much which the days never knew. Time:2017/2/19 Name:Willam 1、介绍 对于文本程序来说...
  • qq_35644234
  • qq_35644234
  • 2017年02月21日 19:26
  • 2034

以下数据结构中,()是非线性数据结构

以下数据结构中,()是非线性数据结构A:树(二叉树) B:字符串 C:队列 D:栈 E:线性表 F:二维数组 G:多维数组数据的逻辑结构分为线性结构和非线性结构。 常用的线性结构有:线性...
  • tzs_1041218129
  • tzs_1041218129
  • 2016年08月25日 09:07
  • 1587

数据结构—顺序串

/* 编写一个程序,实现顺序串的各种基本运算,并完成如下功能: (1)建立串:s="abcdefghefghijklmn"和串s1="xyz"; (2)输出串s; (3)输出串的长度; (4)在串的第...
  • LY_624
  • LY_624
  • 2016年04月17日 17:23
  • 460
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[数据结构]线性结构——串
举报原因:
原因补充:

(最多只允许输入30个字)