数据结构学习第三弹 串(1)

作者: Richie_ll | 来源:发表于2016-07-26 20:16 被阅读73次

字符串(简称串)是一种特殊的线性表,对于计算机来说,处理的非数值对象就是字符串,在最初的时候,字符串一般是作为输入或输出的直接量出现的,并不对它进行直接操作,慢慢随着计算机的发展,串也成为了一个变量参与了运算。

串的基本概念

  • 串是零个或多个字符组成的有限序列,一般记作:
    • S = "a1a2a3...an";
  • 空串和空白串
    • 长度为零的串被称为空串,不含有任何字符
    • 仅有一个或多个空格组成的字符串称为空白串
  • 子串和主串
    • 子串可以说是主串的子序列
    • 子串的位置:子串的第一个字符在主串中的序号称为子串的位置
  • 串变量和串常量
    • 顾名思义串变量跟变量是一样的,而常量是不可改变的量

串的基本运算

其实在很多高级语言里面均提供了相应的运算符或标准的库函数来实现下面就描述下C语言的< string.h >库中的一些常用的库函数(自己尝试实现的)

//求串长
int strlen(char *s)
{
    //思路是找到字符串的结尾‘\0’就是他的长度了
    //但其实源码的方法更高效
    int length = 0
    while (*s++)
        length++;
    return length;
}
//串复制
char *strcpy(char *dest,const char * source)
{
    char *r = dest;
    //检查指针是否有效
    assert((dest!=NULL) && (source!=NULL));
    //实行串复制
    while(*dest!='\0' && *source!='\0')
        *dest++ = *source++;
    return r;
}
//串联接
char *strcat(char *dest,const char *source)
{
    char *r = dest;
    //检查指针是否有效
    assert((dest!=NULL) && (source!=NULL));
    //将指针移到目标字符串的结尾处
    while(*dest)
        *dest++;
    //进行拼接操作
    while(*source)
        *dest++ = *source++;
    return r;
}
//字符串大小比较
//即两个字符串自左向右逐个(按ANSCII码大小进行比较)
//直到遇见零或‘\0’时比较结束
int strcmp(const char *str1,const char *str2)
{
    //str1 = str2 返回零
    //str1 < str2 返回一个小于零的数
    //str1 > str1 返回一个大于零的数
    while(*str1 == *str2)
    {
        if(*str1 == '\0')
            return 0;
        str1++;
        str2++;
    }
    return *str1-*str2;
}

串的存储结构

因为串也是一种特殊的线性表,所以就有串的存储结构也有顺序存储结构和链式存储结构

串的顺序存储

串的顺序存储简称顺序串,与顺序表类似,是用一组连续的存储单元来存储串中的字符序列,所以一般就是用字符数组来实现,但是对于不同存储分配方式来说,可以分为

  • 静态存储分配的顺序串
  • 动态存储分配的顺序串

定义描述:

静态存储分配的顺序串:

//直接使用定长的数组来进行描述
#define MAXSIZE 200
char s[200]//可容纳199个字符的顺序串

//类似于顺序表的定义
typedef struct
{
    char s[MAXSIZE];
    int length;
}SeqString;

动态存储分配的顺序串:

动态存储分配的顺序串一般来说不用考虑串长,用malloc()和free()来分配和释放空间

//简单的定义
char *s;
//类似顺序表的定义
typedef struct
{
    char *s;
    int length;
}SeqString;

串的链式存储结构

用单链表的方式存储串值被称为链串
链串与单链表的相比较而言,链串结点的数据域可以选择是存储单字符还是多个字符,通常结点大,存储密度就高,但带来的是处理效率的降低,而结点小,存储密度就低,但是处理效率会高很多,虽然串的链式存储结构对于某些串运算(像连接运算或插入运算有一定的方便之处),但是还是不如顺序串灵活

相关文章

  • 数据结构学习第三弹 串(1)

    字符串(简称串)是一种特殊的线性表,对于计算机来说,处理的非数值对象就是字符串,在最初的时候,字符串一般是作为输入...

  • 数据结构学习第三弹 串(2) 匹配模式

    串的模式匹配 串的模式匹配也可以说子串的定位,是一种重要的串运算。所谓模式匹配就是给定两个串s1和s2,在主串s1...

  • 04 - 串

    数据结构和算法学习汇总[https://www.jianshu.com/p/72b20d1e06e6] 串是字符串...

  • redis 学习整理

    本文是《redis设计与实现》的学习整理。 1 基础数据结构 1.1 字符串 1.2 链表 1.3 哈希表 1.4...

  • Redis专题

    1 数据结构与对象 1.Redis数据结构与对象——简单动态字符串2.Redis数据结构与对象——哈希3.Redi...

  • python常见数据结构全攻略

    常见数据结构 一、String(字符串) 1、基本使用 创建字符串 创建字符串 str1=str("lucky i...

  • 深入理解redis之基本数据结构

    本文是对redis系统中用到的基本数据结构的梳理 1.sds 字符串 redis 中字符串数据结构如下 可以看到,...

  • 面试题2

    四、数据结构和算法 1、求一串数字序列中的连续子串最大和,比如arr=1 -2 3 -1 2,连续子串最大和就是3...

  • 2、数据结构

    String 一:数据结构 1、数据结构:字符数组,可以修改的动态字符串,bitmap(位图) 2、扩容:最大51...

  • 最全的 Redis 数据类型解析!

    1. String(字符串) 1.1 简单介绍 字符串类型是Redis最基础的数据结构,字符串类型可以是JSON、...

网友评论

本文标题:数据结构学习第三弹 串(1)

本文链接:https://www.haomeiwen.com/subject/rpznjttx.html