IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 2021-09-27 -> 正文阅读

[数据结构与算法]2021-09-27

数据结构——串(c)

一、串的定义及基本运算

串(或字符串) :是由零个或多个字符组成的有序序列。
一般记为 s = ′ a 1 a 2 . . . a n ′ s='\displaystyle a_1\displaystyle a_2 ... \displaystyle a_n' s=a1?a2?...an? (n≧0)

  1. 串名:s是串的名。
  2. 串值:用单引号括起来的字符序列。
  3. 长度:串中字符的数目n。
  4. 空串:零个字符的串。
  5. 子串:串中任意个连续的字符组成的子序列。
    :空串是任意串的子串,任意串是其自身的子串。
  6. 主串:包含子串的串相应的被称为主串。(在串中的位置则以子串的第一个字符的位置来表示)
  7. 空格串:由一个或多个空格组成的串 ‘ ’ 。
  8. 用 “Ф” 来表示空串
  9. 通常称字符在序列中的序号为该字符在串中的位置
  10. 当且仅当两个串的值相等时,称这两个串是相等的

二、串的基本实现

1.串的定长顺序存储表示及相关函数

#define MaxStrLen 255 //最大串长
typedef struct{
    char ch[MaxStrLen];
    int length;
}SString;

void StrAssign(SString *T, char str[]);//串的生成
void StrCopy(SString *T, SString *S);//串的复制
bool StrEmpty(SString *T);//判定串是否为空
int StrCompare(SString *T, SString *S);//串比较
int StrLength(SString *T);//求串长
void ClearString(SString *T);//将T清空为空串
bool Concat(SString *Str, SString *T, SString *S);//串联接
bool SubString(SString *Str, SString *T, int pos, int len);//求子串
int Index(SString Str, SString T, int pos);//子串定位
void StrInsert(SString *T, int pos, SString *S);//字串的插入
void DispStr(SString *T);//输出串
int BFIndex(SString *S, SString *T); //子串定位,BF算法
int KMPIndex(SString *S, SString *T); //子串定位,KMP算法
void GetNext(SString *T, int next[]);

2.串赋值

void StrAssign(SString *T, char str[]){
    int i;
    for(i = 0; str[i]!='\0'; i++){
        T->ch[i] = str[i];
    }
    T->length = i;
}

3.串的复制

void StrCopy(SString *T, SString *S){
    for(int i = 0; i < T->length; i++){
        S->ch[i] = T->ch[i];
    }
    S->length = T->length;
}

4.判断串是否为空串

bool StrEmpty(SString *T){
    if(T->length == 0) return true;
    else return false;
}

5.串比较

int StrCompare(SString *T, SString *S){
    if(T->length > S->length)
        return 1;
    else if(T->length == S->length)
        return 0;
    else return -1;
}

6.求串长

int StrLength(SString *T){
    return T->length;
}

7.将串清空

void ClearString(SString *T){
    for(int i = 0; i < T->length; i++){
        T->ch[i] = '\0';
    }
    T->length=0;
}

8.串联结

bool Concat(SString *Str, SString *T, SString *S){
    int i, j;
    if(T->length + S->length <= MaxStrLen){
        for(i = 0; i < T->length; i++){
            Str->ch[i] = T->ch[i];
        }
        for(j = 0; i < T->length + S->length; i++, j++){
            Str->ch[i] = S->ch[j];
        }
        return true;
    }
    else if(T->length < MaxStrLen){
        for(i = 0; i < T->length; i++){
            Str->ch[i] = T->ch[i];
        }
        for(j = 0; i < MaxStrLen; i++, j++){
            Str->ch[i] = S->ch[j];
        }
        return false;
    }
    else{
        for(i = 0; i < MaxStrLen; i++){
            Str->ch[i] = T->ch[i];
        }
        return false;
    }
}

9.求子串

bool SubString(SString *Str, SString *T, int pos, int len){
    int i, k;
    Str->length = 0;
    if(pos < 1 || pos > T->length || len < 0 || len > T->length-pos+1){
        return false;
    }
    for(i = 0, k = pos-1; k < pos + len -1; k++, i++){
        Str->ch[i] = T->ch[k];
    }
    Str->length = i;
    return true;
}

10.子串的插入

void StrInsert(SString *T, int pos, SString *S){
    if(pos <= 0 || pos > T->length+1){
        printf("位置不合理!");
        return;
    }

    int i, j;
    SString temp;
    if(T->length + S->length <= MaxStrLen){
        for(i = pos-1, j= 0; i < T->length; i++, j++){
            temp.ch[j] = T->ch[i];
            temp.length++;
        }
        for(i = pos-1, j= 0; j < S->length; i++, j++){
            T->ch[i] = S->ch[j];
            T->length++;
        }
        for(j = 0; j < temp.length; i++, j++){
            T->ch[i] = temp.ch[j];
        }
    }
    else{
        printf("插入失败!");
        return;
    }
}

11.输出串

void DispStr(SString *T){
    if(T->length > 0){
        for(int i = 0; i < T->length; i++){
            printf("%c", T->ch[i]);
        }
    }
    else
        printf("字符串为空!");
}

12.子串定位——BF算法
下详述
13.子串定位——KMP算法
下详述

三、串的模式匹配算法

1.朴素的串匹配算法(基本的模式匹配算法)Brute-Force

代码如下(示例):

int BFIndex(SString *S, SString *T){
    int i = 0, j = 0; 
    while(i < S->length && j < T->length){
        if(S->ch[i] == T->ch[j]){
            i++;
            j++;
        }
        else{
            j = 0;
            i = i - j + 1;
        }
    }
    if(j >= T->length) //匹配成功
        return i-T->length;
    else return -1; //匹配失败
}

2.改进的模式匹配算法(KMP算法)

1.获取next数组

在这里插入代码片void GetNext(SString *T, int next[]){
    int j = 0, k = -1;
    next[0] = -1;
    while(j < T->length - 1){
        if(k == -1 || T->ch[j] == T->ch[k]){
            j++;
            k++;
            next[j] = k;
        }
        else
            k = next[k];
    }
}

2.KMP算法

int KMPIndex(SString *S, SString *T){
    int next[MaxStrLen], i = 0, j = 0;
    GetNext(T, next);
    while (i < S->length && j < T->length){
        if(j == -1 || S->ch[i] == T->ch[j]){
            i++;
            j++;
        }
        else
            j = next[j];
    }
    if(j >= T->length)
        return i - T->length;
    else
        return -1;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-25 12:43:47  更:2021-10-25 12:45:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:29:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码