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

前言:

  计算机上的应用程序几乎都是以字符串数据作为处理对象,然而,现今我们使用的计算机的硬件结构主要是反映数值计算的需要的,因此,在处理字符串数据时比处理整数和浮点数要复杂得多。而且,在不同类型的应用中,所处理的字符串具有不同的特点,要有效地实现字符串的处理,就必须根据具体情况使用合适的存储结构。这一章,我们将讨论一些基本的串处理操作 和 几种不同的存储结构。

目录:

  1.串类型的定义

  2.串的表示和实现

    2.1.定长顺序存储表示

    2.2.堆分配存储表示

    2.3.串的快链存储表示

  3.串的模式匹配算法

  4.串操作应用剧烈

正文:

  串类型的定义

  串(string)(或字符串)是由 零个或多个字符 组成的有限序列,一般记为:

      s=‘ a1a2...an ‘

  注意:由一个或多个空格组成的串,称为空格串。而不是空串。

    

    串 和 字符序列(char * =‘hello‘)的区别:

      串是一种数据结构,是字符的集合,实现并提供对这种集合操作的各种方法。

      char 是c 的一种基本数据类型,没有已实现的对字符序列的复杂操作。

  串的逻辑结构和线性表极为相似,区别在于:

    1.串的数据对象约束为字符集。

    2.在线性表的基本操作中,以“单个数据元素” 为操作对象。 在串中 以 “串的整体” 作为操作对象,例如:查找子串、插入及删除子串。

  串的表示及实现

    串有3种机内表示方法:

    1.定长顺序存储 表示

      类似于线性表的顺序存储结构,用一组地址连续的存储单元存储串值的字符序列。在串的定长顺序存储结构中,按照预定义的大小,为每个定义的串变量分配一个固定长度的存储区,则可用定长数组如下描述之。

      存储表示:

        #define MAXSTRLEN 255                 //定义最大串长

        typedef  unsigned char SString [MAXSTRLEN +1];    //0单元存放串的长度

      串的实际长度可在这预定义长度的范围内随意, 超出的部分被舍弃,称之为 “截断” 。

      弊端:当合并两个 串的时候,如果长度超过 预定义最大串长MAXSTRLEN ,其它部分将会丢失即 “截断”。

      解决方案:使用不限定串长的最大长度, 即动态分配串值的存储空间。

    2.堆分配存储表示

      特点:仍以一组地址连续的存储单元存放串值字符序列,但它们的存储空间是在程序执行过程中动态分配而得。

      在 C 语言中,存在一个称之为 “堆” 的自由存储区, 并由C 语言的动态分配函数 malloc() 和 free()来管理。利用malloc 函数为每个新产生的串分配一块实际串长所需的存储空间,若分配成功,则返回一个指向起始地址的指针,作为串的基址,同时,为了处理方便,约定串长也作为存储结构的一部分。

      堆分配存储表示:

        typedef struct {

          char *ch;          //若是非空串,则按串长分配存储区,否则 ch 为 NULL

          int  length;         // 串长度

        }HSring;

      代码实现:

#include<stdio.h>
#include<stdlib.h>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2

#define MAXQSIZE 5
//Status是函数的类型,其值是函数结果状态码
typedef int Status;

typedef struct{
    char *ch;                    //若是非空串,则按串长分配存储区,否则 ch 为 NULL
    int length;                    //字符串长度
}HString;

//生成一个其值等于串常量 chars  的串T
Status StrAssign(HString &S,char * chars){
    int i;
    for(i=0;chars[i];i++){}
    //if(S.ch){
    //    free(S.ch);
    //    S.ch=NULL;
    //}
    if(!i){
        S.ch=NULL;
        S.length=0;
    }else{
        S.ch=(char *)malloc(i*sizeof(char));
        if(!S.ch) exit(OVERFLOW);
        S.length=i;
        for(int j=0;j<i;j++)
            S.ch[j]=chars[j];
    }
    return OK;
}

//返回串长度
int StrLength(HString &S){
    return S.length;
}

//比较大小,若 S>T 返回值>0。相等 返回0 ,否则返回 <0
int StrCompare(HString S,HString T){
    for(int i=0;i<S.length&&i<T.length;i++){
        if(S.ch[i]!=T.ch[i])
            return S.ch[i]-T.ch[i];
    }
    return S.length-T.length;
}

//清空串S为空串,并释放所占空间
Status ClearString(HString &S){
    if(S.ch){
        free(S.ch);
        S.ch=NULL;
    }
    S.length=0;
    return OK;
}

//连接两个字符串,生成一个新的字符串
Status Concat(HString &T,HString S1,HString S2){
    //if(T.ch) free(T.ch);
    T.ch=(char *)malloc((S1.length+S2.length)*sizeof(char));
    if(!T.ch) exit(OVERFLOW);
    T.length=S1.length+S2.length;
    for(int i=0;i<S1.length;i++)
        T.ch[i]=S1.ch[i];

    for(i=0;i<S2.length;i++)
        T.ch[i+S1.length]=S2.ch[i];

    return OK;
}

//字符串截取,返回截取的串
Status SubString(HString &sub,HString S,int pos,int len){
    if(pos<1||pos>S.length||len<0||(S.length-pos+1)<len)
        return ERROR;
    //if(sub.ch) free(sub.ch);
    sub.ch=(char *)malloc(len*sizeof(char));
    if(!sub.ch) exit(OVERFLOW);
    for(int i=0;i<len;i++)
        sub.ch[i]=S.ch[i+pos-1];
    sub.length=len;
    return OK;
}

void printV(HString &S){
    for(int i=0;i<S.length;i++){
        printf("地址:%p,",&S.ch[i]);
        printf("值:%c\n",S.ch[i]);
    }
}

void prints(HString &S){
    for(int i=0;i<S.length;i++){
        printf("%c",S.ch[i]);
    }
    printf("%s\n"," ");
}

void main(){
    HString S1;
    char *c="hello";
    StrAssign(S1,c);
    ClearString(S1);
    c="hello";
    StrAssign(S1,c);
    printf("%s","S1:");
    prints(S1);
    printV(S1);

    HString S2;
    c="China";
    StrAssign(S2,c);
    printf("%s","S2:");
    prints(S2);
    printV(S2);

    HString T;
    Concat(T,S1,S2);
    printf("%s","T:");
    prints(T);
    printV(T);

    HString sub;
    SubString(sub,T,6,5);
    printf("%s","sub:");
    prints(sub);
    printV(sub);
}

      运行结果:

            

时间: 2024-10-23 17:23:14

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

《Python 学习手册4th》 第四章 介绍Python对象类型

''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容(每天看42页内容,可以保证月底看完此书) ''' 摘要 Python程序可以分解成模块.语句.表达式和对象: 程序由模块构成: 模块包含语句: 语句包含表达式: 表达式建立并处理对象. 一. 为什么使用内置类型  #了解即可 内置对象使程序更容易编写 内置对象是扩展的组件 内置对象往往比定制的数据结构更高效 内置对象是语言的标准的一部分 二. Py

JAVA-初步认识-第四章-函数-细节-错误格式\定义思想错误

一. 从函数的功能三来看,(无输入,无输出),当很多次输出时,我们将其功能函数化,可以提高代码的复用性. 当一句代码重复使用两次以上时,就要考虑提高复用性. 二. 函数的好处 重点:封装+复用 函数的级别是同一级别的,在类中地位相同. 注意:返回调用时重点,没看懂 封装的时候,功能个数有限制.加法是个功能,输出也是个功能.应该封装一个功能. 这里为什么会有void关键字,这不是有返回值么?→错了,这不是返回值,这是加法+输出的功能化函数.核心在输出上,所以用void的来作为add的关键字,而不是

JAVA-初步认识-第十四章-多线程-停止线程方式-定义标记

一. 线程既然开启了,运行了,冻结又恢复运行了,那什么时候消亡呢? 怎么来停止线程呢?不能一直在运行. 线程怎么停,线程自己最清楚.在Thread类中,提供了stop方法, 本来线程持有一个锁,只要stop,它就什么都在放,这是强制操作,无论出于什么状态,强制将其搞定.本来wait,这那儿的,stop一下子就没了. stop方法做的不是状态切换了,而是消失. 线程停止,其实只有一种,就是run方法结束. 线程一旦没有自己运行的代码了,任务没有了,线程自动就结束了.可是线程的任务怎么能没有呢? 标

第四章 数值和字符串类型

@数值和字符串 python的数据类型体现在数据上,数据是什么类型,他就是什么类型. 数值 数值分为整数(int),浮点数(float)以及decimal和fraction 变量引用: 表达式,有加减乘除. 可以用占位符传递数据:(浮点型显示并保留两位小数) 用于比较: 在数值中,我们有一个内置的math函数可以直接导入引用. math.floor() 在横坐标中往左移: math.ceil() 在横坐标中往右移 math.trunc() 在横左边中往0移 round()四舍五入法. 数值可以转

语法》第四章 字符串

(本文为阮一峰js标准教程的学习笔记,旨在总结该教程中涉及的知识点大纲及个人所做的一些拓展,方便作为"目录"或者"大纲"复习和查漏补缺,详细内容请参见阮一峰教程原文) 第二部分 语法 *************第四章 字符串*************** 一.概述1.定义:零个或者多个字符,放在单引或双引之中.2.单引套双引,双引套单引.3.单套单,双套双,前面加斜杠转义.'\' xxxxx\''4.js字符串建议单引,因为html属性是双引,不要各种风格代码混写.

Python核心编程笔记——第四章

第四章 Python对象 1.类型也是对象: a = 4;type(a)-><type 'int'>,这里"<type 'int'>"是一个类型对象(可以赋值给一个变量),可以使用 type(type(a)) 来验证 2.Python2.2开始,类和类型统一,类=类型,实例是类型的对象 3.任何对象都天生具有布尔值 4.整数对象,字符串对象,元组对象都是不可变对象,Python会高效的缓存整数和字符串对象,所以 a=3;b=1+2;(a is b)会返回T

第四章、队列

第四章.队列 一.定义: 与栈相反,队列是一种先进先出的结构.只允许在表的一端进行插入,在另一端进行删除. 二.数据结构: 1 typedef struct 原文地址:https://www.cnblogs.com/yangsongwei/p/8747026.html

第四章 串和数组 (主要kmp算法)

第四章 题目:串的模式匹配 给定一个主串S(长度<=10^6)和一个模式T(长度<=10^5),要求在主串S中找出与模式T相匹配的子串,返回相匹配的子串中的第一个字符在主串S中出现的位置. (用KMP算法,就是不用再回溯, 最前面的k个字符和j之前的最后k个字符是一样的:P[1~ k] == P[j-k ~ j-1]) 1.先定义一个串的顺序存储结构,因为不需要出插入和删除操作,所以选用了顺序存储 typedef struct { char ch[maxlen + 2]; int length

C语言数据结构——第四章 串

四.串 4.1-串的基本概念 串的定义 串是由数字.字母或其他字符组成的有限序列,一般记为 StringName = “a[0]a[1]a[2]···a[i]···a[n-1]”(n>0,0<=i<=n-1) 其中StringName是串名,双引号内的序列是该串的值,n为串的长度,i为某一字符在该串中的下标 串的常用术语 串的长度:串中包含字符个数即为串的长度 空串:串中不包含任何字符时被称为空串,此时串的长度为0 空格串:由一个或多个空格组成的串被称为空格串,它的长度是串中空格的个数